#41 오버 로딩(overloading)을 분별력 있게 사용하자
오버 로딩으로 인해 의도하지 않은 결과를 초래할 수 있습니다.
아래 예시들을 보면서 알아보겠습니다.
CollectionClassifier 클래스는 Set, List 그리고 다른 컬렉션 중 어떤 컬렉션인지 String 값으로 반환해주는 클래스입니다.
이를 실행하면 "Set", "List", "Unknown Collection"으로 출력될 거 같지만, 실제로는 "Unknown Collection"만 3번 출력됩니다.
동적으로 메서드가 선택되는 오버 라이딩(overriding)과는 달리 오버 로딩(overloading)은 메서드가 정적으로 선택됩니다.
위의 보면, 컴파일 시점인 System.out.println(classify(c)); 코드에서는 Collection <?> c 매개 변수를 이용하고 있습니다.
따라서 컴파일 시점에서 정적으로 classify(Collection <?>) 메서드가 오버 로딩됩니다.
처음 의도한 대로 컬렉션 타입에 따라 반환해주는 메서드를 구현하려면 아래와 같이 해야 합니다.
SetList 클래스는 -3부터 2까지의 정수를 Set과 List에 저장하는 클래스입니다.
이를 실행하면 "[-3, -2, -1] [-3, -2, -1]"이 출력될 거 같지만, 실제로는 "[-3, -2, -1] [-2, 0, 2]"가 출력됩니다.
set.remove(i)를 호출하면 remove(E)가 실행됩니다.
여기서 int 타입인 i는 Integer 타입으로 오토 박싱이 일어나고, 아래와 같이 해당 Set의 요소를 삭제하고 있습니다.
list.remove(i)를 호출하면 remove(E)가 실행됩니다.
Set과는 달리 int 타입인 i는 Integer 타입으로 오토 박싱이 일어나지 않고, 오버 로딩된 remove(int index) 메서드를 통해 해당 index의 요소를 삭제하고 있습니다.
이처럼 오토 박싱으로 인해 문제가 발생할 수 도 있습니다.
이를 해결하기 위해서는 아래처럼 i를 Integer 타입으로 캐스팅해줘야 합니다.
자바 API를 보면 이를 지키지 않은 오버 로딩도 존재하고 있습니다.
하지만 이를 제대로 숙지하지 못한 상태라면 문제가 발생할 수 있기 때문에 분별력 있게 사용해야 합니다.
같은 수의 매개 변수를 갖는 오버 로딩 메서드 X
가변 인자(varargs) 매개 변수를 갖는 오버 로딩 메서드 X