: 지금까지는 한 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에서 여러가지 타입, 개수를 받는 개념
: 다형성은 하나의 함수이지만, 매개변수의 개수, 타입에 따라 같은 이름으로 여러 함수를 구현(여기서 구현안된 형식은 인식못함)
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 3-6-1강. 여러가지 closure (0) | 2019.10.27 |
---|---|
프로그래밍 언어론 3-6강. Referencing Enviroment에 대한 바인딩 (0) | 2019.10.27 |
프로그래밍 언어론 3-4강. 스코프 구현(Implementing Scope) (0) | 2019.10.26 |
프로그래밍 언어론 3-3-6강. 동적 스코프(Dynamic Scoping) (0) | 2019.10.26 |
프로그래밍 언어론 3-3-5강. 모듈 타입과 클래스 (0) | 2019.10.26 |