Annotation(어노테이션)은 소스 코드에 정보를 제공하는 메타데이터로 주석처럼 선언하여 사용합니다.
1. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.home.project.test2"를 선택한 후 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Package]를 클릭하여 "Name"의 기존 패키지명에 ".annotation"를 추가하고 "Finish"버튼을 클릭합니다. 추가된 "com.hom.project.test2.annotation"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Annotation]를 클릭합니다.
"New Annotation Type"창이 나타납니다.
"Name"에 "TestAnnotation"를 입력하고 "@Retention"은 "Runtime", "@Target"은 "Type", "Method"를 선택하고 "Finish"버튼을 클릭합니다.
"@Retention"은 어노테이션의 보유 정책(유지되는 지점)을 설정합니다.
- "Source" : 컴파일되기전 소스(.java)에만 어노테이션을 유지합니다.
- "Class" : 컴파일러가 컴파일된 클래스(.class)을 참조할때까지 어노테이션을 유지합니다.
- "Runtime" : 컴파일된 클래스(.class)에 어노테이션을 유지합니다. 그리고 JVM에서 Reflection(리플렉션)을 이용해서 어노테이션을 인식할 수 있습니다.
"@Target"은 어노테이션이 적용될 대상을 설정합니다.
- "Type" : 클래스/인터페이스에 적용
- "Field" : 클래스 맴버 변수에 적용
- "Method" : 클래스 메소드(클래스 함수)에 적용
- "Parameter" : 클래스 메소드(클래스 함수)의 파라메타(매개 변수)에 적용
- "Constructor" : 클래스 생성자에 적용
- "Local variable" : 클래스 메소드(클래스 함수)의 지역 변수에 적용
- "Annotation type" : 어노테이션 선언에 적용
- "Package" : 패키지에 적용
- "Type parameter" : 클래스/인터페이스를 파라메타로 사용하는 곳에 적용 (JDK8이상)
- "Type use" : 클래스/인터페이스를 사용하는 곳에 적용 (JDK8이상)
- "Module" : 모듈에 적용 (JDK9이상)
- "Record component" : 레코드 구성요소에 적용 (JDK14이상)
클래스 명 앞에 "@interfacce"가 붙어서 어노테이션 클래스임이 선언됩니다.
"@Target" 유형별 예제입니다.
- "TYPE" : 클래스에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(TYPE)
@Retention(RUNTIME)
public @interface TestAnnotation {
}
클래스에 적용합니다.
@TestAnnotation
public TestClass() {}
- "FIELD" : 클래스 맴버 변수에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(FIELD)
@Retention(RUNTIME)
public @interface TestAnnotation {
}
클래스 맴버 변수에 적용합니다.
public class TestClass {
@TestAnnotation
private String testData;
}
- "Method" : 클래스 메소드(클래스 함수)에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(METHOD)
@Retention(RUNTIME)
public @interface TestAnnotation {
public String value() default "";
}
클래스 메소드(클래스 함수)에 적용합니다.
public TestClass() {
@TestAnnotation(value = "")
public void TestMethod() {}
}
- "PARAMETER" : 클래스 메소드(클래스 함수)의 파라메타(매개 변수)에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(PARAMETER)
@Retention(RUNTIME)
public @interface TestAnnotation {
public String value() default "";
}
클래스 메소드(클래스 함수)의 파라메타(매개 변수)에 적용합니다.
public TestClass() {
public void TestMethod(@TestAnnotation(value = "") String param) {}
}
- "CONSTRUCTOR" : 클래스 생성자에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(CONSTRUCTOR)
@Retention(RUNTIME)
public @interface TestAnnotation {
}
클래스 생성자에 적용합니다.
public TestClass() {
@TestAnnotation
public TestClass() {}
}
- "LOCAL_VARIABLE" : 클래스 메소드(클래스 함수)의 지역 변수에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(LOCAL_VARIABLE)
@Retention(RUNTIME)
public @interface TestAnnotation {
}
클래스 메소드(클래스 함수)의 지역 변수에 적용합니다.
public TestClass() {
public TestMethod() {
@TestAnnotation String test = "";
}
}
- "ANNOTATION_TYPE" : 어노테이션 선언에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(ANNOTATION_TYPE)
@Retention(RUNTIME)
public @interface TestTypeAnnotation {
ElementType[] value();
}
어노테이션 선언에 적용합니다.
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(LOCAL_VARIABLE)
@Retention(RUNTIME)
@TestTypeAnnotation(TestType.TEST)
public @interface TestAnnotation {
}
- "PACKAGE" : 패키지에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.PACKAGE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(PACKAGE)
@Retention(RUNTIME)
public @interface TestPackageAnnotation {
public String value() default "";
}
패키지에 적용합니다.
@TestPackageAnnotation(version="1.0.0")
package com.home.project.test2.service;
public TestClass() {}
- "TYPE_PARAMETER" : 클래스/인테페이스를 변수로 사용하는 곳에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.TYPE_PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(TYPE_PARAMETER)
@Retention(RUNTIME)
public @interface TestAnnotation {
}
제네릭에 적용합니다.
public class TestClass<@TestAnnotation T> {}
List<@TestAnnotation String> testList;
List<@TestAnnotation T> testList;
파라메타(매개 변수)에 적용합니다.
public TestClass() {
public void TestMethod(@TestAnnotation String param) {}
}
- "TYPE_USE" : 클래스/인테페이스를 사용하는 곳에 적용하기 위해 어노테이션을 생성합니다.
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target(TYPE_USE)
@Retention(RUNTIME)
public @interface TestAnnotation {
}
구현(implements)할 인터페이스에 적용합니다.
public class TestClassImpl implements @TestAnnotation TestInterface { }
계승(extends)할 클래스에 적용합니다.
public class TestClassEx extends @TestAnnotation TestClass { }
클래스의 변수, 배열, 타입 변환등에 적용합니다.
public class TestClass {
private @TestAnnotation String testData;
private @TestAnnotation char[] testChars;
TestClass testClass = (@TestAnnotation TestClass) TestInterface;
}
- "MODULE" : 모듈에 적용하기 위해 어노테이션을 생성합니다.
모듈에서 사용해 본적이 없어 설명할 수 없습니다.
- "RECORD_COMPONENT" : 레코드 구성요소에 적용하기 위해 어노테이션을 생성합니다.
"Associated with records, a preview feature of the Java language."
자바 미리보기와 관련이 있다고 하는데 사용해 본적이 없어 설명할 수 없습니다.