닭발개발

[오브젝트] 32일차. 416-424pg | 상속, 동적타입, 정적타입, super와 self 본문

책책책 책을 읽읍시다‼ ver.개발/[ 오브젝트: 코드로 이해하는 객체지향 설계 ]

[오브젝트] 32일차. 416-424pg | 상속, 동적타입, 정적타입, super와 self

D269 2023. 8. 9. 21:42
728x90

 

 

32일차.


오브젝트: 코드로 이해하는 객체지향 설계[6주차_화요일]
416-424pg

 

 

#요약

**Chapter 12. 다형성**

01. 다형성(Polymorphism)

02. 상속의 양면성

03. 업캐스팅과 동적 바인딩

04. 동적 메서드 탐색과 다형성

1) 자동적인 메시지 위임

2) 동적인 문맥

- 메시지를 수신한 객체가 무엇이냐에 따라 메서드 탐색을 위한 문맥이 동적으로 바뀌고, 동적인 문맥을 결정하는 것은 바로 메시지를 수신한 객체를 가리키는 self 참조.

- self 전송 : self 참조가 가리키는 자기 자신에게 메시지를 전송하는 것.

- self 전송을 이해하려면 self 참조가 가리키는 그 객체에서부터 메시지 탐색을 다시 시작해야 한다.

 

3) 이해할 수 없는 메시지

- 클래스는 자신이 처리할 수 없는 메시지를 받으면 부모 클래스로 처리를 위임함.

- 근데, 상속 계층의 정상에 와서 자기가 메시지를 처리할 수 없다면? -> 이걸 이해할 수 없는 메시지 라고 함

- 이해할 수 없는 메시지를 처리하려면 프로그래밍 언어가 정적타입 언어에 속하는지, 동적 타입 언어에 속하는지에 따라 달라짐.

 

a. 정적타입 언어일 때

- 정적 타입 언어에서는 코드를 컴파일 할 때 상속 계층 안의 클래스들이 메시지를 이해할 수 있는지 여부를 판단함.

- 그래서 상속 계층 전체를 탐색해도 메시지를 처리할 수 있는 메서드를 발견 못하면 컴파일 에러 발생

b. 동적타입 언어일 때

- 동적 타입언어도 메시지를 수신한 객체의 클래스부터 부모 클래스의 방향으로 메서드 탐색

- 동적 타입 언어에는 컴파일 단계가 존재하지 않아서 실제로 코드를 실행해보기 전에는 메시지 처리 가능 여부 판단 불가.

- 몇 가지 동적 타입 언어는 최상위 클래스까지 메서드를 탐색한 후에 메서드를처리할 수 없다는 사실을 발견하면 self 참조가 가리키는 현재 객체에게 메시지를 이해할 수 없다는 메시지 전송

- 만약 상속 계층 안의 어떤 클래스도 메시지를 처리할 수 없다면 메서드 탐색은 또 한번 최상위 클래스에 이르고, 예외 던짐

- 동적타입 언어에서는 예외 던지는 것 말고도 방법 하나 더 있음 : doesNotUnderstand나 method_missing 메시지에 응답할 수 있는 메서드 구현하는 것. -> 그러면 객체는 자신의 인터페이스에 정의되지 않은 메시지 처리가 가능해짐

 

- 동적 타입 언어의 동적인 특성과 유연성은 코드를 이해하고 수정하기 어렵게 만들고 디버깅 과정을 복잡하게 만들기도 한다. 정적타입 언어는 유연성은 부족하지만 좀 더 안정적이고. 

 

4) self 대 super

- self 참조의 가장 큰 특징 : 동적이라는 것.

- self 참조는 메시지를 수신한 객체의 클래스에 따라 메서드 탐색을 위한 문맥을 실행 시점에 결정함.

- super 참조의 의도 : 지금 이 클래스의 부모 클래스에서부터 메서드 탐색을 시작하라는 의도 -> super 참조를 통해 실행하고자 하는 메서드가 만드시 부모 클래스에 위치하지 않아도 되는 유연성을 제공함.

- 부모 클래스에서 메서드 호출 =/= 부모 클래스에서 메서드 탐색 시작 은 의미가 매우 다름.

- 부모 클래스에서 메서드 호출 : 그 메서드가 반드시 부모 클래스 안에 정의돼 있어야 한다는 것.

- 부모 클래스에서 메서드 탐색 시작 : 그 클래스의 조상 어딘가에 그 메서드가 정의돼 있기만 하면 실행할 수 있다는 것.

- self 전송은 메서드 탐색을 시작할 클래스를 반드시 실행 시점에 동적으로 결정해야 하고

- super 전송은 컴파일 시점에 미리 결정해 놓을 수 있음.

 

 

 

 

 

 

 

728x90
반응형