Week12(Annotation)

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

Annotation은 주석 μ΄λΌλŠ” 의미λ₯Ό κ°€μ§€κ³  μžˆλ‹€. ν•˜μ§€λ§Œ /λ‚˜ /*와 같은 μ£Όμ„κ³ΌλŠ” ν™•μ‹€νžˆ λ‹€λ₯΄λ‹€

  • 컴파일 κ³Όμ •μ—μ„œ μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ 컴파일 ν•  것인지, μ‹€ν–‰ κ³Όμ •μ—μ„œ μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•  것인지λ₯Ό μ•Œλ €μ£ΌλŠ” 정보

  • annotation이 뢙은 μ½”λ“œλŠ” annotation에 κ΄€ν•œ 정보가 κ΅¬ν˜„λœ 것에 λ”°λΌμ„œ μ—°κ²°λ˜λŠ” λ°©ν–₯이 κ²°μ •λœλ‹€

  • 전체 μ†ŒμŠ€μ½”λ“œμ—μ„œ λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μ—λŠ” 영ν–₯을 μ£Όμ§€λŠ” μ•Šμ§€λ§Œ ν•΄λ‹Ή νƒ€κ²Ÿμ˜ μ—°κ²° λ°©λ²•μ΄λ‚˜ μ†ŒμŠ€μ½”λ“œμ˜ ꡬ쑰λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.

    = 이 속성을 μ–΄λ–€ μš©λ„λ‘œ μ‚¬μš©ν• κ»€μ§€, 이 ν΄λž˜μŠ€μ—κ²Œ μ–΄λ–€ 역할을 쀄껀지λ₯Ό κ²°μ •ν•΄μ„œ λΆ™μ—¬μ£ΌλŠ” 것

  • annotation은 μ†ŒμŠ€μ½”λ“œμ— 메타데이터λ₯Ό μ‚½μž…ν•˜λŠ” 것이기 λ•Œλ¬Έμ— 잘 μ΄μš©ν•œλ‹€λ©΄ ꡬ독성 뿐만 μ•„λ‹ˆλΌ 체계적인 μ†ŒμŠ€μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λŠ”λ° 도움을 μ€€λ‹€

    • 메타 λ°μ΄ν„°λž€ -> 데이터λ₯Ό μœ„ν•œ 데이터λ₯Ό μ˜λ―Έν•˜λ©°, 데이터에 λŒ€ν•œ μ„€λͺ…을 μ˜λ―Έν•˜λŠ” 데이터(μžμ‹ μ˜ 정보λ₯Ό κ°€μ§€κ³  μžˆλŠ” 데이터)

μ‚¬μš©λ²•

νŒ¨ν‚€μ§€λͺ…μ΄λ‚˜ 클래슀 μ„ μ–Έ, λ©”μ†Œλ“œ μ„ μ–Έ, ν•„λ“œ μ„ μ–Έ, μΈμžκ°’ μ„ μ–Έ μœ„μ—λ‹€κ°€

@이름(인자)

λ°©μ‹μœΌλ‘œ λ„£μ–΄μ£Όκ³  λ§Œμ•½ μΈμžκ°€ μ—†μ„κ²½μš°μ—λŠ” (인자) 뢀뢄은 λΉΌκ³  μ‚¬μš©ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€

선언방법

@Retention()
@Target()
public @interface ExAnnotation{
  //νƒ€μž… μš”μ†Œλͺ…() defaultκ°’;
  String value(); // Stringν˜• κΈ°λ³Έ μš”μ†Œ
  int value2() default 5; //intν˜• μš”μ†Œ μ΄ˆκΈ°κ°’ 5
}

μ΄λ ‡κ²Œ annotation은 멀버λ₯Ό κ°€μ§€λŠ” 것이 κ°€λŠ₯ν•˜λ©°, νƒ€μž…, 이름, dafault값을 μ„€μ •ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€

λ§Œμ•½ default값을 λ”°λ‘œ μ •ν•΄μ£Όμ§€ μ•ŠλŠ”λ‹€λ©΄ κΈ°λ³Έ μš”μ†Œκ°€ λœλ‹€

μ‚¬μš©λ°©λ²•

  • λ§Œμ•½ annotation μ•ˆμ— μžˆλŠ” μš”μ†Œμ˜ 값에 default값이 μ„€μ •λ˜μ–΄ μžˆλ‹€λ©΄, 값을 λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•Šμ•„λ„ λ˜μ§€λ§Œ(int) default값이 μ—†λŠ” κ²½μš°μ—λŠ” 값을 μ„€μ •ν•΄μ€˜μ•Ό 함(String)

ν‘œμ€€ Annotation

  • @Override : λ©”μ†Œλ“œκ°€ overrideλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³  λ§Œμ•½ λΆ€λͺ¨ ν΄λž˜μŠ€λ‚˜ κ΅¬ν˜„λœ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λ©”μ†Œλ“œλ₯Ό μ°Ύμ§€ λͺ»ν–ˆμ„ λ•Œ 컴파일 κ²½κ³ λ₯Ό λ°œμƒμ‹œν‚¨λ‹€

  • @Deprecated : λ©”μ†Œλ“œμ— λ§ˆν‚Ήμ„ 해두고 λ§Œμ•½ λ©”μ†Œλ“œκ°€ μ‚¬μš©λ˜μ—ˆμ„ λ•Œ 컴파일 κ²½κ³ λ₯Ό 쀌

  • @SafeVarargs : μžλ°” 7λΆ€ν„° κ°€λ³€μΈμž λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•œ λ©”μ†Œλ“œλ‚˜ μƒμ„±μžλ₯Ό λΆ€λ₯΄λŠ” κ²ƒλ“€μ˜ 경고듀을 λ¬΄μ‹œ

  • @SurppressWarnings : annotation μΈμžλ“€ μ•ˆμ˜ 컴파일 μ‹œμ˜ κ²½κ³ λ₯Ό 컴파일러둜 ν•˜μ—¬κΈˆ λ¬΄μ‹œν•˜λ„λ‘ 함

  • @FunctionalInterface : μžλ°” 8λΆ€ν„° κΈ°λŠ₯적 μΈν„°νŽ˜μ΄μŠ€κ°€ 되기 μœ„ν•΄ μ˜λ„λœ νƒ€μž… 선언을 ꡬ체화함

@Retentionμ΄λž€

μ–΄λŠ μ‹œμ κΉŒμ§€ Annotation의 λ©”λͺ¨λ¦¬λ₯Ό κ°€μ Έκ°ˆ 건지 μ„€μ •ν•˜λŠ” λΆ€λΆ„

쑰금 더 μ•Œμ•„λ³΄κΈ° μœ„ν•΄μ„œ λ‚΄λΆ€λ₯Ό λ“€μ—¬λ‹€ λ³΄μ•˜λ‹€

annotation μœ ν˜•μ΄ μžˆλŠ” annotation이 λ³΄μ‘΄λ˜λŠ” 기간을 λ‚˜νƒ€λƒ„

μΈμžλ‘œλŠ” RetentionPolicyκ°€ λ“€μ–΄κ°€κ²Œ λœλ‹€

인자둜 λ“€μ–΄κ°€λŠ” RetentionPolicyλ₯Ό μ•Œμ•„λ³΄κΈ° μœ„ν•΄ λ‹€μ‹œ 또 λ‚΄λΆ€λ₯Ό λ“€μ—¬λ‹€λ΄€λ‹€

  • RetentionPolicy값을 λ„£μ–΄μ£Όλ©΄ κ·Έκ²ƒμœΌλ‘œ annotation의 λ©”λͺ¨λ¦¬ 보유 λ²”μœ„κ°€ κ²°μ •λœλ‹€

  • μš”μ†Œ

    • SOURCE : ν•΄λ‹Ή annotation의 λ©”λͺ¨λ¦¬λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ 버린닀

    • CLASS : μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌμ—μ„œλŠ” annotation의 λ©”λͺ¨λ¦¬λ₯Ό κ°€μ Έκ°€μ§€λ§Œ μ‹€μ œλ‘  λŸ°νƒ€μž„μ‹œμ— 사라진닀

    • RUNTIME : μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄μ„œ 클래슀 νŒŒμΌμ— 기둝되고, λŸ°νƒ€μž„ μ‹œ JVM에 μ˜ν•΄ μœ μ§€λœλ‹€.

μ΄λ ‡κ²Œ μ‚¬μš©ν•˜κ³  RUNTIME μžλ¦¬μ— ν•„μš”ν•œ μš”μ†Œλ“€μ„ λ„£μ–΄μ„œ μ‚¬μš©κ°€λŠ₯

@Targetμ΄λž€

annotation이 적용될 μœ„μΉ˜λ₯Ό κ²°μ •

이것도 λ‚΄λΆ€λ₯Ό 듀여닀보면 μ΄λ ‡κ²Œ μ„€λͺ…ν•΄λ‘μ—ˆλ‹€.

μœ„μ—μ„œμ˜ Retention 처럼 ElementType의 μš”μ†Œλ“€μ„ μ›ν•˜λŠ” 만큼 넣을 수 μžˆλŠ” 것 처럼 보인닀

λ‹€μ‹œ ElementType을 μ°Ύμ•„λ³΄μž

  • TYPE : νƒ€μž…(클래슀, μΈν„°νŽ˜μ΄μŠ€, enum) μ„ μ–Έ μ‹œ μ‚¬μš©

  • FIELD : 멀버 λ³€μˆ˜ μ„ μ–Έ μ‹œ μ‚¬μš©(enum 포함)

  • METHOD : λ©”μ†Œλ“œ μ„ μ–Έ μ‹œ μ‚¬μš©

  • PARAMETER : 맀개 λ³€μˆ˜ μ„ μ–Έ μ‹œ μ‚¬μš©

  • CONSTRUCTOR : μƒμ„±μž μ„ μ–Έ μ‹œ μ‚¬μš©

  • LOCAL_VARIABLE : μ§€μ—­ λ³€μˆ˜ μ„ μ–Έ μ‹œ μ‚¬μš©

  • ANNOTATION_TYPE : Annotation type μ„ μ–Έ μ‹œ

  • PACKAGE : νŒ¨ν‚€μ§€ μ„ μ–Έ μ‹œ

  • TYPE_PARAMETER : λ³€μˆ˜ νƒ€μž… μ„ μ–Έ μ‹œ

  • TYPE_USER : νƒ€μž… μ‚¬μš© μ‹œ

@Documentedμ΄λž€

ν˜•νƒœλ₯Ό κ°€μ§€λŠ” annotation이 javadoc 같은 νˆ΄μ— μ˜ν•΄μ„œ default둜 λ¬Έμ„œν™” λ˜λŠ” 것을 λ‚˜νƒ€λƒ„

=λ¬Έμ„œμ— 정보가 ν‘œν˜„λœλ‹€λΌκ³  μƒκ°ν•˜λ©΄ λ λ“―ν•˜λ‹€

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

Annotation Processingμ΄λž€? (from Stackoverflow)

-> μžλ°” 컴파일러의 컴파일 λ‹¨κ³„μ—μ„œ μœ μ €κ°€ μ •μ˜ν•œ annotation의 μ†ŒμŠ€μ½”λ“œλ₯Ό λΆ„μ„ν•˜κ³  μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 훅이닀. 컴파일 μ—λŸ¬λ‚˜ 컴파일 κ²½κ³ λ₯Ό λ§Œλ“€μ–΄λ‚΄κ±°λ‚˜ μ†ŒμŠ€μ½”λ“œ(.java)와 λ°”μ΄νŠΈμ½”λ“œ(.class)λ₯Ό 내보내기도 ν•œλ‹€

μ΄κ²ƒμ˜ κ°€μž₯ λŒ€ν‘œμ μΈ μ˜ˆμ‹œλŠ” lombokκ°€ 있으며

μž₯점은 λŸ°νƒ€μž„ λΉ„μš©μ΄ μ•ˆλ“ λ‹€λŠ”μ μ΄κ³ 

단점은 기쑴의 클래슀 μ½”λ“œλ₯Ό λ³€κ²½ν•  λ•ŒλŠ” λ‚΄λΆ€ 클래슀λ₯Ό μ‚¬μš©ν•΄μ„œ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ§Œμ§€κΈ° λ•Œλ¬Έμ— 해킹에 λΉ„μŠ·ν•˜λ‹€

annotation processλ₯Ό 직접 μž‘μ„±ν•˜κ±°λ‚˜ λ§Œλ“€μ–΄μ§„ annotation processorλ₯Ό ν™•μΈν•˜λ©΄ Abstract Processor 클래슀λ₯Ό μƒμ†λ°›λŠ” 것을 μ•Œ 수 μžˆλ‹€.

μ°Έκ³ μ‚¬μ΄νŠΈ

https://www.nextree.co.kr/p5864/

https://coding-factory.tistory.com/575

http://cris.joongbu.ac.kr/course/java/api/java/lang/annotation/Documented.html

https://yadon079.github.io/2021/java study halle/week-12

https://en.wikipedia.org/wiki/Java_annotation

Last updated

Was this helpful?