프로그래밍 언어론 3-5강. 다중 지정(aliases와 overloading)

[프로그래밍 언어론]

2019. 10. 26. 14:36

 

: 지금까지는 한 name에 한 object 매핑되는 상황만 가정했음.

 

[Aliases]

: 두개이상의 name이 같은 시전에서 같은 object를 가르키는 상황

 

# aliases 예시 1

typeof union {   //c,c++ 명령어
  int num1;
  int num2;
  double num3;
  } Ubox;        // Ubox라는 이름의 union 타입
  
  // ubox가 사용될때 내부에 있는 변수중 하나만 사용한다.
  // 여기서 3개의 변수에 각각의 메모리 공간 할당하기에 아까우니 위와 같이 사용
  // = 3개의 변수에 한 메모리 공간 부여

# aliases 예시 2

double num;
...
void func(double& x) {...}
func(num);        // call by reference

// double num에 메모리 공간 할당된 상태에서 func에서 call by reference를 실행
// x는 지정된 변수(num)을 가르키는 레퍼런스
// 즉, num과 x는 같은 메모리공간 가르키고 있다.

 

 

 

[오버로딩(Overloading)]

: 한 name이 여러 object를 가르키는 상황 (aliase와 반대)

: 대부분의 언어들이 어떤 형태로든 오버로딩 제공하고 있다.

(여기서 오버로딩은 특정 name-to-object 바인딩 존재하는데 같은 name에 다른 binding하는 경우를 의미한다)

 

 

 

[여러 언어에서의 오버로딩]

# C에서의 오버로딩

  : C는 오버로딩 없어보이지만, '+' 이용한 오버로딩형태 제공한다.

  ex. 산술계산 3+4; 는 name에저장되있는 3에 '+'이용해 7로 오버로딩

 

# Ada에서의 오버로딩 

type month is (jan. feb ... oct, nov ...)

type print_base is (dec, bin, oct, hex)

...

mo := nov;   // 정상

pb := oct;    // 정상(?)

print(oct);    // 오류발생(어떤 oct의미하는 알수 없음)

 

print(month'(oct))  // 형태로 해결

 

# Modula-3, C#에서의 오버로딩

: 타입명.변수명 식으로 사용가능

: 하지만 같은 타입(ex. enum)과 인자에 중복되지만 다른 이름으로 붙여서 사용 불가능

typeof enum { SUNDAY, MONDAY } DAYS;
typeof enum { SUNDAY, MONDAY } DAY2S;  // 불가능

 

# C++11에서의 오버로딩

: 위와 같은 문제 해결 => 클래스로 해결

enum class DAYS { SUNDAY, MONDAY };  //DAYS::SUNDAY 형태로 사용
enum class DAYS@ {SUNDOAy...);

 

 

 

[Built-in operator 재정의]

: 수많은 언어에서 산술 연산자(+,-,/,*등)과 같은 built-in 연산자의 오버로딩을 지원한다.

 

# Ada, C++, C#

: built-in에서 제공하는 연산자의 형태는 prefix 방식이지만, 언어에서 오버로딩해서 infix 방식 지원 => 사용자 편의고려

# C#, C++에서 operator+ 메소드

: 산술연산자 재정의하면 operator+(A,B)나 A.operator+(B)와 같이 사용되어야 하지만, A+B 같은 형태로 사용 가능.

# Haskell의 @@연산자

: 자체적으로 제공

: let a@@b, let (@@) a b = a * 2 + b 

 

 

 

[오버로딩과 관련된 개념]

1. Coercion : 자동형변환 (자동으로 값의 타입을 다른 타입으로 컴파일러가 변환)

  ex) int a = 3.5;  -> a=3

2. Polymorphism : 다형성 (다양한 매개변수 개수, 타입들을 하나의 함수 이름에서 처리하는 방법)

  ex) to_string, print 함수

 

 

 

[오버로딩과 다형성의 차이점]

: 오버로딩은 하나의 구현된 name에서 여러가지 타입, 개수를 받는 개념

: 다형성은 하나의 함수이지만, 매개변수의 개수, 타입에 따라 같은 이름으로 여러 함수를 구현(여기서 구현안된 형식은 인식못함)