brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Jul 31. 2018

Effective Java - 메서드(method)

#41 오버 로딩(overloading)을 분별력 있게 사용하자

Effective Java - 메서드(method)


#41 오버 로딩(overloading)을 분별력 있게 사용하자


오버 로딩으로 인해 의도하지 않은 결과를 초래할 수 있습니다.

아래 예시들을 보면서 알아보겠습니다.




#01 CollectionClassifier class


CollectionClassifier 클래스는 Set, List 그리고 다른 컬렉션 중 어떤 컬렉션인지 String 값으로 반환해주는 클래스입니다.


이를 실행하면 "Set", "List", "Unknown Collection"으로 출력될 거 같지만, 실제로는 "Unknown Collection"만 3번 출력됩니다.


#02 오버로딩


동적으로 메서드가 선택되는 오버 라이딩(overriding)과는 달리 오버 로딩(overloading)은 메서드가 정적으로 선택됩니다.


위의 보면, 컴파일 시점인 System.out.println(classify(c)); 코드에서는 Collection <?> c 매개 변수를 이용하고 있습니다.

따라서 컴파일 시점에서 정적으로 classify(Collection <?>) 메서드가 오버 로딩됩니다.


처음 의도한 대로 컬렉션 타입에 따라 반환해주는 메서드를 구현하려면 아래와 같이 해야 합니다.

#03 classify 메서드




#04 SetList class


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의 요소를 삭제하고 있습니다.

#05 TreeSet remove method


list.remove(i)를 호출하면 remove(E)가 실행됩니다.

Set과는 달리 int 타입인 i는 Integer 타입으로 오토 박싱이 일어나지 않고, 오버 로딩된 remove(int index) 메서드를 통해 해당 index의 요소를 삭제하고 있습니다.


#06 ArrayList remove method


이처럼 오토 박싱으로 인해 문제가 발생할 수 도 있습니다.


이를 해결하기 위해서는 아래처럼 i를 Integer 타입으로 캐스팅해줘야 합니다.

#07 remove(Integer i)




자바 API를 보면 이를 지키지 않은 오버 로딩도 존재하고 있습니다.

하지만 이를 제대로 숙지하지 못한 상태라면 문제가 발생할 수 있기 때문에 분별력 있게 사용해야 합니다.

같은 수의 매개 변수를 갖는 오버 로딩 메서드 X

가변 인자(varargs) 매개 변수를 갖는 오버 로딩 메서드 X


매거진의 이전글 Effective Java - 메서드(method)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari