관리 메뉴

βœπŸ»κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έ

Annotation μ• λ…Έν…Œμ΄μ…˜ λ³Έλ¬Έ

Language/Java

Annotation μ• λ…Έν…Œμ΄μ…˜

μ©μ‹œν‚΄ 2021. 2. 4. 15:29
728x90

μžλ°” 라이브 μŠ€ν„°λ”” 12μ£Ό μ°¨ - μ• λ…Έν…Œμ΄μ…˜

1. μ• λ…Έν…Œμ΄μ…˜μ΄λž€

2. μ• λ…Έν…Œμ΄μ…˜ μ •μ˜ν•˜λŠ” 방법

3. ν‘œμ€€ μ• λ…Έν…Œμ΄μ…˜ 

4. 메타 μ• λ…Έν…Œμ΄μ…˜

5. μ• λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œ

 


1. μ• λ…Έν…Œμ΄μ…˜μ΄λž€

ν”„λ‘œκ·Έλž¨μ—κ²Œ 좔가적인 정보λ₯Ό μ œκ³΅ν•΄ μ£ΌλŠ” 메타데이터

annotation μš©λ„

  • μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ½”λ“œ μž‘μ„± 문법 μ—λŸ¬λ₯Ό μ²΄ν¬ν•˜λ„λ‘ 정보λ₯Ό 제곡
    • ex) λ©”μ„œλ“œκ°€ μž¬μ •λ˜κ°€ μ œλŒ€λ‘œ λ˜μ—ˆλŠ”μ§€ 확인 @Override
  • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ λ³„λ„μ˜ μ²˜λ¦¬κ°€ ν•„μš”ν•  λ•Œ

2. μ• λ…Έν…Œμ΄μ…˜ μ •μ˜ν•˜λŠ” 방법

ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œ μœ„μ— μ‚¬μš©ν•  μ• λ…Έν…Œμ΄μ…˜μ„ λΆ™μ΄κ±°λ‚˜ 직접 μ»€μŠ€ν…€μ΄ κ°€λŠ₯ν•˜λ‹€.

 

μ»€μŠ€ν…€ μ• λ…Έν…Œμ΄μ…˜ μž‘μ„± 방법

1. μ• λ…Έν…Œμ΄μ…˜μœΌλ‘œ 지정할 이름과 λ™μΌν•˜κ²Œ 클래슀λ₯Ό μƒμ„±ν•œλ‹€. AnnotationName.java

μ• λ…Έν…Œμ΄μ…˜ μ •μ˜ μ‹œ ν•˜λ‚˜ μ΄μƒμ˜ μ—˜λ¦¬λ¨ΌνŠΈ 멀버 μ„ μ–Έ κ°€λŠ₯ (μ–΄λ…Έν…Œμ΄μ…˜μ„ μ½”λ“œμ— μ μš©ν•  λ•Œ μ™ΈλΆ€μ˜ 값을 μž…λ ₯받을 수 μžˆλ„λ‘ ν•˜λŠ” μ—­ν• )

public @interface AnnotationName{
	String elementName1();//μš”μ†Œ
}

2. μ• λ…Έν…Œμ΄μ…˜μ„ ν΄λž˜μŠ€μ— μ μš©ν•œλ‹€.

@AnnotationName(elmentName1="κ°’");//μ„ μ–Έμ‹œ @λ₯Ό λΆ™μ—¬μ„œ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ–΄λ…Έν…Œμ΄μ…˜μ΄λΌκ³  μ•Œλ €μ€€λ‹€.

μ• λ…Έν…Œμ΄μ…˜ μž‘μ„± μ‹œ μ—¬λŸ¬ μš”μ†Œλ“€μ΄ μžˆλ‹€λ©΄, μ–΄λ…Έν…Œμ΄μ…˜ 적용 μ‹œ μš”μ†Œλ“€μ˜ 값을 빠짐없이 지정해주어야 ν•œλ‹€.

3. μ• λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•˜μ—¬ μ‹€ν–‰


3. ν‘œμ€€ μ–΄λ…Έν…Œμ΄μ…˜ 

μžλ°”μ—μ„œ 기본으둜 μ œκ³΅ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜

@Overried, @Deprecated, @SuppressWarningsλŠ” JDK 1.5에 λ“±μž₯ @FuntionalInterfaceλŠ” JDK1.8에 λ“±μž₯ν–ˆλ‹€.

 

@Override

  • λΆ€λͺ¨ν΄λž˜μŠ€μ— μžˆλŠ” λ©”μ„œλ“œλ₯Ό μ˜€λ²„ λΌμ΄λ”©ν•˜λŠ” κ²ƒμ΄λΌλŠ” κ±Έ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ€€λ‹€.

