You will be fine

<이펙티브 자바> 6. 열거 타입과 애너테이션

by BFine
반응형

www.yes24.com/Product/Goods/65551284

 

이펙티브 자바 Effective Java 3/E

자바 플랫폼 모범 사례 완벽 가이드 - Java 7, 8, 9 대응자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브

www.yes24.com

6장

  • 특수 목적 참조 타입 두가지
    • 어노테이션
    • 열거타입

36. int 상수 대신 열거타입을 사용하자

  • static int,String 패턴의 단점

    • 타입 안전 보장이 되지않음
    • 표현력이 안좋음
    • 컴파일러 경고가 뜨지않음
    • String은 오해 할 수 있음
  • Enum 타입

    • 자체는 클래스 형태, public 생성자를 제공하지 않음

    • 상수 하나당 자신의 인스턴스를 만들어 public static final 필드로 공개

    • 싱글턴을 일반화한 형태

    • 각자 이름공간이 존재

    • 메서드, 필드, 인터페이스 구현가능

    • 필드를 특정 데이터와 연결지으려면 생성자에서 데이터를 받아 인스턴스 필드에 저장하면 됨

    • 열거 타입마다 메서드 정의 가능

      PLUS {public double apply(double x, double y){return x + y;}},
      MINUS{public double apply(double x, double y){return x - y;}}
      
      public abstract double apply(double x, double y); // abstract로 재정의 해야함
    • 필요한 원소를 컴파일타임에 다알 수 있는 상수 집합 이라면 항상 열거 타입을 사용하자

  • 전략 enum패턴

    enum PayrollDay{
      MONDAY(WEEKDAY),SUNDAY(WEEKEND);
    
      private final PayType payType;
    
      PayrollDay(PayType payType){
        this.payType = payType;
      }
      enum PayType{
           WEEKDAY{...},
        WEEKEND{...};
      }
    }
    • 상수별 동작을 혼합해 넣을때는 switch문이 좋은 선택이 될수는 있다.

35. ordinal 메서드 대신 인스턴스 필드를 사용하자

  • ordinal 열거타입에서 몇번째인지 알려주는 메서드

36. 비트필드 대신 EnumSet을 사용하자

  • EnumSet 내부는 비트 벡터로 구현
  • 아직 불변이 아니므로 Colletions.unmodifiableSet으로 감싸 사용할 수도 있다.

37. ordinal 인덱싱 대신 EnumMap을 사용하자

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

  • 열거 타입을 확장하는건 좋지 않지만 연산코드 정도는 인터페이스로 가능하다

    • 열거 타입은 확장할 수 없고 인터페이스로 가능하다
  • <T extends Enum<T> & Operation> class 객체가 열거 타입인 동시에 Operation의 하위 타입이어야 한다.

39. 명명 패턴보다 애너테이션을 사용하자

  • 명명 패턴 단점

    • 오타나면 안됨
    • 의도하지 않은 곳에서 사용될 수 있음
    • 매개변수로 전달하기 힘듬
  • JUnit 어노테이션

    • 어노테이션 선언에 다는 어노테이션을 메타어노테이션이라고 한다.
    @Retention(RetentionPolicy.RUNTIME) // @Test가 런타임에도 유지 되어야한다. 
    @Target(ElementType.METHOD) // 메서드에만 사용돼야한다.
    public @interface Test{
    }
    
    public static void main(String[] args){ // @Test 처리 
      Class<?> testClass = Class.forName(args[0]);
      for(Method m : testClass.getDeclareMethods()){
        if(m.isAnnotationPresent(Test.class)){
        }
      }
    }
    
    @Retention(RetentionPolicy.RUNTIME) // @Test가 런타임에도 유지 되어야한다. 
    @Target(ElementType.METHOD) // 메서드에만 사용돼야한다.
    public @interface ExceptionTest{
      Class<? extends Throwable> value() // 매개변수하나
      Class<? extends Throwable>[] value{} // 배열형태 {Exception2,Exception2,...}  
      -> java8에서는 @Repeatable 등장(Container를 재정의해야함) // @ExceptionTest 여러개 달아서 가독성 업 
    }

40. @Override 어노테이션을 일관되게 사용하자

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

  • 아무 메서드가 없고 구현클래스에 특정속성을 가지는 것을 표시하는 인터페이스
  • vs 마커 어노테이션
    • 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸수 있지만 어노테이션은 불가능
    • 적용 대상을 더 정밀하게 지정
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기