본문 바로가기

개발/[스터디] 이펙티브 자바

[이펙티브자바]아이템 52-56

아이템 52 . 다중  정의는  신중히 사용하라

다중정의(overloading)

- 메서드 호출을 컴파일 타임에 정한다. 

- 코드 52-1에서 Collections의 다형화를 사용하여 출력값을 다르게 지정했지만, 동작하지 않는 이유다. 

 

cf. 재정의(overriding):

메서드를 동적으로 선택한다. 

 

다중정의로 인해, 메서드의 다형성이 존재한다고 프로그래머가 착각하기 쉽다. 

따라서 안전하게 가기 위해

- 매개 변수 수가 같은 다중정의는 하지 말자. 

- 메서드명을 다르게 하자 (예. writeBoolean(boolean), writeInt(int) ...)

- 형변환을 통해 정확한 다중정의 메서드가 선택되도록 유도하자. (코드 52-3)

아이템 53. 가변인수는 신중히 사용하라

최소한 필요한 가변 인수 갯수가 있다면, (필수 매개변수 + 가변인수) 조합을 사용하자. 

예. 53-2에서는 예외를 던져, 인수가 하나 이상 필요함을 알려준다. 문제는 함수를 호출하는 단에서는, 함수의 정의만 보고서는 최소 인자 개수를 파악할 수 없다. 즉, 내부 코드 동작 방식을 알아야하는 문제가 생겨, 추상화를 깨버린다. 

(코드 53-2, 53-3 비교)

 

가변인수의 성능 해결법

- 가변인수 메서드는 호출시 배열을 하나 새로 할당, 초기화한다. 성능 이슈가 발생할 수 있다. 

- 책 321의 예제처럼, 최소로 필요한 인자 개수가 파악될 경우, 해당 인자는 필수 매개변수로 넣고,

   나머지 경우를 가변인수로 대체하자. 

아이템 54. NULL이 아닌 빈 컬렉션이나 배열을 반환하라. 

- 메서드가 null을 반환할 경우, 해당 메서드를 호출하는 곳에서 항상 방어 로직이 필요하다. (예. 책 323p 코드)

- 따라서 null 대신 빈 컬렉션과 빼열을 반환하자. 

   : 성능 저하가 있을 경우 불변 객체를 반환하자. (예. Collections.emptyList()) 

     -> 왜 불변이 성능 이슈를 해결하지?

     -> 왜 꼭 필요한지 체크해야하지? 

 

아이템 55. 옵셔널 반환은 신중히 하라

언제 옵셔널 사용할까

결과값이 없고, 클라이언트가 이 상황을 특별히 처리해야할때

 

사용시 주의할 것

- null을 반환하지 말자. (옵셔널의 취지에 어긋남)

- 컬렉션, 스트림, 배열, 옵셔널은 옵셔널로 감싸면 안된다. 

- 박싱된 기본 타입을 담는 옵셔널 사용하지 말자. (대체제: OptionalInt...)

 

orElse  vs orElseGet

객체 초기화 비용에서 orElseGet이 유리하다.

 

성능

옵셔널 객체 생성에도 비용이 따르므로, 꼭 필요할 때만 사용하자. 

아이템 56.  공개된 API 요소에는 항상 문서화 주석을 작성하라.

어디까지 해야할지 애매하다..?