일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- docker
- 책읽기
- 성수핫플
- 성수직장인
- 오브젝트
- Java
- 성수
- 독서
- JAVA개발자
- 직장인점심
- 주니어개발자
- 성수맛집
- 독서일지
- 디자인패턴
- IntelliJ
- 깨끗한코드
- 상속
- 코딩
- 성수볼거리
- 객체지향프로그래밍
- 책너두
- 직장인
- DesignPattern
- 객체지향
- 헤드퍼스트디자인패턴
- 개발자
- 클린코드
- Linux
- JavaScript
- 헤드퍼스트
- Today
- Total
닭발개발
[오브젝트] 32일차. 416-424pg | 상속, 동적타입, 정적타입, super와 self 본문
[오브젝트] 32일차. 416-424pg | 상속, 동적타입, 정적타입, super와 self
D269 2023. 8. 9. 21:42
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 전송은 컴파일 시점에 미리 결정해 놓을 수 있음.
'책책책 책을 읽읍시다‼ ver.개발 > [ 오브젝트: 코드로 이해하는 객체지향 설계 ]' 카테고리의 다른 글
[오브젝트] 34일차. 436-446pg | 타입, 타입계층 (0) | 2023.08.10 |
---|---|
[오브젝트] 33일차. 425-435pg | 상속과 위임, 프로토타입 (0) | 2023.08.09 |
[오브젝트] 31일차. 403-415pg | 업캐스팅, 동적바인딩, 다운캐스팅 (0) | 2023.08.07 |
[오브젝트] 30일차. 393-402pg | 다형성, 메소드 오버라이딩, 오버로딩 (0) | 2023.08.05 |
[오브젝트] 29일차. 378-392pg | 믹스인, 트레이트 조합, 다형성 (0) | 2023.08.05 |