8장 : 메서드

2023. 4. 6. 15:08스터디/이펙티브 자바 스터디

728x90

아이템 49. 매개변수가 유효한지 검사하라 

- 매개변수 값이 잘못됐을 때 던지는 예외를 문서화해야

- 나중에 쓰기 위해 저장하는 매개변수는 특히 더 신경 써서 검사해야

- 유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때, 혹은 계산 과정에서 암묵적으로 검사가 수행될 때는 검사 패스해도 됨


아이템 50. 적시에 방어적 복사본을 만들라 

- 클라이언트가 여러분의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야

- 생성자에서 받은 가변 매개변수를 각각 방어적으로 복사해야

- 매개변수가 제 3자에 의해 확장될 수 있는 타입이라면 방어적 복사본을 만들 때 clone 사용해서는 안 됨

- 인스턴스를 복사하는 데는 일반적으로 생성자나 정적 팩터리를 쓰는 것이 좋음

- 그 객체가 잠재적으로 변경될 수 있는지를 생각해야

- 통제권을 이전하는 메서드를 호출하는 클라이언트는 해당 객체를 더 이상 직접 수정하는 일이 없다고 약속


아이템 51. 메서드 시그니처를 신중히 설계하라

- 매개변수의 타입으로는 클래스보다 인터페이스가 더 낫다

- boolean보다는 원소 2개짜리 열거 타입이 낫다


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

- 어느 메서드를 호출할지가 컴파일타임에 정해짐

- 재정의한 메서드는 동적으로 선택, 다중정의한 메서드는 정적으로 선택됨

- 안전하고 보수적으로 가려면 매개변수 수가 같은 다중정의는 만들지 말아야

- 가변인수(varages)를 사용하는 메서드라면 다중정의를 아예 하지 말아야

- 다중정의하는 대신 메서드 이름을 다르게 지어주는 길도 항상 열려있음

- 정적 팩터리라는 대안을 활용할 수 있는 경우가 더 많음

- 메서드를 다중정의할 때, 서로 다른 함수형 인터페이스라도 같은 위치의 인수로 받아서는 안됨

- 서로 다른 함수형 인터페이스라도 서로 근본적으로 다르지 않기 때문

- 가장 일반적인 방법은 상대적으로 더 특수한 다중정의 메서드에서 덜 특수한 다중정의 메서드로 일을 넘기는 것


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

- 가변 인수 메서드를 호출하면 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네줌

- 성능에 민감한 상황이라면 가변인수가 걸림돌이 될 수도

- 가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화

- 필수 매개별수는 가변이수 앞에 두고, 가변인수를 사용할 때는 성능 문제까지 고려

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

- 컬렉션이나 배열같은 컨테이너가 empty면 null을 반환하는 메서드라면, 사용시 항시 null 체킹을 해야

- 성능을 위했다면 차라리 빈 불변 컬렉션을 반환

- 배열이라면 길이가 0인 배열을 반환

- 단지 성능을 개선할 목적이라면 toArray에 넘기는 배열을 미리 할당하는 것은 추천하지 않음


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

- null 반환할 여지가 있으면 별도의 null 처리 코드를 추가해야

- 옵셔널을 반환하는 메서드에서는 절데 null을 반환하지 말자

- 옵셔널은 검사예외와 취지가 null 체킹과 비슷, 즉, 반환 값이 없을 수도 있음을 api 사용자에게 명확히 알려줌- orElseGet을 사용하면 값이 처음 필요할 때 Supplier을 사용해 생성하므로 초기 설정 비용을 낮츰- 컬렉션,스트림,배열,옵셔널 같은 컨테이너 타입은 옵셔널로 감싸면 안 됨. 차라리 빈 컬렉션 반환- 결과가 없을 수 있으며 클라이언트가 이 상황을 특별하게 처리해야 한다면 Optional<T> 반환- 박싱된 기본 타입을 담은 옵셔널을 반환하는 일은 없어야- 옵셔널을 맵의 값으로 사용하면 절대 안 됨- 옵셔널을 컬렉션의 키, 값,원소나 배열의 원소로 사용하는게 적절한 상황은 거의 없음- 옵셔널을 인스턴스 필드에 저장한다는 건 안티 패턴 - 옵셔널 반환에는 성능 저하가 있음 


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

- 메서드용 문서화 주석은 how가 아닌 what을 기술, 전제조건, 사후조건, 부작용도 문서화, 시스템 상태의 변화도 문서화

- @param이나 @return은 설명하는 명사구를 씀 

- 한 클래스 안에서 요약설명이 똑같은 맴버가 둘 이상이면 안 됨

- 요약 설명에서는 마침표에 주의 

- 2인칭 문장이 아닌 3인칭 문장으로

- 메서드와 생성자의 요약 설명은 주어없는 동사구여야

- 클래스,인터페이스,필드 요약 설명은 명사절

- 상수들에도 주석을 달아야 

- 정적메서드의 스레드 안전 수준도 설명해야

 

 

728x90

'스터디 > 이펙티브 자바 스터디' 카테고리의 다른 글

10장 : 예외  (0) 2023.04.21
9장 : 일반적인 프로그래밍 원칙  (0) 2023.04.15
7장 : 람다와 스트림  (0) 2023.04.06
6장 : 열거 타입과 애너테이션  (0) 2023.04.06
5장 : 제네릭  (0) 2023.04.06