Annotation

Java의 μ–΄λ…Έν…Œμ΄μ…˜(Annotation)

μ–΄λ…Έν…Œμ΄μ…˜μ€ μš°λ¦¬λ‚˜λΌ 말둜 주석을 λœ»ν•œλ‹€. Java의 μ–΄λ…Έν…Œμ΄μ…˜μ€ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ§€μ •λœ 클래슀/λ©”μ†Œλ“œ/ν•„λ“œ λ“±μ˜ νŠΉμ„±μ„ μ„€λͺ…ν•˜κ±°λ‚˜, μ§€μΌœμ•Ό ν•  κ·œμ•½μ„ μ§€μ •ν•˜κΈ° μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λœλ‹€.

Java의 μ–΄λ…Έν…Œμ΄μ…˜μ€ 크게 3κ°€μ§€λ‘œ λΆ„λ₯˜λœλ‹€.

  1. 컴파일 νƒ€μž„μ— νŠΉμ • μ—λŸ¬λ₯Ό 체크할 수 μžˆλ„λ‘ 함

    • @Override, @Deprecated, @FunctionalInterface, @SuppressWarnings

  2. λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨(SW)이 λΉŒλ“œ/배치 μ‹œ νŠΉμ • μ½”λ“œλ₯Ό μžλ™μœΌλ‘œ 생성(μ£Όμž…)ν•  수 μžˆλ„λ‘ 함

  3. λŸ°νƒ€μž„ μ‹œ νŠΉμ • κΈ°λŠ₯을 μ‹€ν–‰

λ“±μž₯ 이유

μ–΄λ…Έν…Œμ΄μ…˜μ€ JDK 1.5λΆ€ν„° λ„μž…λœ κΈ°λŠ₯이닀. κ·Έ μ „μ—λŠ” 클래슀, λ©”μ†Œλ“œ, ν•„λ“œ 쀑 일뢀가 μˆ˜ν–‰ν•΄μ•Ό ν•  둜직, μ€€μˆ˜ν•΄μ•Ό ν•  κ·œμ•½ λ“±μ˜ λΆ€κ°€ 정보λ₯Ό μ½”λ“œμ— ν¬ν•¨μ‹œν‚€κ±°λ‚˜ λ³„λ„μ˜ μ„€μ • 파일둜 λΆ„λ¦¬ν•˜μ—¬ κ΄€λ¦¬ν•˜λŠ” μˆ˜λ°–μ— μ—†μ—ˆλŠ”λ°, 각 방법은 λ‹€μŒμ˜ 문제둜 μ΄μ–΄μ‘Œλ‹€.

λΆ€κ°€ 정보가 μ½”λ“œμ— ν¬ν•¨λ˜λŠ” 경우

  • μ€‘λ³΅λœ λ‘œμ§μ„ μ—¬λŸ¬ μ½”λ“œμ— λ„£μœΌλ―€λ‘œ ν™•μž₯μ„± λ©΄μ—μ„œ μ’‹μ§€ μ•ŠμŒ

  • 말 κ·ΈλŒ€λ‘œ λΆ€κ°€ μ •λ³΄μ΄λ―€λ‘œ μ±…μž„μ΄ 잘 λΆ„λ¦¬λ˜μ§€ μ•Šμ€ μ½”λ“œκ°€ 됨

  • 가독성 λ©΄μ—μ„œλ„ μ’‹μ§€ μ•ŠμŒ. ν•΄λ‹Ή λΆ€κ°€ 정보가 무엇을 μœ„ν•œ 정보인지 ν•œ λˆˆμ— νŒŒμ•…ν•˜κΈ° 어렀움

μ„€μ • 파일둜 λΆ„λ¦¬ν•˜λŠ” 경우

  • μ½”λ“œμ™€ 섀정이 λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄ κ΄€λ¦¬ν•˜λŠ” 것이 λΆˆνŽΈν•¨

  • μ½”λ“œλŠ” μˆ˜μ •ν•˜κ³  μ„€μ • νŒŒμΌμ€ μˆ˜μ •ν•˜μ§€ μ•Šμ•„ 뢈일치 λ¬Έμ œκ°€ λ°œμƒν•˜κΈ°λ„ 함

μ΄λŸ¬ν•œ 가독성 μ €ν•˜ 문제, 별도 μ„€μ • 파일 관리 문제 등을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λΆ€κ°€ 정보λ₯Ό ν•˜λ‚˜μ˜ λ‹¨μ–΄λ‘œ ν‘œν˜„ν•΄ μ‰½κ²Œ μ˜λ„λ₯Ό 확인할 수 있고, 섀정이 μ½”λ“œμ™€ λ™μΌν•œ νŒŒμΌμ— μ‘΄μž¬ν•΄ μ„€μ •κ³Ό μ½”λ“œλ₯Ό ν•¨κ»˜ λ‹€λ£° 수 μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜ κΈ°λŠ₯을 λ„μž…ν•˜μ˜€λ‹€.

Javaμ—μ„œ μ œκ³΅ν•˜λŠ” ν‘œμ€€ μ–΄λ…Έν…Œμ΄μ…˜

Javaμ—μ„œλŠ” μ—¬λŸ¬ κ°€μ§€ λ‚΄μž₯ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ§€μ›ν•œλ‹€.

