메서드나 생성자의 모든 매개변수의 유효성을 검사하고, 적절하지 않다면 IllegalArgumentException 등 예외를 던져라.
장점
잘못된 입력을 미리 걸러내어 버그를 줄이고, 코드의 가독성과 안정성을 높인다.
버그 예방 : 잘못된 매개변수가 전달되는 것을 방지함으로써 발생할 수 있는 예기치 않은 오류와 버그를 줄일 수 있다.
문제 조기 발견 : 매개변수의 유효성을 초기에 검사하여, 오류가 발생하는 즉시 원인을 쉽게 파악할 수 있다.
코드 안정성 : 유효하지 않은 값이 내부 로직에 영향을 미치지 않도록 하여 전체 코드의 안정성을 높인다.
문서화 : 유효성 검사 코드는 메서드가 어떤 값을 기대하는지 명확히 나타내어, 메서드 사용자가 올바른 값을 전달할 수 있게 한다.
방법
Objects.requireNonNull 사용
직접 조건 검사를 통한 예외 처리, 복잡한 검증 로직
유의할 점
적절한 예외 타입 사용: 적절한 예외 타입(IllegalArgumentException, NullPointerException 등)을 사용하여 오류를 명확히 전달
검사 위치: 유효성 검사는 메서드 시작 부분에서 수행하여 잘못된 입력이 내부 로직에 영향을 미치지 않도록 설계
오류 메시지: 문제의 원인을 쉽게 파악할 수 있게 명확하고 이해하기 쉬운 오류 메시지를 제공
퍼포먼스: 너무 잦은 검사는 성능에 영향을 미치므로 유효성 검사는 필요할 때만 수행
Item 50: 적시에 방어적 복사본을 만들라
메서드가 외부로부터 받은 가변 객체를 내부에서 사용하거나 반환할 때는 방어적 복사본을 만들자.
방어적 복사(defensive copying)
메서드가 변경 가능한 객체를 받을 때 원본 객체의 상태를 보호하기 위해 복사본을 사용하는 기법.
→ 원본 객체가 외부에서 변경되는 것을 방지
장점
불변성 유지 : 원본 객체의 상태가 외부에서 변경되지 않도록 보장하여 객체의 불변성을 유지할 수 있다.
버그 예방 : 외부에서 객체의 상태를 변경할 수 없게 하여 예기치 않은 버그를 예방한다.
보안 강화 : 외부에서 객체를 조작하여 시스템의 상태를 변경하거나 보안 취약점을 악용할 수 없도록 한다.
캡슐화 : 객체의 내부 상태를 외부에 노출하지 않음으로써 캡슐화 원칙을 준수한다.
방법
주로 객체를 반환할 때와 매개변수로 받을 때 수행
객체를 반환할 때 방어적 복사본 만들기 : 변경 가능한 객체를 반환할 때는 원본 객체 대신 복사본을 반환
매개변수로 받은 객체 방어적 복사 : 매개변수로 받은 객체가 변경 가능할 경우, 내부에서 사용할 때는 방어적 복사를 통해 원본 객체를 보호
유의할 점
복사 비용 : 방어적 복사는 성능 비용이 따르고 복사 비용이 큰 객체의 경우 성능에 영향을 미칠 수 있으므로, 필요한 경우에만 사용
불변 객체 : 불변 객체(immutable objects)는 방어적 복사가 필요 없음. 불변 객체를 사용해서 복사 비용 줄이기
신뢰할 수 없는 소스 : 외부에서 제공된 객체가 신뢰할 수 없는 경우, 반드시 방어적 복사를 수행하여 내부 상태를 보호
컬렉션 복사 : 컬렉션 객체를 방어적으로 복사할 때는 얕은 복사(shallow copy) 대신 깊은 복사(deep copy)를 고려. 얕은 복사는 컬렉션 내의 객체가 여전히 변경 가능하기 때문
Item 51: 메서드 시그니처를 신중히 설계하라
메서드 시그니처를 신중히 설계하면 메서드의 사용성을 높이고, 코드의 가독성, 유지보수성, 재사용성을 향상시킬 수 있다. 이를 위해 메서드 이름, 매개변수 목록, 반환 타입 등을 고려하여 직관적이고 명확하게 설계하는 것이 중요하다.
메서드 시그니처
메서드의 이름, 매개변수 목록, 반환 타입 등을 포함한 메서드의 선언부
장점
잘 설계된 메서드 시그니처는 메서드의 사용성을 높이고 유지보수성을 향상시킨다.
가독성 : 메서드 이름과 매개변수 목록이 직관적이면 코드의 가독성이 높아진다.
유지보수성 : 명확한 메서드 시그니처는 코드 변경 시 영향을 최소화하여 유지보수성을 향상시킨다.
재사용성 : 잘 설계된 메서드는 다양한 상황에서 재사용이 용이하다.
오류 예방 : 혼란을 줄이고, 잘못된 사용을 방지하여 버그 발생 가능성을 줄인다.
방법
메서드 이름을 신중하게 선택하라
명확하고 구체적인 이름
일관성 유지
매개변수 목록을 신중하게 설계하라
적절한 개수의 매개변수
매개변수의 순서
매개변수의 타입
매개변수 유효성 검사
불필요한 매개변수 제거
매개변수의 기본값 제공
가변인수 신중하게 사용하기
적절한 반환 타입
반환 타입은 메서드의 의도를 명확히 나타내야 한다.
컬렉션을 반환할 때는 인터페이스 타입을 사용하는 것이 좋다.
Optional 반환 : 반환값이 없을 수 있는 경우 Optional을 사용할 수 있지만, 남용하지 않도록 주의
Item 52: 오버로딩을 주의하라
오버로딩보다는 메서드 이름을 다르게 하여 혼란을 방지하고, 가독성과 유지보수성을 높이자.
오버로딩
같은 이름의 메서드를 여러 개 정의하되, 매개변수 목록이 다르게 작성하는 기법
오버로딩을 잘못 사용하면 혼란을 초래하므로 주의해서 사용하자.
오버로딩된 메서드는 호출 시 어떤 메서드가 호출될지 예측하기 어려울 수 있다.
잘못된 메서드가 호출될 가능성이 있어, 예기치 않은 동작이나 버그가 발생할 수 있다.
가독성 저하: 많은 오버로딩 메서드는 코드의 가독성을 떨어뜨리고 유지보수를 어렵게 만든다.
고려할 점
메서드 호출 시 어떤 메서드가 호출될지 명확히 알 수 있도록 설계
오버로딩된 메서드를 잘 문서화하여 사용자가 혼란을 겪지 않도록 하자.
오버로딩 대신 다른 이름의 메서드를 사용하는 것도 좋은 방법.
Item 53: 가변인수는 신중히 사용하라
가변인수(varargs)를 사용하면 메서드가 임의의 개수의 인수를 받을 수 있어 유연성이 높아진다.
그러나 잘못 사용하면 성능 저하와 예기치 않은 동작을 초래할 수 있으므로 주의해서 사용하자.
장점
유연성 제공: 메서드가 다양한 개수의 인수를 받을 수 있도록 하여 사용성을 높인다.
가독성: 호출하는 측에서 인수 개수를 명확히 알 수 있으므로 코드 가독성이 높아진다.
간결성: 오버로딩을 줄여 코드가 간결해진다.
주의할 점
가변인수는 배열을 생성하므로 성능에 영향을 미치며, 타입 안전성을 보장하기 어렵다.
가변인수 메서드를 사용할 때는 꼭 필요한 경우에만 사용하고, 가변인수의 타입을 정확히 지정하자.
Item 54: null이 아닌, 빈 컬렉션이나 배열을 반환하라
메서드가 컬렉션이나 배열을 반환할 때 null 대신 빈 컬렉션이나 배열을 반환하는 것이 좋다.
이를 통해 NullPointerException을 방지하고, 코드의 가독성과 간결성을 높일 수 있다.
자바 표준 라이브러리에서 제공하는 메서드나 미리 정의된 상수를 사용하여 빈 컬렉션이나 배열을 반환하는 방법을 고려하자.
장점
NullPointerException 방지: null을 반환하면 호출자가 null 체크를 해야 하므로, 이를 생략했을 경우 NullPointerException이 발생할 수 있어 이를 방지할 수 있다.
코드 간결성: 빈 컬렉션이나 배열을 반환하면 호출자가 null 체크를 하지 않아도 되어 코드가 간결해진다.
일관성: 항상 컬렉션이나 배열을 반환하면 일관성 있는 메서드 계약을 제공할 수 있다.
가독성: 빈 컬렉션이나 배열을 반환하면 코드의 가독성이 향상된다.
방법
null 대신 빈 컬렉션이나 배열을 반환하여 null 검사를 피하자.
Collections.emptyList()나 Collections.emptySet()을 사용하여 빈 컬렉션을 반환.
Item 55: 옵셔널 반환은 신중히 하라
메서드가 값을 반환할 때 null 대신 Optional를 사용하면 null 관련 오류를 줄일 수 있다.
그러나 모든 경우에 Optional을 사용하는 것이 적합하지 않으며, 성능과 사용성을 고려하여 신중히 사용해야 한다.
Optional 장점
명시적 신호: 반환 값이 없을 수 있음을 명시적으로 나타낸다.
NullPointerException 방지: null을 반환하고 이를 처리하지 않아 발생하는 NullPointerException을 방지한다.
가독성: 호출자가 반환 값의 유무를 명확히 알 수 있어 코드의 가독성이 향상된다.
주의할 점
Optional은 유용하지만 성능 저하와 사용상의 복잡성을 야기할 수 있다.
필수적인 반환값에는 Optional을 사용하지 않으며, 컬렉션이나 배열에는 Optional 사용을 지양하자.
Item 56: 공개된 API 요소에는 항상 문서화 주석을 작성하라
공개 API에는 반드시 Javadoc 주석을 작성하여 사용자가 올바르게 이해하고 사용할 수 있게 합니다.
문서화는 코드의 가독성을 높이고, 다른 개발자가 쉽게 이해하고 사용할 수 있게 합니다.
모든 공개 메서드와 클래스에 대해 Javadoc 주석을 작성하고, 예제 코드를 포함시킵니다.
Item 49: 매개변수가 유효한지 검사하라
메서드나 생성자의 모든 매개변수의 유효성을 검사하고, 적절하지 않다면 IllegalArgumentException 등 예외를 던져라.
장점
방법
유의할 점
Item 50: 적시에 방어적 복사본을 만들라
메서드가 외부로부터 받은 가변 객체를 내부에서 사용하거나 반환할 때는 방어적 복사본을 만들자.
장점
방법
유의할 점
Item 51: 메서드 시그니처를 신중히 설계하라
메서드 시그니처를 신중히 설계하면 메서드의 사용성을 높이고, 코드의 가독성, 유지보수성, 재사용성을 향상시킬 수 있다. 이를 위해 메서드 이름, 매개변수 목록, 반환 타입 등을 고려하여 직관적이고 명확하게 설계하는 것이 중요하다.
장점
잘 설계된 메서드 시그니처는 메서드의 사용성을 높이고 유지보수성을 향상시킨다.
방법
Item 52: 오버로딩을 주의하라
오버로딩보다는 메서드 이름을 다르게 하여 혼란을 방지하고, 가독성과 유지보수성을 높이자.
오버로딩을 잘못 사용하면 혼란을 초래하므로 주의해서 사용하자.
고려할 점
Item 53: 가변인수는 신중히 사용하라
가변인수(varargs)를 사용하면 메서드가 임의의 개수의 인수를 받을 수 있어 유연성이 높아진다. 그러나 잘못 사용하면 성능 저하와 예기치 않은 동작을 초래할 수 있으므로 주의해서 사용하자.
장점
주의할 점
Item 54: null이 아닌, 빈 컬렉션이나 배열을 반환하라
메서드가 컬렉션이나 배열을 반환할 때 null 대신 빈 컬렉션이나 배열을 반환하는 것이 좋다. 이를 통해 NullPointerException을 방지하고, 코드의 가독성과 간결성을 높일 수 있다. 자바 표준 라이브러리에서 제공하는 메서드나 미리 정의된 상수를 사용하여 빈 컬렉션이나 배열을 반환하는 방법을 고려하자.
장점
방법
Item 55: 옵셔널 반환은 신중히 하라
메서드가 값을 반환할 때 null 대신 Optional를 사용하면 null 관련 오류를 줄일 수 있다.
그러나 모든 경우에 Optional을 사용하는 것이 적합하지 않으며, 성능과 사용성을 고려하여 신중히 사용해야 한다.
Optional 장점
주의할 점
Item 56: 공개된 API 요소에는 항상 문서화 주석을 작성하라