개발하는 프로 국밥러
article thumbnail

오브젝트

조영호님의 책 오브젝트를 보며 정리한 내용입니다.

문제가 될 시 해당글 삭제하겠습니다.


상속의 목적은 코드 재사용이 아닌, 타입 계층의 구조화를 위해서 사용해야한다.
다형성을 위한 서브타입 계층을 구축하는 것의 진정한 목적을 가지고 있어야만 한다!

 

관점에 따른 상속

  • 데이터 관점의 상속 : 자식 클래스의 인스턴스 안에 부모의 인스턴스를 포함하는 것.
  • 행동 관점의 상속 : 부모 클래스가 정의한 일부 메서드를 자식 클래스의 메서드로 포함하는 것.
    → 런타임에 시스템이 자식 클래스에 정의되지 않은 메서드가 있을 경우, 이 메서드를 부모 메서드에서 탐색한다.
    → 객체의 경우에는 서로 다른 상태를 저장할 수 있도록 인스턴스별로 독립적인 메모리를 할당받아야한다.
    하지만 메서드의 경우에는 동일한 클래스의 인스턴스끼리 공유가 가능하기 때문에, 클래스는 한번만 메모리에
    로드하고 각 인스턴스별로 가리키는 포인터를 갖게 하는 것이 경제적이다.

업캐스팅과 동적 바인딩

  • 업캐스팅 : 부모타입으로 선언된 변수에 자식 클래스의 인스턴스를 할당하는 것이 가능하다.
  • 동적바인딩 : 객체지향 시스템은 메시지를 처리할 적절한 메서드를 컴파일 시점이 아니라 실행 시점에 결정하게 되는데, 이를 통해서 선언된 변수의 타입이 아니라 메시지를 수신하는 객체의 타입에 따라 실행되는 메서드가 결정된다.
  • 객체지향 언어가 제공하는 업캐스팅과 동적 바인딩을 이용하면, 부모 클래스 참조에 대한 메시지 전송을 자식 클래스에 대한 메서드 호출로 변환할 수 있다.

동적 메서드 탐색과 다형성

  • 메서드 탐색은 자식클래스에서 부모클래스로 역방향(자식클래스에 선언된 메서드가 높은 우선순위를 갖는다)으로
    이루어진다.
    → 동적 메서드 탐색은 두 가지 원리로 구성된다.
  1. 자동적인 메시지 위임
  2. 동적인 문맥(동적 바인딩)
  • 이해할 수 없는 메시지
    • 정적 타입 언어와 이해할 수 없는 메시지
      • 정적 타입 언어에서는 코드를 컴파일 할 때 상속 계층 안에 클래스들이 메시지를 이해할 수 없다고 판단하면 컴파일 오류를 발생시킨다.
    • 동적 타입 언어와 이해할 수 없는 메시지
      • 동적 타입 언어에는 컴파일 단계가 존재하지 않기 때문에, 실제 코드를 실행해보기 전까지는 메시지 처리 가능 여부를 판단할 수 없다.
      • 최상위 클래스에서도 메시지를 처리할 수 없다면 예외가 던져진다.
        → 예외 외에도 에러 메시지에 응답할 수 있는 메서드를 만드는 방법도 존재한다.

self 대 super

  • self 참조(C++, C#, Java 에서는 this 라고 부른다) : 객체가 메시지를 수신하면 컴파일러는 self 참조라는 임시 변수를 자동으로 생성 후 메시지를 수신한 객체를 가리키도록 설정한다.
    → 동적 메서드 탐색은 self 가 가리키는 객체의 클래스에서 시작해서 상속 계층의 역방향으로 이뤄지며 메서드 탐색이 종료되는 순간 self 참조는 자동으로 소멸된다.
  • super 의 진정한 의미 : 부모 클래스에 정의된 메서드를 실행하기 위한 것이 아닌, ‘지금 이 클래스의 부모 클래스에서부터 메서드 탐색을 시작하세요’ 가 정확한 의미이다.
profile

개발하는 프로 국밥러

@gugbab2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!