카테고리 없음

질문 나눔

학습하는 청년 2024. 6. 10. 23:03

일시 : 2024-06-10

 

5. 함수 선택과 메서드 선택이란 무엇이고, 둘의 차이점에 대해 설명해주세요.

함수 선택이란, 함수가 오버로딩되어 있을 때 호출할 함수를 자동으로 고르는 것을 말한다.

 

# 함수 선택의 규칙

  1. 가장 기본적인 규칙은 '인자의 타입에 맞는 함수를 고른다'는 것이다.
  2. 인자의 타입에 가장 특화된(most specific) 함수를 고른다. 다시 말해, 한 함수의 매개변수 타입이 다른 함수의 매개변수 타입의 서브타입이라는 뜻이다.
  3. 함수를 고를 때는 인자의 정적 타입만 고려한다.

함수 선택은 인자의 정적 타입'만' 고려하지만 메서드 선택은 인자의 정적 타입을 고려하는 것뿐만 아니라 수신자(receiver)의 동적 타입 역시 고려한다.


6. 메서드 선택의 한계란 무엇이고 그로 인한 문제점은 무엇인가요?

메서드 선택은 메서드 오버로딩뿐 아니라 메서드 오버라이딩까지도 모두 고려해 메서드를 선택한다. 이 지점에서, 함수 선택과 메서드 선택의 차이가 존재한다. 함수 선택은 인자의 정적 타입'만' 고려하지만 메서드 선택은 인자의 정적 타입을 고려하는 것뿐만 아니라 수신자(receiver)의 동적 타입 역시 고려한다.

# 수신자

메서드 호출 시에 메서드 이름 앞에 오는 객체를 뜻한다. 예를 들어, v.length()라는 코드에서 v가 수신자이다. v가 이 메서드 호출을 받아서 처리한다는 관점에서 수신자라고 부른다. 

 

이에 따라 메서드 선택의 네 번째 규칙, '메서드를 고를 때는 수신자의 동적 타입도 고려한다'는 것이다. 수신자의 동적 타입을 고려하여 실행 중에 메서드를 고르기 때문에 '동적 선택(dynamic dispatch)'이라 부른다.

 

그러나 수신자의 동적 타입을 고려해 메서드를 선택하는 것만으로 모든 문제가 해결되지 않는다. 문제는 수신자의 동적 타입만 고려하고 인자의 동적 타입은 고려하지 않는 데서 발생한다. 인자의 정적 타입과 동적 타입이 다를 때는 개발자의 기대와 다른 메서드를 호출하게 된다. 언어 수준에서 도와주지 않기 때문에 모든 상황에 가장 효율적인 메서드가 호출되도록 개발자가 코드를 잘 작성해야 한다. 기본 전략은 메서드 안에서 수신자와 인자의 위치를 바꾸어 다시 한번 메서드를 호출하는 것이다.