[Java] Effective Java 정리 - (Item 34 ~ Item 41)

황시준·2023년 8월 11일

1. int 상수 대신 열거 타입을 사용하라.

  • 열거 타입은 확실히 정수 상수보다 뛰어나다.
  • 더 읽기 쉽고 안전하고 강력하다.
  • 대다수 열거 타입이 생성자나 메서드 없이 쓰이지만, 각 상수를 특정 데이터와 연결짓거나 상수마다 다르게 동작하게 할 때는 필요하다.
  • 드물게는 하나의 메서드가 상수별로 다르게 동작해야 할 때도 있다.
  • 이런 여려거 타입에서는 switch문 대신 상수별 메서드 구현을 사용하자.
  • 열거 타입 상수 일부가 같은 동작을 공유한다면 전략 열거 타입 패턴을 사용하자.

2. ordinal 메서드 대신 인스턴스 필드를 사용하라.

대부분의 열거 타입 상수는 자여ㅕㄴ스럽게 하나의 정수값에 대응한다.
그리고 모든 열거 타입은 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 ordinal이라는 메서들를 제공한다.
이런 이유로 열거 타입 상수와 연결된 정수값이 필요하면 ordinal메서드를 이용하고 싶은 유혹에 빠진다.
하지만, 열거 타입의 위치기 바뀌면 ordinal메서드를 통해 반환되는 값도 바뀐다.
이 경우 개발자가 예상치 못한 문제가 발생할 수 있다.
열거 타입 상수에 연결된 값은 ordinal 메서드로 앋지말고, 인스턴스 필드에 저장하자.

3. 비트 필드 대신 EnumSet을 사용하라.

  • 열거할 수 있는 타입을 한데 모아 집합 형태로 사용한다고 해도 비트 필드를 사용할 이유는 없다.
  • EnumSet 클래스가 비트 필드 수준의 명료함과 성능을 제공하고 item 34에서 설명한 열거 타입의 장점까지 선사하기 때문이다.
  • EnumSet의 유일한 단점이라면 부변 EnumSet을 만들 수 없다는 것이다.

4. ordinal 인덱싱 대신 EnumMap을 사용하라.

  • 배열의 인덱스를 얻기 위해 ordinal을 쓰는 것은 일반적으로 좋지 않으니, 대신 EnumMap을 사용하라.
  • 다차원 관계는 EnumMap<..., EnumMap<...>> 을ㄹ로 표현하라.
  • "애플리케이션 프로그래머는 Enum.ordinal을 사용하지 말아야 한다.

5. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라.

  • 열거 타입 자체는 확장할 수 없지만, 인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 같은 효과를 낼 수 있다.
  • 이렇게 하면 클라이언트는 이 인터페이스를 구현해 자신만의 열거 타입을 만들 수 있다.
  • 그리고 API가 인터페이스 기반으로 작성되었다면 기본 열거 타입의 인스턴스가 쓰이는 모든 곳을 새로 확장한 열거 타입의 인스턴스로 대처에 사용할 수 있다.

6. 명명 패턴보다 애너테이션을 사용하라.

  • 애너테이션으로 할 수 있는 일을 명명 패턴으로 처리할 이유는 없다.

7. @Override 애너테이션을 일관되게 사용하라.

  • 재정의한 모든 메서드에 @Override 애너테이셔녀을 의식적을로 달면 우리가 실수했을 떄 컴파일러가 바로 알렬준다.
  • 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우엔 이 애너테치션을 달지 않아도 된다.

8. 정의하려는 것이 타입이면 마커 인터페이스를 사용하라.

  • 마커 인터페이스와 애너테이션을 각자의 쓰임이 있다.
  • 새로 추가하는 메서드 없이 단지 타입 정의가 목적이라면 마커 인터페이스를 선택하자.
  • 클래스나 인터페이스 외의 프로그램 요소에 마킹해야 하거나, 애너테이션을 적극 활용해야 하는 프레임워크의 일부로 그 마커를 편입시키고자 한다면 애너테이션이 올바른 선택이다.
  • 적용 대상이 ElementType.Type인 마커 애너테이션을 작성하고 있다면, 잠시 여유를 갖고 정말 애너테이션으로 구현하는게 옳은지, 마커 인터페이스가 나을지 생각해보자.
profile
하고싶은게 많은 newbie

0개의 댓글