Annotation

Annotationμ΄λž€ μ£Όμ„μ΄λž€ 뜻으둜, μΈν„°νŽ˜μ΄μŠ€λ₯Ό 기반으둜 ν•œ 문법이닀. μ£Όμ„κ³ΌλŠ” κ·Έ 역할이 λ‹€λ₯΄μ§€λ§Œ μ£Όμ„μ²˜λŸΌ μ½”λ“œμ— 달아 ν΄λž˜μŠ€μ— νŠΉλ³„ν•œ 의미λ₯Ό λΆ€μ—¬ν•˜κ±°λ‚˜ κΈ°λŠ₯을 μ£Όμž…ν•  수 μžˆλ‹€. 또 ν•΄μ„λ˜λŠ” μ‹œμ μ„ μ •ν•  μˆ˜λ„ μžˆλ‹€.(Rentention Policy) Annotationμ—λŠ” 크게 μ„Έ κ°€μ§€ μ’…λ₯˜κ°€ μ‘΄μž¬ν•œλ‹€. JDK 에 λ‚΄μž₯λ˜μ–΄ μžˆλŠ” built-in annotationκ³Ό annotation에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ annotation인 Meta-annotation 그리고 κ°œλ°œμžκ°€ 직접 λ§Œλ“€μ–΄ λ‚΄λŠ” Custom Annotation이 μžˆλ‹€.

Annotations은 metadataλ₯Ό ꡬ문과 μ—°κ²°ν•˜λŠ” 클래슀 , λ©”μ„œλ“œ λ˜λŠ” ν•„λ“œμ™€ 같은 Java ꡬ문에 μ μš©λ˜λŠ” λ°μ½”λ ˆμ΄ν„°μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ°μ½”λ ˆμ΄ν„°λŠ” 양성이며 자체적으둜 μ–΄λ–€ μ½”λ“œλ„ μ‹€ν–‰ν•˜μ§€ μ•Šμ§€λ§Œ λŸ°νƒ€μž„ ν”„λ ˆμž„μ›Œν¬ λ˜λŠ” μ»΄νŒŒμΌλŸ¬μ—μ„œ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ’€ 더 κ³΅μ‹μ μœΌλ‘œ λ§ν•˜λ©΄ Java μ–Έμ–΄ 사양(JlS), μ„Ήμ…˜ 9.7μ—μ„œ λ‹€μŒκ΄€ 같은 μ •μ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

An anotation is a marker which associates information with a program construct, but has no effect at run time

Built-in Annotation

  • @Override

    • λ©”μ„œλ“œκ°€ μƒμ†λœ λ©”μ„œλ“œμ˜ λ™μž‘μ„ μž¬μ •μ˜ν•˜κ±°λ‚˜ λŒ€μ²΄ν•¨μ„ λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

  • @FunctionalInterface

    • μΈν„°νŽ˜μ΄μŠ€μ— ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

  • @SuppressWarnings

    • μ½”λ“œμ˜ μΌλΆ€μ—μ„œ νŠΉμ • κ²½κ³ λ₯Ό λ¬΄μ‹œν•˜κ³  μ‹Άλ‹€λŠ” 것을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

  • @SafeVarargs

    • varargs μ‚¬μš©κ³Ό κ΄€λ ¨λœ κ²½κ³  μœ ν˜•μ— μ μš©λ©λ‹ˆλ‹€.

  • @Deprecated

    • APIλ₯Ό 더 이상 μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Meta-Annotations

  • @Target

    • μ μš©ν•  수 μžˆλŠ” λŒ€μƒμ„ μ„€λͺ…ν•©λ‹ˆλ‹€.

  • @Retention

    • μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μœ μ§€λ˜μ–΄μ•Ό ν•˜λŠ” 기간을 μ„€λͺ…ν•©λ‹ˆλ‹€.

    • RetentionPolicy.SOURCE – μ»΄νŒŒμΌλŸ¬μ™€ λŸ°νƒ€μž„ λͺ¨λ‘μ—μ„œ λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€.

    • RetentionPolicy.CLASS – μ»΄νŒŒμΌλŸ¬μ—μ„œ λ³Ό 수 있음

    • RetentionPolicy.RUNTIME – μ»΄νŒŒμΌλŸ¬μ™€ λŸ°νƒ€μž„μ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

  • @Inherited

    • μƒμœ„ μœ ν˜•μ— μ μš©λ˜λŠ” 경우 ν•˜μœ„ μœ ν˜•μ— μ˜ν•΄ μƒμ†λ˜μ–΄μ•Ό 함을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

  • @Documented

    • 기본적으둜 JavaλŠ” Javadocsμ—μ„œ @Annotation μ‚¬μš©μ„ λ¬Έμ„œν™”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • κ·ΈλŸ¬λ‚˜ @Documented 주석을 μ‚¬μš©ν•˜μ—¬ Java의 κΈ°λ³Έ λ™μž‘μ„ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • @Repeatable

    • λ™μΌν•œ μ»¨ν…μŠ€νŠΈμ—μ„œ μ—¬λŸ¬ 번 μ μš©ν•  수 μžˆμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 즉 ν΄λž˜μŠ€λŠ” λ™μΌν•œ 주석을 두 번 이상 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λ§Œμ˜ μ–΄λ…Έν…Œμ΄μ…˜ λ§Œλ“€κΈ° (@Component)

@Target({ElementType.TYPE})  // 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ νƒ€μž… 레벨(클래슀, μΈν„°νŽ˜μ΄μŠ€, μ—΄κ±°ν˜•)에 μ μš©λ©λ‹ˆλ‹€.
@Retention(RetentionPolicy.RUNTIME)  // μ–΄λ…Έν…Œμ΄μ…˜ 정보가 λŸ°νƒ€μž„κΉŒμ§€ μœ μ§€λ©λ‹ˆλ‹€, 즉 μ‹€ν–‰ μ‹œκ°„ λ™μ•ˆ 정보에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
@Documented  // μ–΄λ…Έν…Œμ΄μ…˜ 정보가 JavaDoc에 ν¬ν•¨λ˜μ–΄ λ¬Έμ„œν™”λ©λ‹ˆλ‹€.
@Indexed  // μŠ€ν”„λ§μ˜ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊλ‹ λ©”μ»€λ‹ˆμ¦˜μ΄ 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ κ°€μ§„ 클래슀λ₯Ό μ‰½κ²Œ μΈλ±μ‹±ν•˜κ³  찾을 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
public @interface Component {
    String value() default "";  // μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš© μ‹œ μ„ νƒμ μœΌλ‘œ μ§€μ •ν•  수 μžˆλŠ” κ°’, 주둜 빈의 μ΄λ¦„μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
}

Reference

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Java#annotation

https://dzone.com/articles/5-annotations-every-java-developer-should-know

https://dzone.com/articles/what-are-meta-annotations-in-java

https://www.baeldung.com/java-default-annotations

https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html

Last updated

Was this helpful?