- Annotation 이란?
- 본질적인 목적은 소스 코드에 메타데이터를 표현하는 것이다.
(메타데이터 : 데이터에 대한 데이터, 즉 어떤 목적을 가지고 만들어진 데이터)
- 리플렉션(reflection)을 이용하면 어노테이션 지정만으로도 원하는 클래스를 주입하는 것 등이 가능하다.
(리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다.)
- 비지니스 로직에는 영향을 주지 않지만, 해당 타겟의 연결 방법이나 소스코드의 구조를 변경 할 수 있다.
- Annotation의 종류에는 빌트인 어노테이션, 메타 어노테이션, 커스텀 어노테이션이 있다.
2. 빌트인(Built-in) 어노테이션
- 자바 SDK에서 지원하는 어노테이션으로 @Override, @Deprecated, @SuppressWarnings 등이 있다.
- @Override : 어노테이션은 현재 메소드가 수퍼클래스의 메소드를 오버라이드한 메소드임을 명시한다.
만약 수퍼클래스 또는 구현해야할 인터페이스에 해당 메소드가 없으면 컴파일러가 에러를 발생시킨다.
- @Deprecated : 해당 메소드가 더 이상 사용되지 않음을 표시한다.
만약 사용할 경우 컴파일 경고를 발생시킨다.
- @SuppressWarnings : 선언한 곳의 컴파일 경고를 무시하도록 한다.
Object형을 Element로 하는 컬렉션을 사용하면 컴파일러 경고가 발생하는데, 이 어노테이션을
사용하여 프로그래머의 의도적인 Object형 사용임을 알려 경고를 제거할 수 있다.
- @SafeVarargs : 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시한다.
- @FunctionalInterface : 함수형 인터페이스를 지정하는 어노테이션.
만약 메소드가 존재하지 않거나, 1개 이상의 메소드가 존재할 경우 컴파일 오류를 발생시킨다.
3. 메타(Meta) 어노테이션
- @Retention : 자바 컴파일러가 어노테이션을 다루는 방법과 관련이 있다.
소스파일, 클래스파일, 런타임 중 어느 시점까지 어노테이션을 보유하고 있을 것인지를 결정한다.
- @Target : 어노테이션이 적용할 위치를 선택한다. @Target (ElementType.~)
- ElementType.PACKAGE : 패키지 선언시
- ElementType.TYPE : 타입 선언 시
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언시
- ElementType.CONSTRUCTOR : 생성자 선언시
- ElementType.FIELD : 멤버변수 선언시
- ElementType.LOCAL_VARIABLE : 지역 변수 선언시
- ElementType.METHOD : 메소드 선언시
- ElementType.PARAMETER : 파라미터 선언시
- ElementType.TYPE_PARAMETER : 파라미터 타입 선언시
- ElementType.TYPE_USE : 타입선언시
- @Documented : 해당 어노테이션을 Javadoc에 포함시킨다.
- @Inherited : 어노테이션의 상속을 가능하게 한다.
- @Repeatable : 연속적으로 어노테이션을 선언할 수 있게 해준다.
(커스텀 어노테이션은 다음 글 : )
'Java' 카테고리의 다른 글
정적 펙터리 메서드 (static factory method) (0) | 2019.03.27 |
---|---|
점층적 생성자 패턴, 자바빈즈 패턴, 빌더 패턴 (0) | 2019.03.13 |