Java 프레임워크 만들기 - JSP

자바 어노테이션 만들기 - Java Annotation, 이클립스(Eclipse)

carrotweb 2021. 5. 10. 18:36
728x90
반응형

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."

자바 미리보기와 관련이 있다고 하는데 사용해 본적이 없어 설명할 수 없습니다.

728x90
반응형