본문 바로가기
OOP/<오브젝트>, 조영호

12장 다형성 - 상속으로 타입 계층 정의하기

by 민휘 2024. 1. 31.

12장 읽고 나눈 이야기

  • 자주 사용하는 자바 문법이 왜 존재하는지 알 수 있어서 좋았음. 근데 넘 복잡하다.. 이렇게까지 알아야함?? 면접 때 말할 일이 있지 않을까요. 그러네요
  • 그래도 이 장의 핵심은 빨리 나온 듯. 계층 타입을 만드는 것은 곧 메서드 탐색 경로를 정의한다는 말이고, 이를 통해 다형성을 살릴 수 있다.
  • 그나저나 js 내용 어렵네요. js는 이벤트를 핸들링하기 위한 reactive 언어여서 원래는 함수 위주의 언어인데.. 다형성을 갖춘 계층을 구현하기 위해 prototype 키워드를 두고 self 참조를 공유 가능하게 만든 것 같아요. (이 이후로 js에 대한 깊은 대화를 했고 나는 정신을 잃었다)

 

결국 이 장이 말하고자 하는 핵심

  • 상속은 타입 계층을 정의한다. 이는 곧 메서드 탐색 경로를 정의하는 것을 말한다.
  • 타입 탐색 과정 : this → class → parent*
  • 탐색 시작점 : 메시지를 수신한 객체인 this에서 시작한다. 메서드를 탐색하던 중에 this 키워드가 나오면 다시 처음 메시지를 수신한 객체로 돌아온다. 이는 메서드 탐색 과정에 참여하는 계층이 self 참조를 공유하는 것을 말한다.

 

상속의 구조

  • 데이터 관점 : 자식 필드 안에 부모 필드가 포함되는 구조
  • 행동 관점 : 자식 인스턴스가 class 포인터로 자신의 클래스를 가리키고, 클래스의 parent 포인터로 계층 구조에서의 부모 타입을 탐색. 메시지를 수신한 객체에 this 참조가 부여됨. this -> class -> parent

 

상속 구조에서 실행 시점의 메서드 탐색 방법

  • 업캐스팅 : 부모 타입 변수에 자식 인스턴스 할당
  • 동적 바인딩 : 메시지를 수신하는 객체 타입이 메시지를 처리할 메서드를 결정
  • 업캐스팅과 동적 바인딩을 지키면 OCP를 달성할 수 있음. 대입문과 파라미터 타입을 통해 이루어짐.

 

동적 메소드 탐색 방법

  • 자식부터 부모 클래스 방향으로 탐색. 시그니처가 완전히 동일하면 자식 메소드를 찾고 끝냄.
  • 오버라이딩 : 시그니처 동일하면 상위 계층은 실행 안되므로 숨겨짐. 시그니처가 다르면 계속 탐색함.
  • 오버로딩 : cpp와 달리 자바는 상속계층의 오버로딩을 허용함. 상속 계층을 정의하는 것은 메서드 탐색 경로를 정의하는 것과 같다.

 

동적인 문맥 결정

  • 메시지를 수신한 객체의 self부터 메서드 탐색을 시작한다.
  • self 전송은 self 참조부터 탐색을 다시 시작하게 만든다.
  • super는 self의 윗 단계부터 탐색을 시작한다. super도 self처럼 객체 타입에 따라 적합한 메서드를 동적으로 선택할 수 있게 하는데, 중복 코드를 제거하는 것이 목적이다.

'OOP > <오브젝트>, 조영호' 카테고리의 다른 글

11장 합성과 유연한 설계  (1) 2024.01.30
10장 상속과 코드 재사용  (0) 2024.01.29
9장 의존성 관련 조언  (1) 2024.01.25
8장 의존성 관리하기  (0) 2024.01.25
7장 패러다임 역사  (0) 2024.01.19