조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.
1. 매개변수가 유효한지 검사하라
- 메서드 몸체가 실행되기 전에 오류 검출하기
Null Check
java.util.Objects.requireNonNull
- 유연하고 사용하기 편함
- 입력을 그대로 반환
Assert
private static void sort(long[] a, int offset, int length) {
assert a != null;
assert offset >= 0 && offset <= a.length;
assert length >= 0 && length <= a.length;
// ...
}
- 인자의 값 유효성 체크
2. 적시에 방어적 복사본을 만들라
자바는 불변식을 지켜주는 언어
메모리 충돌 오류
- 버퍼 오버런, 배열 오버런, 와일드 포인터
프로그래밍 방식
- 클라이언트가 불변식을 깨뜨리려 한다 가정하고 방어적으로 프로그래밍 해야 함
- 최근들어 해커들이 악의적으로 시스템 보안을 뚫으려 하는 시도가 늘어났음
가변 인스턴스
Date
Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78);
- Date 객체는 가변 객체이므로 외부로부터 Period 내부의 상태가 변경될 수 있음
불변 객체 사용하기 (Java 8)
- Instant
- LocalDateTime
- ZonedDateTime
불변 객체 사용하기 (Java 7)
public Period(Date start, Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
}
- 생성자에서 받은 가변 매개변수 각각을 방어적으로 복사해야 함
- clone()을 호출할 경우, 정확히 상태를 복사하지 않을 수 있음
3. 메서드 시그니처를 신중히 설계하라
메서드 이름 신중히 짓기
- 일관적이고
- 널리 쓰이는 이름 사용
- 긴이름 지양
편의 메서드 너무 많이 만들지 말기
- 정말 필요한 메서드만 생성하기
매개변수 목록은 짧게 유지
- 메서드 호출을 복잡하게 만듬
- 4개 이하로 유지
- 만다면, 객체로 그룹화하거나, 빌더패턴을 고려
직교성 유지
- 메서드와 매개변수는 서로 독립적이도록
매개변수의 타입을 인터페이스로 받기
- 다양한 구현체를 받을 수 있어 확장성 및 유지보수성이 향상됨
boolean 보다 열거 타입으로
- 의도를 명확히 파악할 수 있음
- 옵션이 추가될 경우 확장 가능
'Java' 카테고리의 다른 글
[Effective Java] 9-1. 일반적인 프로그래밍 원칙 (0) | 2025.01.01 |
---|---|
[Effective Java] 8-2. 메서드 (0) | 2024.12.31 |
[Effective Java] 7-3. 람다와 스트림 (0) | 2024.12.31 |
[Effective Java] 7-2. 람다와 스트림 (0) | 2024.12.31 |
[Effective Java] 7-1. 람다와 스트림 (1) | 2024.12.31 |