반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 52. 다중정의는 신중히 사용하라
다중정의
ex 1) 컬렉션의 종류를 출력하는 예
public class CollectionClassifier {
public static String classify(Set<?> s) {
return "집합";
}
public static String classify(List<?> lst) {
return "리스트";
}
public static String classify(Collection<?> c) {
return "그 외";
}
public static void main(String[] args) {
Collection<?>[] collections = {
new HashSet<String>(),
new ArrayList<BigInteger>(),
new HashMap<String, String>().values()
};
for (Collection<?> c : collections)
System.out.println(classify(c));
}
}
- “집합”, “리스트”, “그 외”를 차례로 출력하리라 예상했겠지만, 실제로는 “그 외”가 세 번 연속 출력된다.
- 다중정의된 세 classify 중 어느 메서드를 호출할지가 컴파일타임에 정해지기 때문이다.
- 컴파일타임에는 for 문 안의 c는 항상 Collection<?> 타입이기에 그렇다. (런타임 시에는 타입이 매번 달라짐)
- 재정의한 메서드는 동적으로 선택되고, 다중정의한 메서드는 정적으로 선택되기 때문이다.
- 안전하고 보수적으로 사용하기를 원한다면, 매개변수 수가 같은 다중정의는 만들지 말자.
- 다중정의하는 대신 메서드 이름을 다르게 지어주는 방향도 고려하자.
ex2) 재정의된 메서드를 호출하는 경우
class Wine {
String name() {
return "포도주";
}
}
static class SparklingWine extends Wine {
@Override
String name() {
return "발포성 포도주";
}
}
static class Champagne extends Wine {
@Override
String name() {
return "샴페인";
}
}
public class Overriding {
public static void main(String[] args) {
List<Wine> wineList = List.of(
new Wine(), new SparklingWine(), new Champagne()
);
for (Wine wine : wineList) {
System.out.println(wine.name());
}
}
}
- 이 예제는 “포도주”, “발포성 포도주”, “샴페인”으로 출력된다.
- for 문에서의 컴파일타임 타입이 Wine 인 것과 무관하게 항상 가장 하위에서 정의한 메서드가 실행되는 것이다.
정리
- 프로그래밍 언어가 다중정의를 허용한다고 해서 다중정의를 꼭 활용하란 뜻은 아니다.
- 일반적으로 매개변수 수가 같을 때는 다중정의를 피하는 게 좋다.
- 상황에 따라, 이 조언을 따르기가 불가능할 수 있다.
- 그럴 때는 헷갈릴 만한 매개변수는 형변환하여 정확한 다중정의 메서드가 선택되도록 해야한다.
- 이것이 불가능하면, 예컨데 기존 클래스를 수정해 새로운 인터페이스를 구현해야 할 때는 같은 객체를 입력받는 다중 정의 메서드들이 모두 동일하게 동작하도록 만들어야 한다.
- 그렇지않으면 프로그래머들은 다중정의된 메서드나 생성자를 효과적으로 사용하지 못할 것이고, 의도대로 동작하지 않는 이유도 이해하지 못할 것이다.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 (0) | 2022.11.17 |
---|---|
[Effective Java] 아이템 53. 가변인수는 신중히 사용하라 (0) | 2022.11.16 |
[Effective Java] 아이템 51. 메서드 시그니처를 신중히 설계하라 (0) | 2022.11.14 |
[Effective Java] 아이템 50. 적시에 방어적 복사본을 만들라 (0) | 2022.11.11 |
[Effective Java] 아이템 49. 매개변수가 유효한지 검사하라 (0) | 2022.11.10 |