Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바스크립트
- java
- javascript 값
- webstorm
- java.util.LinkedHashMap cannot be cast
- Spring
- javascript native
- 이펙티브자바
- Redis
- Intellij
- you don't know js
- webpack
- 이펙티브 자바
- spring batch #스프링 배치 #스프링 배치 중복 실행
- 자바
- Babel
- Spring Session
- JetBrains
- javascript value
- Effective Java
- javascript 기초
- effectivejava
- spring security
- javascript
- CAS
- ECMA2015
- javascript type
- ES6
- requestbody
- nodeJS
Archives
- Today
- Total
귀찮지만 만들어보자
이펙티브 자바 - 메서드(4) 본문
다중정의는 신중히 사용하라
public class CollectionClassfier {
public static String classify(Set<?> s) {
return "집합";
}
public static String classify(list<?> list) {
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 (Collecstion<?> c: collections) {
System.out.println(classify(c));
}
}
}
main문을 실행하면 집합 - 리스트 - 그 외 순서로 출력될것 같지만
실제로는 "그 외" 만 세번 출력 된다.
다중정의는 어느 메서드를 호출할 지 컴파일타임에 정해지기 때문이다.
재정의(override)한 메서드는 동적으로 선택되고, 다중정의(overload)한 메서드는 정적으로 선택된다.
재정의는 런타임에 '가장 하위에서 정의한' 메서드가 동작하는 방식이라서
상대적으로 다중정의에 비해 결과를 예상하기 쉽고, 유연한 방식이다.
public static String classify(Collection<?> c) {
return c instanceof Set ? "집합" :
c instanceof List ? "리스트" : "그 외";
}
코드를 이런식으로 바꾸면 다중정의를 사용하지 않으면서 원하는 결과를 불러올 수 있다.
이런 예제를 제공한 이유는 다중정의를 함부로 사용하지 말라는 뜻인것으로 보인다.
안전하고 보수적으로 가려면 매개변수 수가 같은 다중정의는 만들지 말자.
차라리 이럴 경우 메서드 이름을 다르게 주는게 더 나을 수 있다.
메서드를 다중정의할 때, 서로 다른 함수형 인터페이스라도 같은 위치의 인수로 받아서는 안된다.
- 서로 다른 함수형 인터페이스여도 서로 근본적으로 다르지 않기 때문이다
프로그래밍 언어가 다중정의를 허용한다고 해서 다중정의를 꼭 활용하라는 뜻은 아니다. 명심해두자
'이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - 메서드(3) (0) | 2019.01.27 |
---|---|
이펙티브 자바 - 메서드(2) (0) | 2019.01.27 |
이펙티브 자바 - 메서드(1) (0) | 2019.01.27 |
이펙티브 자바 - 람다와 스트림(7) (0) | 2019.01.19 |
이펙티브 자바 - 람다와 스트림(6) (0) | 2019.01.19 |