오브젝트 12장 다형성

카일·2020년 3월 2일
0

Objects 오브젝트

목록 보기
11/11
post-thumbnail

다형성의 분류

다형성

  • 유니버설
    • 매개변수
    • 포함
  • 임시
    • 오버로딩
    • 강제

이 장에서는 포함다형성에 대해서 주로 다룰 것이며 일반적으로 흔히 말하는 다형성은 포함다형성을 의미한다. 포함 다형성을 구현하는 가장 보편화된 방법은 상속인데 상속을 통해 자식과 부모를 대체할 수 있는 서브타입의 형태로 만드는 것이 포함다형성을 이용할 수 있는 방법이다. 즉 앞장에서 재활용 을 위한 상속이 아니라 서브타입 을 만듦으로서 다형성을 사용하고자 하는 것이 상속에 있어서도 본질적 이유이다. 타입 계층을 기반으로 한 다형성.

상속의 양면성

상속의 목적은 코드 재사용이 아니다. 상속은 프로그램을 구성하는 개념들을 기반으로 다형성을 가능하게 하는 타입 계층을 구축하기 위한 것이다. 단순히 재활용을 목적으로하는 상속은 유지보수에 큰 어려움을 야기할 확률이 높다. 이러한 문제를 피할 수 있는 방법은 상속이 무엇이고 언제 사용하는지를 이해하는 것이다. 상속의 메커니즘을 이해하는 데 필요한 개념

  • 업 캐스팅
    • 부모 클래스 타입으로 선언된 변수에 자식 클래스의 인스턴스를 할당하는 것이 가능하다. 이를 업캐스팅이라고 한다.
    • 업캐스팅을 통해 미래의 자식 클래스들도 협력에 참여할 수 있다.
  • 동적 메서드 탐색
    • 메서드 탐색과 메서드 호출은 의미가 명확하게 다르다.
    • 메서드 호출은 그 메서드를 실행해 달라는 의미이며
    • 메서드 탐색은 그 메서드로 부터 메세지를 이해할 수 있는 상위 개념에게 까지 메세지를 보내는 것을 포함한다.
  • 동적 바인딩
    • 선언된 변수의 타입이 아니라 메세지를 수신하는 객체의 타입에 따라 실행되는 메서드가 결정된다. 이것은 객체지향시스템이 메세지를 처리할 적절한 메서드를 컴파일 시점이 아니라 실행 시점에 결정하기 때문에 가능하다. 이를 동적 바인딩 이라고 한다.
  • self 참조
    • 자기 자신을 의미한다.
    • self 참조가 메세지 탐색을 위한 문맥을 동적으로 결정한다. 업캐스팅과 동적 바인딩이라는 언어적인 특성과 실행 시점에 적절한 메서드를 선택하는 동적 메서드 탐색을 혼합해서 동일한 코드를 이요해 서로 다른 메서드를 실행하는 것이 가능해진다. 객체지향 프로그래밍 언어는 이와 같은 메커니즘의 도움을 받아 동일한 메세지에 대해 서로 다른 메서드를 실행할 수 있는 다형성을 구현하는 것이다.
    • 동적 : self 참조는 수신한 객체의 클래스에 따라 메서드 탐색을 위한 문맥을 실행 시점에 결정한다. self의 이런 특징과 대비해서 언급할 만한 가치가 있는 것이 바로 super참조이다.
  • super 참조
    • 자식 클래스에서 부모 클래스의 구현을 재사용해야 하는 경우가 있다. 대부분의 객체지향 언어들은 자식 클래스에서 부모 클래스의 인스턴스 변수나 메서드에 접근하기 위해 사용할 수 있는 super 참조라는 내부 변수를 제공한다.
    • 지금 이 클래스의 부모 클래스에서부터 메서드 탐색을 시작하세요. 라는 의미이다. (아래의 참고 확인)
    • 정적 : 컴파일 타임에 자신의 부모를 지정함으로써 결정한다.

다형성

다형성은 결국 self 참조와 super 참조의 형태로 동적 메서드 탐색을 가능하게 하는 메커니즘이 내부에 존재하기 때문에 가능하다. 가리키고 있는 것을 기준으로 동적 메서드 탐색이 이루어지고 메서드가 결정되면 동적 바인딩 및 업캐스팅을 통해 실제로 전달되는 타입을 런타임시에 변경할 수 있는 것이다. 언어마다 구현하는 방법은 다르고 상속이 아닌 위임을 통해서도 그리고 다른 방법을 통해서도 이러한 다형성은 구현할 수 있지만 궁극적으로 내부의 동작방식은 위와 같다는 부분을 아는 것이 핵심이다.

참고

함수나 프로시저를 호출하는 것이 아니라 메세지를 보내는 것이다. 호출한다는 의미는 단순히 어떠한 클래스내에 있는 함수에게 명령을 실행해달라는 의미이지만 메세지를 보내는 것은 메세지를 처리하는 과정에서 자신에게 없다면 상위 개념에게까지 메세지가 전달되는 관점에서 전혀 다른 것이다. 다시 말해 메세지를 보낸다는 것은

0개의 댓글