개발 서적 기록/오브젝트_조영호

32일차 - self 참조와 super 참조

밍 끄적 2023. 9. 14. 19:14
728x90

2023.09.14 THU

415p ~ 424p

 

31일차 내용 ⬇️

2023.09.11 - [개발 서적 기록/오브젝트_조영호] - 31일차 - 업캐스팅 & 동적 바인딩 그리고 동적 메서드 탐색

 

31일차 - 업캐스팅 & 동적 바인딩 그리고 동적 메서드 탐색

2023.09.11 MON 401p ~ 415p 30일차 내용 ⬇️ 2023.09.10 - [개발 서적 기록/오브젝트_조영호] - 30일차 - 다형성의 종류 30일차 - 다형성의 종류 2023.09.10 SUN 390p ~ 402p 29일차 내용 ⬇️ 2023.09.08 - [개발 서적 기

magenta-ming.tistory.com


self 참조를 통한 동적인 문맥

메시지를 수신한 객체가 무엇이냐에 따라, 메서드 탐색을 위한 문맥이 동적으로 바뀔 수 있어야한다.

이렇게 동적으로 문맥을 결정하기 위해서는, 메시지를 수신하는 객체를 가리키는 self 참조가 필요하다.

 

동일한 코드임에도 self 참조가 가리키는 객체가 무엇인지에 따라, 메서드 탐색을 위한 상속 계층의 범위가 동적으로 변한다.

 

이를 통해서 객체가 실행될 문맥을 동적으로 바꿀 수 있다는 이점이 있다.

반면에, 이는 어떤 메서드가 실행될지를 예상하기 어렵게 만들기도 한다.

특히, selft 전송의 경우가 어렵다.

 

selft 전송 ( self send )

self 전송은 자신에게 다시 메시지를 전송하는 방법이다.

 

만약 A 클래스를 상속한 B 클래스의 인스턴스를 생성해, 어떤 메서드 firstMethod 를 호출했다.

그런데, 이 메서드 firstMethod 는 B 클래스에서는 오버라이드 하지 않았기에 부모 클래스인 A 클래스에서 실행된다.

이때, 이 메서드 firstMethod 내부에는 A 클래스의 또다른 메서드 secondMethod 를 호출하는 코드가 있다. 그리고 secondMethod 메서드는 B 클래스에서 오버라이드 하고 있다.

그래서 firstMethod는 내부 구현을 수행하면서 secondMethod 메소드를 호출했다. 이때, A 클래스의 secondMethod가 호출되어야할지, B 클래스의 secondMethod가 호출되어야할지 self 참조를 통해 판단한다.

self 참조를 통해 판단한 결과, 원래 B 클래스의 인스턴스로서 호출했으므로, B 인스턴스의 secondMethod 메서드를 호출하게 되고 이것이 self 전송이다.

 

이렇게, self 전송은 자식 클래스에서 부모 클래스 방향으로 진행되는 동적 메서드 탐색 경로를 다시 self 참조가 가리키는 원래의 자식 클래스로 이동시키고, 최악의 경우에는 상속 계층 전체를 탐색해야할 수 있기에, 예상하기가 이해하기가 어려운 구조를 가지고 있다.

 

super 참조 ( super reference )

super 참조를 이용하면 부모 클래스에게 메시지를 전송할 수 있다.

메서드를 호출하는 것이 아니라, 메시지를 전송하는 이유는 부모 클래스의 메서드가 아니라 더 상위에 위치한 조상 클래스의 메서드일 수도 있기 때문이다.

즉, super 참조의 용도는 부모 클래스에 정의된 메서드를 실행하기 위한 것이 아니라, '지금 이 클래스의 부모 클래스에서부터 메서드 탐색을 시작하세요'라는 메시지를 전송하는 것이다.

 

super 참조를 통해 메시지를 전송하는 것을 super 전송 ( super send ) 라고 한다.

 

 

728x90