ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 범위내 바인딩
    프로그래밍언어론 2023. 4. 12. 04:47

    범위 내에서의 바인딩

    두 개 이상의 이름이 같은 범위에서 동일한 객체를 가리키는 것을 별칭이라고 한다. 반면에 같은 이름이 해당 범위에서 하나 이상의 객체를 참조하면 오버로딩이라고 한다.


    별칭

    프로그램의 특정 지점에서 두 개 이상의 이름이 동일한 객체를 참조하는 경우.

    별칭의 예로 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

    '프로그래밍언어론' 카테고리의 다른 글

    아키텍쳐 - 1  (2) 2023.04.14
    다형성 및 관련  (2) 2023.04.12
    모듈  (0) 2023.04.10
    선언과 정의  (0) 2023.04.09
    범위규칙  (0) 2023.04.09

    댓글

Designed by Tistory.