이펙티브 자바 6장: 열거 타입과 애너테이션

Adam·2024년 8월 7일
0

이펙티브 자바

목록 보기
5/10
post-thumbnail

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

정수 열거패턴: 타입 안전을 보장할 방법이 없고, 표현력도 좋지 못하다

열거타입 장점

  1. 열거 타입 선언으로 만들어진 인스턴스들은 딱 하나씩만 존재함이 보장
  2. 컴파일 타입 안전성을 제공
  3. 각자의 이름 공간이 있어서 이름이 같은 상수도 공존

열거 타입 상수 각각을 특정 데이터와 연결지으려면 생성자에서 데이터를 받아 인스턴스 필드에 저장하면 된다

필요한 원소를 컴파일타임에 다 알 수 있는 상수 집합이라면 항상 열거 타입을 사용하는게 좋다

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

ordinal 메서드: 해당 상수가 열거 타입에서 몇 번째 위치인지 반환

ordinal에 의존을 하게 된다면 해당 열거 타입에 변동이 생길 때 오작동이 발생할 수 있다

열거 타입 상수에 연결된 값은 ordinal 메서드로 얻지 말고 인스턴스 필드에 저장하는 것이 해결책

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

비트 필드 장점

비트별 연산을 사용해 합집합과 교집합 같은 집합 연산을 효율적으로 수행할 수 있다

비트필드 단점

정수열거의 단점이 그대로 나타난다

비트 필드 값이 그대로 출력되면 해석하기 어려움

비트 필드 하나에 녹아 있는 모든 원소를 순화하기도 까다롭다

최대 몇 비트가 필요한지 API 작성 시 미리 예측하여 적절한 타입을 선택해야 한다

EnumSet은 비트 필드 수준의 명료함과 성능을 제공한다

하지만 불변 EnumSet을 만들지 못한다는 단점이 있다

ordinal 인덱싱 대신 Enumap을 사용하라

EnumMap의 장점

안전하지 않은 형변환을 사용하지 않는다

인덱스를 계산하는 과정에서 오류가 날 가능성도 원천 봉쇄

배열의 인덱스를 얻기 위해서 ordinal 대신 EnumMap을 사용해라

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

타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있지만, 열거 타입은 그러지 못한다

인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 확장의 효과를 낼 수 있다

해당 방법으로 클라이언트는 이 인터페이스를 구현해 자신만의 열거타입을 만들 수 있다

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

명명 패턴의 단점

  1. 오타가 나면 오류를 잡기 힘들다
  2. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다
  3. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다

애너테이션을 사용하면 코드 가독성을 높일 수 있으나 애너테이션을 선언하고 이를 처리하는 부분에서 코드 양이 늘어나며, 코드 처리가 복잡해저 오류가 날 가능성이 커진다

일반 프로그래머라면 애너테이션 타입을 직접 정의할 일은 거의 없지만 자바가 제공하는 애너테이션 타입들을 사용해야 한다

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

상위 타입의 메서드를 재정의 했음을 의미

구체 클래스에서 상위 클래스의 추상 메서드를 재정의할 때를 제외하고 재정의 하려는 모든 메서드에 @Override 애너테이션을 달아야 한다

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

마커 인터페이스: 아무 메서드도 담지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스

마커 인터페이스 장점

  1. 마커 인터페이스를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있다
  2. 적용 대상을 더 정밀하게 지정할 수 있다
profile
Keep going하는 개발자

0개의 댓글