아이템 52. 다중정의는 신중히 사용하라

문법식·2022년 10월 11일
0

Effective Java 3/E

목록 보기
52/52

재정의한 메서드는 동적으로 선택되고, 다중정의한 메서드는 정적으로 선택된다. 메서드를 재정의했다면 해당 객체의 런타임 타입이 어떤 메서드를 호출할지의 기준이 된다. 즉, 항상 '가장 하위에서 정의한' 재정의 메서드가 실행되는 것이다.
한편, 다중정의된 메서드 사이에서는 객체의 런타임 타입은 전혀 중요치 않다. 선택은 컴파일타임에, 오직 매개변수의 컴파일타임 타입에 의해 이뤄진다.

프로그래머에게 재정의가 정상적인 동작 방식이고, 다중정의가 예외적인 동작으로 보일 때가 있다. 헷갈리는 코드는 작성하지 않는 게 좋다. 다중정의가 혼동을 일으키는 상황을 피해야 한다. 정확히 어떻게 사용할 때 다중정의가 혼란을 주느냐에 대해서는 온란의 여지가 있다. 안전하고 보수적으로 가려면 매개변수 수가 같은 다중정의는 만들지 말아야 한다. 가변인수를 사용하는 메서드라면 다중정의는 아예 하지 말아야 한다. 다중정의하는 대신 메서드 이름을 다르게 지어주는 방법도 있다.

생성자는 이름을 다르게 지을 수 없으니 두 번째 생성자부터는 무조건 다중정의가 된다. 하지만 정적 팩터리라는 대안을 활용할 수 있는 경우가 많다. 또한 생성자는 재정의할수 없으니 다중정의와 재정의가 혼용될 걱정은 안해도 된다. 그래도 여러 생성자가 같은 수의 매개변수를 받아야 하는 경우를 완전히 피해갈 수는 없을 테니, 그럴 때를 대비해 안전 대책을 배워두면 좋다. 다음과 같다.

  • 매개변수 수가 같은 다중정의 메서드가 많더라도, 그중 어느 것이 주어진 매개변수 집합을 처리할지가 명확히 구분된다면 헷갈릴 일은 없다. 즉, 매개변수 중 하나 이상이 "근본적으로 다르다"면 헷갈릴 일이 없다. 근본적으로 다르다는 건 두 타입의 값을 서로 어느 쪽으로든 형변환할 수 없다는 뜻이다.(intCollection) 이 조건만 충족하면 어느 다중정의 메서드를 호출할지가 매개변수들의 런타임 타입만으로 결정된다.

다중정의된 메서드 중 하나를 선택하는 규칙은 매우 복잡하며, 자바가 버전업이될수록 더 복잡해지고 있어, 이 모두를 이해하기 어렵다. 그러므로 다중정의는 신중히 사용해야 한다.

profile
백엔드

0개의 댓글