-
범위 내에서의 바인딩
두 개 이상의 이름이 같은 범위에서 동일한 객체를 가리키는 것을 별칭이라고 한다. 반면에 같은 이름이 해당 범위에서 하나 이상의 객체를 참조하면 오버로딩이라고 한다.
별칭프로그램의 특정 지점에서 두 개 이상의 이름이 동일한 객체를 참조하는 경우.
별칭의 예로 C의 포인터에서 볼 수 있다. 자바의 참조도 내부적으로는 포인터처럼 구현되는데, 여러개의 변수가 동일한 객체의 참조를 가지는 경우 별칭이 생기게 된다. 또다른 경우는 함수에 변수를 참조로 전달하면 함수에서 그 변수를 통해 객체를 직접 접근할 수 도 있다.
int sum; void main(){ ... foo (&sum); ... } void foo(int* x){ (*x)++; sum--; }
이때 x와 sum은 서로 별칭이다.
double sum, sum_of_squares; ... void accumulate(double& x) // sum을 x를 통해 참조형으로 전달 { // sum과 x는 별칭임 sum += x; sum_of_squares += x * x; } ... accumulate(sum);
이 코드는 C++에서 문제가 될 수 있는 별칭의 예이다. 함수 accuculate는 sum에 값을 더하고 sum_of_squares에는 제곱을 더하려는 것인데, sum이 매개변수로 전달되었을 때 sum과 x는 서로 별칭이 되어 이 코드는 프로그래머가 원하는 대로 동작하지 않을 것이다
매개변수에 의한 별칭
c++에서는 포인터와 다르게 참조형 변수를 선언할 수 있다.
참조형은 포인터와 달리 접근할때 *을 붙이지 않고 이름만으로 객체를 접근할 수 있다.
매개변수를 참조형으로 받으면 이름으로 객체를 바로 참조하게 된다.오버로딩
프로그램의 특정 지점에서 같은 이름이 하나 이상의 대상을 참조하는 경우
즉, 한 이름이 여러가지로 쓰이는 것을 말한다.함수 이름의 오버로딩
하나의 함수 이름이 동일한 범위에서 여러 개의 서브 루틴을 참조할 수 있다.
각 서브루틴의 매개변수 갯수나, 타입이 달라야한다.컴파일러가 호출부에 구별이 가능해야 한다.
연산자오버로딩
하나의 연산자를 여러가지 타입에 적용이 가능하다.
자바에서는 기본 연산자 오버로딩으로 + 연산으로 여러가지의 다른 기능을 수행하는 것이 가능하다.i 1 +i2, u1 + u2, 7.1+7.2, “acb”+"def …
컴파일러가 알아서 구분하게 된다.클래스 메소드로 정의된 연산자 오버로딩도 가능하다. String클래스에서 정의된 + 연산이 오버로딩 된다.
파이썬은 클래스에서 정해진 이름의 함수를 통해 연산자 오버로딩을 지원할 수 있다. 이때 대부분 경우 other로 전달된 매개변수는 이 클래스 객체 타입이 될 것이다.
class Lenth: # 길이값과 단위를 가지는 클래스 def __add__(self, other): l = self.Converse2Metres() + other.Converse2Metres() return Length(l / Length.__metric[self.unit], self.unit) ... if __name__ == "__main__": x = Length(4) print(x) y = eval(repr(x)) z = Length(4.5, "yd") + Length(1) # 길이 두 개를 주고 더한다. print(repr(z)) print(z)
빌트인 연산자 오버로딩
Ada, C++, C#과 포트란 90은 빌트인(built-in) 수학 연산자가 사용자 정의 함수로 오버로딩되는 것을 허용한다. Ada, C++, C#은 각 연산자에 대한 별도의 전위 연산자 형식을 정의하므로서 가 능하고 대응하는 중위 연산자 형식은 간략 형태(또는 구문적인 장식, syntactic sugar)으로 C++에 서 A + B는 operator+(A, B)의 간략 형태이다. +가 오버로딩되면 그것은 A와 B의 타입으로부터 어떤 함수인지를 결정할 수 있어야 한다
728x90