본문 바로가기
IT/Java

이펙티브 자바 6장 - enum 2

by 봉즙 2020. 1. 3.

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

 

명명 패턴은 효과적인 방법이지만 단점을 가지고 있다.

첫째, 오타에 대한 주의가 필요하다.
둘째, 올바른 프로그램 요소에서만 사용된다는 보증할 방법이 존재하지 않는다.
셋째, 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다.

마킹 에너테이션 : @Test 애너테이션과 같은 애너테이션은 아무 매개변수 없이 단순히 대상에 마킹하는 것을 가리킨다.

 

자바 8에서는 여러 개의 값을 받는 애너테이션을 다른 방식으로도 만들수 있다. 배열 매개변수를 사용하는 대신 애너테이션에 @Repeatable 메타애너테이션을 다는 방식이며, @Repeatable을 단 애너테이션은 하나의 프로그램 요소에 여러번 달 수 있다. 하지만 주의할 점이 있다.

첫번째, @Repeatable을 단 애너테이션을 반환하는 컨테이너 애너테이션을 하나 더 정의하고, @Repeatable에 이 컨테이너 애너테이션의 class 객체를 매개변수로 전달해야 한다.
두번째, 컨테이너 애너테이션은 내부 애너테이션 타입의 배열을 반환하는 value 메서드를 정의해야한다.
세번째, 컨테이너 애너테이션 타입에는 적절한 보존 정책(@Retention)과 적용 대상(@Targe)을 명시해야 한다. 그렇지 않으면 컴파일되지 않는다.

반복 가능 애너테이션을 여러개 사용하면 구분하기 위해 컨테이너 애너테이션 타입이 적용된다.

애너테이션으로 할 수 있는 일을 명명 패턴으로 처리할 이유는 없으며, 자바사용시에는 애너테이션 타입들을 사용하는 것이 좋다.

 

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

상위 클래스의 메서드를 재정의 하려는 모든 메서드에 @Override 에너테이션을 달면 실수 발생시 컴파일러가 그것에 대해 알려주며 예외는 한가지만 존재하게 된다. 구체 클래스에서 상위클래스의 추상메서드를 재정의한 경우엔 달지 않아도 된다. 하지만 사용해서 문제가 생기진 않는다.

 

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

 

마커 인터페이스 : 아무 메서드도 담지 않고 있으며, 자신을 구현하는 크래스가 특정 속성을 가짐을 표시해주는 인터페이스
ex) Serializable : 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 직렬화 할 수 있다고 알려준다.

마커 인터페이스가 마커 애너테이션 보다 나은 점 2가지

첫번째, 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 애너테이션은 그렇지 않다.
마커 인터페이스 사용시 런타임시 에러를 발견한 수 있다.

두번째, 적용대상을 더욱 정밀하게 지정할 수있다.

 

마커 애너테이션이 마커 인터페이스보다 나은 점은 애너테이션 시스템의 지원을 받는 것이다.

각자의 쓰임이 존재하며 새로 추가하는 메서드 없이 단지 타입 정의가 목적이라면 마커 인터페이스를 선택하며 클래스나 인터페이스이외의 프로그램 요소에 마킹하거나, 애너테이션을 사용하는 프레임워크의 일부로 그 마커를 편입하자 한다면 마커 애너테이션이 올바른 선택이다.

'IT > Java' 카테고리의 다른 글

이펙티브 자바 8장 - 메서드  (0) 2020.01.06
이펙티브 자바 - 7장 람다와 스트림  (0) 2020.01.03
이펙티브 자바 6장 - enum  (0) 2019.12.12
이펙티브 자바 5장 - 제네릭 2  (0) 2019.12.05
이펙티브 자바 5장  (0) 2019.12.03

댓글