Java

[Effective Java] 8-1. 메서드

noahkim_ 2024. 12. 31. 21:37

조슈아 블로크 님의 "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 보다 열거 타입으로

  • 의도를 명확히 파악할 수 있음
  • 옵션이 추가될 경우 확장 가능