- 백기선 - JAVA STUDY/WEEK122021년 03월 06일 14시 21분 29초에 업로드 된 글입니다.작성자: jCurve728x90반응형
목표
자바의 애노테이션에 대해 학습하세요.
학습할 것 (필수)
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
애너테이션
우선,
애너테이션이 맞다.
사실 애노테이션이든 애너테이션이든 어노테이션이든 소통하는데 이상없으면 상관 없지만
현지인 발음으로 부르는게 더 좋을 것 같다. ^^
애너테이션은 기본적으로 주석이라는 뜻을 가지지만 우리가 일반적으로 알고 있는 주석과는 약간 차이가 있다.(코드를 작성할 수 있다는 점, 즉 뭔가를 할 수 있다)
애너테이션은 보통 컴파일러에게 문법 오류를 체크하게 하거나 빌드시 코드를 자동 생성, 런타임 시점에 특정 동작을 하도록 할 때 보통 사용 가능하다.
우리가 평소에 사용하는 @Override도 문법 오류 체크를 위한 애너테이션이고
getter,setter등을 자동으로 생성해주는 편리한 라이브러리인 lombok도 애너테이션을 사용하고
런타임 시점에 특정 동작을 하는것에 대해 스프링의 AOP 등이 있다.
애너테이션에는 메타 데이터라는 것이 있는데 이는 "데이터를 위한 데이터" 라고 생각하면 된다.
따라서 메타 애너테이션이라 하믄 애너테이션을 설명하는 애너테이션 정도 이다.
애너테이션 정의하는 방법
public @intergace Anno{}
이렇게 정의하면 된다.
애너테이션은 java.lang.annotation.Annotation 에 상속되어 있다.
인터페이스로 구성되었기 때문에 굳이 구현한다면 implements혹은 익명클래스로 만들어야한다.
◾ 분류
- Maker 어노테이션 : 멤버 변수가 없고 컴파일러에게 의미를 전달하기 위한 표식으로 사용되는 어노테이션 (ex. @Override )
- Single-value 어노테이션 : 멤버로 단일변수를 갖고 데이터를 전달할 수 있는 어노테이션
- Full 어노테이션 : 둘 이상의 변수를 갖는 어노테이션으로 데이터를 **키 = 값**형태로 전달한다.
빌트인 어노테이션
Java에 내장되어 있는 어노테이션으로 컴파일러를 위한 어노테이션
-
Override
현재 메서드가 슈퍼 클래스의 메서드를 오버라이드한 것임을 컴파일러에게 명시해준다.
메서드가 슈퍼클래스에 없다면 에러를 발생시기 때문에 오타와 같은 실수도 잡을 수 있다.
-
Deprecated
마커 어노테이션으로 다음 버전에 지원되지 않을 수도 있기 때문에 앞으로 사용하지 말라고 경고를 알린다.
-
SuppressWarning
경고를 제거하는 어노테이션으로 개발자가 의도를 가지고 설계를 했는데 컴파일은 이를 알지 못하고 컴파일 경고를 띄울 수 있기 때문에 이를 제거하는 목적이다.
-
SafeVarargs
Java 7이상에서 사용가능하고 제네릭같은 가변인자 매개변수 사용시 경고를 무시한다
-
FunctionalInterface
Java 8이상에서 사용가능하고 컴파일러에게 함수형 인터페이스라는 것을 알리는 어노테이션이다. (week10에서 배운 Runnable이 해당된다)
메타 애너테이션
애너테이션에 사용되는 에너테이션으로 에너테이션을 정의(설명)하기 위해 사용된다.
-
@Retention
애너테이션이 유지되는 기간(life time)을 설정하는 애너테이션
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }
-
- SOURCE : 소스파일에만 존재하고, 클래스파일에는 존재x, 컴파일러에 의해 버려진다.
- CLASS : 클래스파일에는 존재하지만 런타임 시에 유지할 필요 없다는 것을 알리고 이 값이 default이다.
- RUNTIME : 클래스파일에도 존재하고 런타임애 VM에 의해 유지되어 리플랙션을 통해 클래스 파일의 정보를 읽어 처리 가능하다.
-
@Target
애너테이션이 적용가능한 대상(동작 대상)을 지정한다.
만약 다른 타입이 온다면 컴파일 에러를 띄운다.
아래와 같은 ElmentType이라는 enum을 통해 지정한다. ( @Target(ElemntType.~)와 같이 사용 )
public enum ElementType { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER, TYPE_USE, MODULE, @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS,essentialAPI=true) RECORD_COMPONENT; }
-
- 기존
- TYPE : Class, Interface(애너테이션 타입 포함), enum, jdk14에 생긴 record
- FIELD : 필드 값(프로퍼티), enum 상수값
- METHOD : 메서드
- PARAMETER : 메서드 파라미터 (매개 변수)
- CONSTRUCTOR : 생성자
- LOCAL_VARIABLE : 지역 변수
- ANNOTATION_TYPE : 애너테이션
- PACKAGE : 자바 패키지
- jdk 1.8 이후 추가
- TYPE_PARAMETER : 타입 매개 변수
- TYPE_USE : 타입 사용 //jdk 9 이후
- MODULE : 모듈
- jdk 14이후 추가
- RECORD_COMPONENT : Record 컴포넌트
- 기존
-
@documented
애너테이션의 정보가 javadoc의 문서에 포함되도록 하는 어노테이션
-
@Inherited
자식 클래스에게도 어노테이션이 상속되도록 하는 어노테이션
-
@Repeatable
어노테이션을 반복적으로 선언할 수 있게 하는 어노테이션
애너테이션 프로세서
런타임시에 리플랙션을 사용하는 애너테이션과는 달리 컴파일 타임에 이루어진다.
컴파일 타임에 애너테이션들을 프로세싱하는 javac에 속한 빌드 툴로 애너테이션의 소스코드를 분석하고 처리하기 위해 사용되는 훅이다.
보일러플레이트 코드를 제거하는데 도움이 된다.( **AbstractProcessor**를 implements하여 구현체를 만들 수 있으며 Lombok의 @Getter, **@Setter**와 같은 애너테이션을 이용하는 것만으로도 컴파일 타임에 알아서 getter/setter를 만들어주는 방식으로 보일러플레이트 코드 제거 )
반응형'JAVA' 카테고리의 다른 글
백기선 - JAVA STUDY/WEEK14 (0) 2021.03.06 백기선 - JAVA STUDY/WEEK13 (0) 2021.03.06 백기선-JAVA STUDY/WEEK11 (0) 2021.02.21 백기선-JAVA STUDY/WEEK10 (0) 2021.02.21 백기선-JAVA STUDY/WEEK9 (0) 2021.01.29 댓글