반응형
public class Rule41 {
public static String classify(Set<?> col) {
return "Set Collection";
}
public static String classify(List<?> col) {
return "List Collection";
}
public static String classify(Collection<?> col) {
return "Unknown Collection";
}
public static void main(String[] args) {
Collection<?>[] colList = {
new HashSet<String>(),
new ArrayList<String>(),
new HashMap<String,String>().values()
};
for(Collection<?> col : colList) {
System.out.println(classify(col));
}
}
}
----
Unknown Collection
Unknown Collection
Unknown Collection
class Wine{
String name() { return "wine"; }
}
class SparklingWine extends Wine{
@Override
String name() {
return "sparkling wine";
}
}
class Champagne extends SparklingWine{
@Override
String name() {
return "champagne";
}
}
public class Rule41_2 {
public static void main(String[] args) {
Wine[] wines = {
new Wine(), new SparklingWine(), new Champagne()
};
for(Wine wine : wines) {
System.out.println(wine.name());
}
}
}
----
wine
sparkling wine
champagne
classify는 오버로딩된 메서드 가운데 어떤것이 호출될 지는 컴파일 시점에 결정되기 때문에 Unkown Collection만 세번 출력할 것이다. 인자의 실행 시점에서는 전부 다르지만 인자의 컴파일 시점에서는 Collection<?>이므로, 호출되는것은 항상 classify(Collection<?>) 메서드다.
오버로딩된 메서드는 정적으로 선택되지만, 오버라이드(재정의)된 메서드는 동적으로 선택되기 때문이다.
상위클래스에서 선언된 메서드와 같은 하위 클래스가 재정의된 메서드이다.
하위 클래스에서 재정의한 메서드를 하위클래스 객체에 대해 선언하면 해당 객체의 컴파일 시점 자료형과는 상관없이 항상 하위 클래스의 재정의 메서드가 호출된다.
결론:
· 오버로딩을 사용할 때에는 혼란스럽지 않게 사용할 수 있도록 주의
· 혼란을 피하는 안전하고 보수적인 전략은, 같은 수의 인자를 갖는 두 개의 오버로딩 메서드를 API에 포함시키지 않는 것이다.
· 같은 수의 인자를 받는 오버로딩 메서드가 많더라도, 어떤 오버로딩 메서드가 주어진 인자 집합을 처리할 지 인가 분명히 결정해야한다. (두 자료형이 서로 형변환이 되지 않는 radically different완전 다른이 만족해야한다)
반응형
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 39 필요하다면 방어적 복사본을 만들라. (0) | 2023.04.27 |
---|---|
<Effective Java> RULE 40 메서드 시그너처는 신중하게 설계하라 (0) | 2023.04.27 |
<Effective Java> RULE 42 var args는 신중히 사용하라 (0) | 2023.04.26 |
<Effective Java> RULE 43 null 대신 빈 배열이나 컬렉션을 반환하라 (0) | 2023.04.26 |
<Effective Java> RULE 44 모든 API요소에 문서화 주석을 달라 (0) | 2023.04.26 |