λ³Έ κΈ€μ—μ„œλŠ” 이λ₯Ό 컴파일 νƒ€μž„μ— νŠΉμ • λ™μž‘μ΄ μˆ˜ν–‰λ˜λ„λ‘ λ•λŠ” λ‚΄μž₯ μ–΄λ…Έν…Œμ΄μ…˜κ³Ό μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•  λ•Œ μ‚¬μš©λ˜λŠ” 메타 μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ λ‚˜λˆ„μ–΄ μ„€λͺ…ν•œλ‹€.

λ‚΄μž₯ μ–΄λ…Έν…Œμ΄μ…˜

@Override

  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‚¬μš©λœ λ©”μ†Œλ“œκ°€ μ˜€λ²„λΌμ΄λ”©λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ„

  • μ˜€λ²„λΌμ΄λ”©μ„ μ˜¬λ°”λ₯΄κ²Œ ν–ˆλŠ”μ§€ μ»΄νŒŒμΌλŸ¬κ°€ μ²΄ν¬ν•˜λ„λ‘ 함

    • μ˜€λ²„λΌμ΄λ”©ν•  λ©”μ†Œλ“œκ°€ λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ—†λŠ” 경우 컴파일 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚΄

  • μ§€μΌœμ•Ό ν•  κ·œμ•½μ„ μ§€μ •ν•˜κΈ° μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜μ— ν•΄λ‹Ή

@Deprecated

  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‚¬μš©λœ λ©”μ†Œλ“œκ°€ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ„

  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 컴파일 μ‹œ κ²½κ³  λ©”μ‹œμ§€λ₯Ό 좜λ ₯함

  • μ§€μΌœμ•Ό ν•  κ·œμ•½μ„ μ§€μ •ν•˜κΈ° μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜μ— ν•΄λ‹Ή

@SuppressWarnings

  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‚¬μš©λœ κ³³μ—μ„œ λ°œμƒν•œ 컴파일 μ—λŸ¬λ₯Ό λ¬΄μ‹œν•¨

  • νŠΉμ • warning에 λŒ€ν•΄ μ»΄νŒŒμΌλŸ¬κ°€ κ²½κ³  λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜μ§€ μ•Šλ„λ‘ μ–΅μ œ

@FunctionalInterface

  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— 뢙이면 μ»΄νŒŒμΌλŸ¬κ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘μ„±ν–ˆλŠ”μ§€ μ²΄ν¬ν•˜λ„λ‘ 함

  • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” 단 ν•˜λ‚˜μ˜ μΆ”μƒλ©”μ†Œλ“œλ§Œ κ°€μ Έμ•Ό 함

메타 μ–΄λ…Έν…Œμ΄μ…˜ (μ–΄λ…Έν…Œμ΄μ…˜ 선언을 μœ„ν•œ μ–΄λ…Έν…Œμ΄μ…˜)

@Target

  • μ–΄λ…Έν…Œμ΄μ…˜μ„ μ μš©ν•  νƒ€μž…μ„ μ§€μ •

  • 클래슀, λ©”μ†Œλ“œ, μƒμ„±μž, ν•„λ“œ, νŒ¨ν‚€μ§€, νŒŒλΌλ―Έν„° 등이 주둜 μ‚¬μš©λœλ‹€.

@Retention

  • μ–΄λ…Έν…Œμ΄μ…˜μ˜ μœ μ§€ μ •μ±…(μ–Έμ œκΉŒμ§€ μœ νš¨ν•œμ§€)을 μ§€μ •

  • Retention.SOURCE: 컴파일 μ „κΉŒμ§€λ§Œ 유효

    • 컴파일된 결과물인 λ°”μ΄νŠΈμ½”λ“œ(.class 파일)μ—λŠ” ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ

    • 주둜 μ†ŒμŠ€ μ½”λ“œ μž‘μ„± 쀑 μ‹€μˆ˜ν•˜μ§€ μ•Šλ„λ‘ μ œμ•½μ„ κ±°λŠ”(μ§€ν‚€μ§€ μ•Šμ„ μ‹œ 컴파일 μ—λŸ¬ λ°œμƒ) μ–΄λ…Έν…Œμ΄μ…˜μ— μ‚¬μš©

  • Retention.CLASS: μ»΄νŒŒμΌλŸ¬κ°€ 클래슀λ₯Ό μ°Έμ‘°ν•  λ•ŒκΉŒμ§€ 유효

    • λ°”μ΄νŠΈμ½”λ“œ(.class 파일)μ—λŠ” μ‘΄μž¬ν•˜λ‚˜, 클래슀 λ‘œλ”μ— μ˜ν•΄ λ©”λͺ¨λ¦¬μ— 적재될 λ•Œ 제거됨

    • 거의 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ

  • Retention.RUNTIME: ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에도 유효

    • λ©”λͺ¨λ¦¬μ— 적재될 λ•Œμ—λ„ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜ 정보가 μ‘΄μž¬ν•˜μ—¬ λŸ°νƒ€μž„μ—λ„ μ°Έμ‘° κ°€λŠ₯

    • 주둜 μ‹€ν–‰ 쀑에도 ν˜ΈμΆœλ˜λŠ”, νŠΉμ • λ‘œμ§μ„ μˆ˜ν–‰ν•  수 있게 ν•΄ μ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ— μ‚¬μš©

@Documented

  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ Javadoc ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄ μƒμ„±λ˜λŠ” java documentation에 ν¬ν•¨μ‹œν‚΄

@Inherited

  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‚¬μš©λœ 클래슀λ₯Ό μƒμ†ν•˜λŠ” ν΄λž˜μŠ€λ„ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ 갖도둝 함

Last updated