8장. 메서드

Red Culture·2021년 5월 30일
  • 아이템 49: 매개변수가 유효한지 검사하라
    -자바 7에 추가된 java.util.Object.requireNotNull 메서드를 이용하면 더 이상 null 검사를 수동으로 하지 않아도 된다.
    -public이 아닌 메서드라면 단언문을 사용해 매개변수 유효성을 검증할 수 있음
    -메서드는 최대한 범용적으로 설계해야함
    -메서드나 생성자를 작성할 때는 그 매개변수들에 어떤 제약이 있을지 생각해야함, 그 제약들을 문서화하고 메서드 코드 시작 부분에서 명시적으로 검새해야함.

  • 아이템 50: 적시에 방어적 복사본을 만들라
    -클라이언트가 여러분의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야한다.
    -어떤 객체든 그 객체의 허락 없이는 외부에서 내부를 수정하는 일은 불가능하도록 해야한다.
    -Date는 낡은 API이니 새로운 코드를 작성할 때는 더 이상 사용하면 안된다.
    -> Date 대신 불변인 Instant (혹은 LocalDateTime이나 ZonedDateTime을 사용해도 됨)
    -생성자에서 받은 가변 매개변수 각각을 방어적으로 복사해야함.
    -> 매개변수의 유효성을 검사하기 전에 방어적 복사본을 만들고, 복사본으로 유효성 검사을 하자.
    -> 방어적 복사본을 만들 때 clone 메서드를 사용해서는 안 된다.
    -생성자와 달리 접근자 메서드에서는 방어적 복사에 clone을 사용해도 된다. 그래도 인스턴스를 복사하는 데는 일반적으로 생성자나 정적 팩터리를 쓰는 게 좋다.

  • 아이템 51: 메서드 시그니처를 신중히 설계하라
    -메서드 이름을 신중히 짓자.
    -편의 메서드를 너무 많이 만들지 말자.
    -매개변수 목록은 짧게 유지하자.
    -직교성이 높다
    -> 공통점이 없는 기능들이 잘 분리되어 있다 혹은 기능을 원자적으로 쪼개 제공한다.
    (마이크로 서비스 아키텍처는 직교성이 높고, 모놀리식 아키텍처는 직교성이 낮다)
    -매개변수 타입으로는 클래스보다는 인터페이스가 낫다.
    -boolean보다는 원소 2개짜리 열거 타입이 낫다.
    -> Thermometer.newInstance(true) 보다는 Thermometer.newInstance(TemperatureScale.CELSIUS)
    -긴 매개변수 목록을 짧게 줄여주는 세 가지 기술
    1) 여러 메서드로 쪼갠다
    2) 매개변수 여러 개를 묶어주는 도우미 클래스를 만든다.
    -도우미 클래스는 정적 멤버 클래스로 둔다.
    3) 객체 생성에 사용한 빌더 패턴을 메서드 호출에 응용한다.
    -모든 매개변수를 하나로 추상화한 객체를 정의
    -클라이언트에서 이 객체의 세터 메서드를 호출해 필요한 값을 설정하게함

  • 아이템 52: 다중정의는 신중히 사용하라
    -재정의한 메서드는 동적으로 선택되고, 다중정의한 메서드는 정적으로 선택된다.
    -메서드 재정의: 상위 클래스가 정의한 것과 똑같은 시그니처의 메서드를 하위 클래스에서 다시 정의한 것
    -다중 정의된 메서드 사이에서는 객체의 런타임 타입은 전혀 중요치 않고, 선택은 컴파일타임에, 오직 매개변수의 컴파일타임 타입에 의해 이뤄진다.
    -안전하고 보수적으로 가려면 매개변수 수가 같은 다중정의는 만들지 말자.
    -가변인수(varargs)를 사용하는 메서드라면 다중정의를 아예 하지 말아야 한다.
    -메서드를 다중정의할 때, 서로 다른 함수형 인터페이스라도 같은 위치의 인수로 받아서는 안된다.

  • 아이템 53: 가변인수는 신중히 사용하라
    -인수 개수가 일정하지 않은 메서드를 정의해야 한다먄 가변인수가 반드시 필요하다.
    -필수 매개변수는 가변인수 앞에 두고, 가변인수를 사용할 때는 성능 문제까지 고려하자.

  • 아이템 54: null이 아닌, 빈 컬렉션이나 배열을 반환하라
    -컬렉션이나 배열 같은 컨테이너가 비었을 때 null을 반환하는 메서드를 사용할 때면 항시 이와 같은 방어코드를 넣어줘야한다.
    -빈 '불변' 컬렉션을 반환하는 것이다. 불변 객체는 자유롭게 공유해도 안전하기 때문이다.
    -Collections.emptyList메서드, Collections.emptyMap이 그 예이다.
    -배열도 마찬가지로 절대 null을 반환하지 말고 길이가 0인 배열(불변)을 반환하라.

  • 아이템 55: 옵셔널 반환은 신중히 하라
    -옵셔널을 반환하는 메서드에서는 절대 null을 반환하지 말자.
    -null을 반환하거나 예외를 던지는 대신 옵셔널 반환을 선택해야 하는 기준은 무엇인가?
    -> 옵셔널은 검사 예외와 취지가 비슷하다. 즉, 반환값이 없을 수도 있음을 API 사용자에게 명확히 알려준다.
    -옵셔널은 기본값을 정해둘 수 있고, 원하는 예외를 던질 수 있고, 항상 값이 채워져있다고 가정할 수 있다.
    -자바9에서는 Optional에 stream() 메서드가 추가되었다. 이 메서드는 Optional을 stream으로 변환해주는 어댑터다. 옵셔널에 값이 있으면 그 값을 원소로 담은 스트림으로, 값이 없다면 빈 스트림으로 변환한다.
    -컬렉션, 스트림, 배열, 옵셔널 같은 컨테이너 타입은 옵셔널로 감싸면 안 된다.
    -int, long, double 전용 옵셔널 클래스들(OptionalInt, OptionalLong, OptionalDouble)이 있기 때문에 박싱된 기본 타입을 담은 옵셔널을 반환하는 일은 없도록 하자.

  • 아이템 56: 공개된 API 요소에는 항상 문서화 주석을 작성하라
profile
자기 개발, 학습 정리를 위한 블로그

0개의 댓글