@Deprecated

  • 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν•„λ“œλ‚˜ λ©”μ„œλ“œμ— μ‚¬μš©

@SuppressWarnings

  • μ»΄νŒŒμΌλŸ¬μ—κ²Œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ˜λ„ν•œ μ½”λ”©μ΄λ―€λ‘œ μ»΄νŒŒμΌλŸ¬μ—κ²Œ λ¬΄μ‹œν•˜λ„λ‘ ν•  경우 μ‚¬μš©
  • κ²½κ³  λ©”μ‹œμ§€ μ’…λ₯˜
    • deprecation :@Deprecatedκ°€ 뢙은 λŒ€μƒμ„ μ‚¬μš©ν•  경우
    • unchecked : μ œλ„€λ¦­ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ•˜μ„ 경우
    • varargs : κ°€λ³€ 인자의 νƒ€μž…μ΄ μ œλ„€λ¦­ νƒ€μž…μΌ 경우
    • rawtypes : μ œλ„€λ¦­μŠ€λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•˜λŠ” 경우
@SuppressWarnings({"rawtypes","unchecked"})

 

@FunctionalInterface

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ μ‹œ μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ„œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œλŒ€λ‘œ μ„ μ–Έν–ˆλŠ”μ§€ ν™•μΈν•œλ‹€.

→ λžŒλ‹€μ‹ 곡뢀 λ•Œ λ‹€μ‹œ 확인!


4. 메타 μ• λ…Έν…Œμ΄μ…˜

μ• λ…Έν…Œμ΄μ…˜μ„ μ •μ˜ μ‹œ μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ μš©λŒ€μƒ(target) 및 μœ μ§€κΈ°κ°„(retention)을 μ§€μ •ν•˜λŠ” 데 μ‚¬μš©ν•˜λ©°, java.lang.annotation νŒ¨ν‚€μ§€μ— ν¬ν•¨λ˜μ—ˆλ‹€.

 

@Retention

μ• λ…Έν…Œμ΄μ…˜μ΄ μœ μ§€λ˜λŠ” 기간을 μ§€μ •ν•˜λŠ” 데 μ‚¬μš©

 

μ• λ…Έν…Œμ΄μ…˜ μœ μ§€ μ •μ±…

SOURCE μ†ŒμŠ€νŒŒμΌμ—λ§Œ 쑴재, λŸ°νƒ€μž„μ‹œμ—λŠ” μ‘΄μž¬ν•˜μ§€μ•ŠμŒ
CLASS 클래슀 νŒŒμΌμ—λŠ” 쑴재, μ–΄λ…Έν…Œμ΄μ…˜ 정보가 μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μ°Έμ‘° κ°€λŠ₯,
jvm에 λ‘œλ”© μ‹œ μ–΄λ…Έν…Œμ΄μ…˜ 정보 λ¬΄μ‹œ μ‹€ν–‰μ‹œμ—λŠ” μ–΄λ…Έν…Œμ΄μ…˜ 정보 얻을 수 μ—†μŒ
RUNTIME λŸ°νƒ€μž„μ‹œ κΉŒμ§€ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μœ νš¨ν•˜λ©°, μ‹€ν–‰ μ‹œ λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 클래슀 νŒŒμΌμ— μ €μž₯된 μ–΄λ…Έν…Œμ΄μ…˜ 정보λ₯Ό μ½μ–΄μ„œ μ²˜λ¦¬λœλ‹€.
μ‹€ν–‰μ‹œ μ–΄λ…Έν…Œμ΄μ…˜ 정보가 가상머신에 μ˜ν•΄μ„œ μ°Έμ‘° κ°€λŠ₯

Annotation μœ μ§€μ •μ±… ν…ŒμŠ€νŠΈ

SOURCE, CLASS, RUNTIME 각각 μœ μ§€μ •μ±…μ„ κ°€μ§€λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ„ μƒμ„±ν–ˆλ‹€.

@Retention(RetentionPolicy.CLASS)
public @interface ClassRetention {
	String value() default "ClassRetention";
}

@Retention(RetentionPolicy.RUNTIME)
public @interface RuntimeRetention {
	String value() default "Runtime Retention";
}

@Retention(RetentionPolicy.SOURCE)
public @interface SourceRetention {
	String value() default "Source Retention";
}

각각의 μ–΄λ…Έν…Œμ΄μ…˜μ΄ 적용된 클래슀의 μ–΄λ…Έν…Œμ΄μ…˜ 정보λ₯Ό κ°€μ Έμ™”λ‹€.

public class UserAnnotationSample {
	public static void main(String[] args) {
		Annotation a[] = new A().getClass().getAnnotations();
		Annotation b[] = new B().getClass().getAnnotations();
		Annotation c[] = new C().getClass().getAnnotations();

		System.out.println("a annotation length = " + a.length);
		System.out.println("b annotation length = " + b.length);
		System.out.println("c annotation length " + c.length);

		System.out.println("c[0] = " + c[0]);
	}

}
@SourceRetention
class A {
}

@ClassRetention
class B {
}

@RuntimeRetention
class C {
}

κ²°κ³Όλ₯Ό 보면 RUNTIME μœ μ§€μ •μ±…μ„ νƒν•œ μ–΄λ…Έν…Œμ΄μ…˜λ§Œμ΄ runtimeμ‹œ 확인 ν•  수 μžˆμ—ˆλ‹€.

a.length = 0
b.length = 0
c.length = 1
c[0] = @RuntimeRetention(value="Runtime Retention")
* μžλ°” λ¦¬ν”Œλ ‰μ…˜
  • jvmμ—μ„œ μ‹€ν–‰λ˜λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λŸ°νƒ€μž„ λ™μž‘μ„ κ²€μ‚¬ν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆλŠ” κΈ°λŠ₯
  • μ˜ˆμ‹œ) μŠ€ν”„λ§μ—μ„œ λŸ°νƒ€μž„ μ‹œ κ°œλ°œμžκ°€ λ“±λ‘ν•œ λΉˆμ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 가져와 μ‚¬μš©ν•  수 μžˆλ„λ‘ 처리

μ˜€λ²„λΌμ΄λ“œ μœ μ§€ 정책은 SOURCEμ΄λ―€λ‘œ μ†ŒμŠ€νŒŒμΌμ—μ„œλ§Œ μ μš©λœλ‹€.

@Target

μ• λ…Έν…Œμ΄μ…˜ μ μš©λŒ€μƒ 지정 μ‹œ μ‚¬μš©

  • μ½”λ“œμƒμ—μ„œ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ μš©ν•  수 μžˆλŠ” λŒ€μƒ μ„€μ •
  • java.lang.annotation.ElementType μ—΄κ±° μƒμˆ˜λ‘œ μ •μ˜λ˜μ–΄ 있음
  • νƒ€κΉƒμœΌλ‘œ 올 수 μžˆλŠ” νƒ€μž…
    • TYPE(클래슀, μΈν„°νŽ˜μ΄μŠ€, μ—΄κ±° νƒ€μž…)
    • ANNOTATION_TYPE(μ–΄λ…Έν…Œμ΄μ…˜)
    • FIELD(ν•„λ“œ)
    • CONSTRUCTOR(μƒμ„±μž)
    • METHOD(λ©”μ„œλ“œ)
    • LOCAL_VARIABLE(둜컬 λ³€μˆ˜)
    • PACKAGE(νŒ¨ν‚€μ§€)

μ—¬λŸ¬ 개 νƒ€κΉƒμœΌλ‘œ 지정할 λ•ŒλŠ” λ°°μ—΄ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

@SuppressWarning에 ν‘œμ‹œλœ @Target μ–΄λ…Έν…Œμ΄μ…˜

@Documented

μ• λ…Έν…Œμ΄μ…˜μ— λŒ€ν•œ 정보가 javadoc으둜 μž‘μ„±ν•œ λ¬Έμ„œμ— ν¬ν•¨λ˜λ„λ‘ ν•œλ‹€.

@Override , @SuppressWarningsλ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ‘ @documented μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄μžˆλ‹€.


5. μ• λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œ

β€»  μΆ”κ°€ 보좩 μ˜ˆμ •

컴파일 μ‹œ 끼어듀어 νŠΉμ •ν•œ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆλŠ” μ½”λ“œλ₯Ό μ°Έμ‘°ν•˜μ—¬ μ†ŒμŠ€μ½”λ“œλ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” κΈ°λŠ₯

μ˜ˆμ‹œ) lombok

컴파일 μ‹œμ μ— μ–΄λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ†ŒμŠ€μ½”λ“œμ˜ AST(abstract syntax tree)λ₯Ό μ‘°μž‘

 

AST 

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μž‘μ„±λœ μ†ŒμŠ€ μ½”λ“œμ˜ 좔상 κ΅¬λ¬Έ κ΅¬μ‘°μ˜ νŠΈλ¦¬


[μ°Έκ³ ]

https://medium.com/msolo021015/μžλ°”-reflectionμ΄λž€-ee71caf7eec5

youtu.be/zNmq-qGzsUY

youtu.be/GQYoIl9 sOlk

μžλ°”μ˜ 정석 - μ–΄λ…Έν…Œμ΄μ…˜

www.inflearn.com/course/the-java-code-manipulation#curriculum

https://www.geeksforgeeks.org/java-retention-annotations/

728x90
λ°˜μ‘ν˜•