μžλ°” Annotation

갱두·2021λ…„ 9μ›” 28일
0

πŸ“š Java

λͺ©λ‘ 보기
4/9

Annotation

πŸ’‘ μ–΄λ…Έν…Œμ΄μ…˜μ΄λž€ 본래 μ£Όμ„μ΄λž€ 뜻으둜, μΈν„°νŽ˜μ΄μŠ€λ₯Ό 기반으둜 ν•œ 문법이닀. μ£Όμ„κ³ΌλŠ” κ·Έ 역할이 λ‹€λ₯΄μ§€λ§Œ μ£Όμ„μ²˜λŸΌ μ½”λ“œμ— 달아 ν΄λž˜μŠ€μ— νŠΉλ³„ν•œ 의미λ₯Ό λΆ€μ—¬ν•˜κ±°λ‚˜ κΈ°λŠ₯을 μ£Όμž…ν•  수 μžˆλ‹€.

μ–΄λ…Έν…Œμ΄μ…˜μ€ 컴파일 νƒ€μž„ λ˜λŠ” λŸ°νƒ€μž„μ— 해석될 수 μžˆλ‹€.

βœ”οΈ μ–΄λ…Έν…Œμ΄μ…˜μ˜ μž₯점
μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 데이터에 λŒ€ν•œ μœ νš¨μ„± 검사쑰건을 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 직접 λͺ…μ‹œν•¨μœΌλ‘œμ¨ μœ νš¨μ‘°κ±΄μ„ μ‰½κ²Œ νŒŒμ•…ν•  수 있게 되며 μ½”λ“œκ°€ 깔끔해진닀.
λ‹¨μˆœνžˆ 뢀가적인 ν‘œν˜„ 뿐만 μ•„λ‹ˆλΌ reflection을 μ΄μš©ν•˜λ©΄ μ–΄λ…Έν…Œμ΄μ…˜ μ§€μ •λ§ŒμœΌλ‘œ μ›ν•˜λŠ” 클래슀 μ£Όμž…λ„ κ°€λŠ₯

βœ”οΈ μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ—­ν• 
크게 λ¬Έμ„œν™”, 컴파일러 체크, μ½”λ“œ 뢄석을 μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λ¨
λ¬Έμ„œν™”λŠ” JavaDoc이 μžˆμ–΄μ„œ 많이 μ‚¬μš©λ˜μ§€λŠ” μ•Šκ³  본질적인 λͺ©μ μ€ μ†ŒμŠ€ μ½”λ“œμ— 메타데이터λ₯Ό ν‘œν˜„ν•˜λŠ” 것

1. Built-in annotation

이미 μžλ°”μ— λ‚΄μž₯λ˜μ–΄ μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜
주둜 컴파일러λ₯Ό μœ„ν•œ κ²ƒμœΌλ‘œ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μœ μš©ν•œ 정보λ₯Ό μ œκ³΅ν•œλ‹€.

1) @Override

λ©”μ†Œλ“œ μ•žμ—λ§Œ 뢙일 수 있으며 ν˜„μž¬ λ©”μ†Œλ“œκ°€ 수퍼클래슀의 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•œ λ©”μ†Œλ“œμž„μ„ μ»΄νŒŒμΌλŸ¬μ—κ²Œ λͺ…μ‹œν•œλ‹€.
μ˜€λ²„λΌμ΄λ”© ν•  λ•Œ λ©”μ†Œλ“œ λͺ…μ—μ„œ μ˜€νƒ€κ°€ λ°œμƒν•  수 μžˆλŠ”λ° 컴파일러 μž…μž₯μ—μ„œλŠ” μƒˆλ‘œμš΄ λ©”μ†Œλ“œλ₯Ό μƒμ„±ν•˜λŠ” 것인지 μ˜€λ²„λΌμ΄λ”© ν•˜λŠ” 것인지 λͺ¨λ₯Έλ‹€. 이런 경우 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•΄μ„œ μ˜€νƒ€κ°€ λ°œμƒν•  수 μžˆλŠ” 뢀뢄을 μž‘μ•„μ€„ 수 있음.

2) @Deprecated

μ°¨ν›„ 버전에 μ§€μ›λ˜μ§€ μ•Šμ„ 수 있기 λ•Œλ¬Έμ— 더 이상 μ‚¬μš©λ˜μ§€ 말아야 ν•  λ©”μ†Œλ“œλ₯Ό λ‚˜νƒ€λƒ„

3) @SupressWarnings

ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ˜λ„λ₯Ό μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ „λ‹¬ν•˜μ—¬ κ²½κ³ λ₯Ό μ œκ±°ν•œλ‹€.

4) @FunctionalInterface

μ»΄νŒŒμΌλŸ¬μ—κ²Œ λ‹€μŒμ˜ μΈν„°νŽ˜μ΄μŠ€λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것을 말함. μ˜€λ²„λΌμ΄λ”© μ–΄λ…Έν…Œμ΄μ…˜κ³Ό 같은 이유둜 μ‹€μˆ˜λ₯Ό 미연에 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•¨

2. Meta annotation

μ–΄λ…Έν…Œμ΄μ…˜μ— μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ˜ λ™μž‘λŒ€μƒμ„ κ²°μ •ν•œλ‹€.
주둜 μƒˆλ‘œμš΄ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ •μ˜ν•  λ•Œ μ‚¬μš©ν•¨

1) @Target

μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ μš©κ°€λŠ₯ν•œ λŒ€μƒμ„ μ§€μ •ν•˜λŠ”λ° μ‚¬μš©ν•¨.
μ—¬λŸ¬ 개의 값을 지정할 λ•ŒλŠ” λ°°μ—΄μ—μ„œμ²˜λŸΌ κ΄„ν˜Έ {}λ₯Ό μ‚¬μš©ν•΄μ•Ό 함

2) @Retention

μ–΄λ…Έν…Œμ΄μ…˜μ΄ μœ μ§€λ˜λŠ” 기간을 μ§€μ •ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.
세가지 μœ μ§€ 정책을 μ‚¬μš©ν•  수 있음
1. SOURCE : μ†ŒμŠ€ νŒŒμΌμ—λ§Œ μ‘΄μž¬ν•˜λ©°, 클래슀 νŒŒμΌμ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
@Overrideλ‚˜ @SupressWarnings 같은 μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜ μœ μ§€ 정책이 SOURCEμž„. 컴파일러λ₯Ό 직접 μž‘μ„±ν•  것이 μ•„λ‹ˆλ©΄ 이 μœ μ§€ 정책은 μ‚¬μš©ν•  일 ❌
2. CLASS : 클래슀 νŒŒμΌμ—λŠ” μ‘΄μž¬ν•˜μ§€λ§Œ λŸ°νƒ€μž„ μ‹œμ— μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.
Retention μ–΄λ…Έν…Œμ΄μ…˜μ˜ default κ°’μ΄μ§€λ§Œ λŸ°νƒ€μž„ μ‹œμ— μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜μ—¬ 잘 μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€.
3. RUNTIME : 클래슀 νŒŒμΌμ— μ‘΄μž¬ν•˜λ©° λŸ°νƒ€μž„ μ‹œμ—λ„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. λŸ°νƒ€μž„ μ‹œμ— λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 클래슀 νŒŒμΌμ— μ €μž₯된 μ–΄λ…Έν…Œμ΄μ…˜ 정보λ₯Ό μ½μ–΄μ„œ μ²˜λ¦¬ν•  수 있게 됨.
@FunctionalInterfaceλŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ²΄ν¬ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄μ§€λ§Œ λŸ°νƒ€μž„ μ‹œμ—λ„ μ‚¬μš©λ˜λ―€λ‘œ RUNTIME의 μœ μ§€μ •μ±…μ„ κ°–λŠ”λ‹€.

3) @Documented

μ–΄λ…Έν…Œμ΄μ…˜μ— λŒ€ν•œ 정보가 javadoc으둜 μž‘μ„±λœ λ¬Έμ„œμ— ν¬ν•¨λ˜λ„λ‘ ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.
built-in-annotation 쀑 @Override 와 @SupressWarningsλ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ‘ 이 μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄μžˆλ‹€.

4) @Native

βœ”οΈλ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ : JVM이 μ„€μΉ˜λœ OS의 λ©”μ†Œλ“œλ₯Ό 말함
λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œμ— μ˜ν•΄ μ°Έμ‘°λ˜λŠ” μƒμˆ˜ν•„λ“œμ— λΆ™μ΄λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž„. λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œλŠ” 보톡 Cμ–Έμ–΄λ‘œ μž‘μ„±λ˜μ–΄ 있고 μžλ°”μ—μ„œλŠ” λ©”μ†Œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ μ •μ˜ν•˜κ³  κ΅¬ν˜„μ€ ν•˜μ§€ μ•ŠλŠ”λ‹€.
Object 클래슀의 λ©”μ†Œλ“œλ“€μ€ λŒ€λΆ€λΆ„ λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œμ΄λ‹€. 즉, μžλ°”λΌλŠ” μ–Έμ–΄λ₯Ό 톡해 OS의 λ©”μ†Œλ„λ₯Ό ν˜ΈμΆœν•˜λŠ” 것
λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œμ™€ μžλ°”μ— μ •μ˜λœ λ©”μ†Œλ“œλ₯Ό μ—°κ²°ν•˜λŠ” 것 : JNI

3. Custom Annotation

public @interface MyAnnotation {}

μ–΄λ…Έν…Œμ΄μ…˜ νƒ€μž… 선언은 νŠΉλ³„ν•œ μ’…λ₯˜μ˜ μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€

  • μ–΄λ…Έν…Œμ΄μ…˜ νƒ€μž… 선언을 일반적인 μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έκ³Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ˜ˆμ•½μ–΄ interface μ•žμ— @λ₯Ό λΆ™μž„
  • μ–΄λ…Έν…Œμ΄μ…˜ νƒ€μž…μ€ μ•”λ¬΅μ μœΌλ‘œ java.lang.annotation.Annotation을 ν™•μž₯ν•˜κΈ° λ•Œλ¬Έμ— extends μ ˆμ„ κ°€μ§ˆ 수 μ—†μŒ.
  • μ–΄λ…Έν…Œμ΄μ…˜μ€ 메타데이터 μ €μž₯을 μœ„ν•΄ 클래슀처럼 멀버λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

βœ”οΈ μ–΄λ…Έν…Œμ΄μ…˜ 내에 μ„ μ–Έλœ λ©”μ†Œλ“œ : μ–΄λ…Έν…Œμ΄μ…˜μ˜ μš”μ†Œ(element)라고 함
이 μš”μ†Œμ˜ κ°œμˆ˜μ— 따라 Marker, Single-value, Full μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ λΆ„λ₯˜ κ°€λŠ₯

Marker μ–΄λ…Έν…Œμ΄μ…˜

μš”μ†Œκ°€ ν•œ κ°œλ„ μ—†μœΌλ©°, λ‹¨μˆœνžˆ ν‘œμ‹μœΌλ‘œμ„œ μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž„
이 μ–΄λ…Έν…Œμ΄μ…˜μ€ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ–΄λ–€ 의미λ₯Ό μ „λ‹¬ν•˜λŠ”λ° μ‚¬μš©λ¨

Single-value μ–΄λ…Έν…Œμ΄μ…˜

μš”μ†Œλ‘œ 단일 λ³€μˆ˜λ§Œμ„ κ°–λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž„. λ‹¨μΌλ³€μˆ˜ 밖에 μ—†κΈ° λ•Œλ¬Έμ— κ°’λ§Œμ„ λͺ…μ‹œν•˜μ—¬ 데이터λ₯Ό 전달할 수 μžˆλ‹€.

@interface TestInfo {
	String value();
}
@TestInfo("passed") //@TestInfo(value="passed")와 동일
class NewClass { ... }

Full μ–΄λ…Έν…Œμ΄μ…˜

μš”μ†Œλ‘œ λ‘˜ μ΄μƒμ˜ λ³€μˆ˜λ₯Ό κ°–λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ 데이터λ₯Ό λ°°μ—΄ μ•ˆμ— key-value의 ν˜•νƒœλ‘œ 전달

이 μš”μ†Œμ—λŠ” μΌμ •ν•œ κ·œμΉ™μ΄ μ‘΄μž¬ν•œλ‹€.

  1. μš”μ†Œμ˜ νƒ€μž…μ€ κΈ°λ³Έν˜•, String, enum, Annotation, Class만 ν—ˆμš©λœλ‹€.
  2. μš”μ†Œμ˜ ()μ•ˆμ— λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μ—†λ‹€.
  3. μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•  수 μ—†λ‹€.
  4. μš”μ†Œλ₯Ό νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ μ •μ˜ν•  수 μ—†λ‹€.
    +) μ–΄λ…Έν…Œμ΄μ…˜μ˜ 각 μš”μ†ŒλŠ” 기본값을 κ°€μ§ˆ 수 μžˆλ‹€.
@interface TestInfo {
	int count() default 1;
}
@TestInfo("passed") //@TestInfo(count=1)와 동일
class NewClass { ... }

좜처 : https://asfirstalways.tistory.com/309

profile
πŸ‘©πŸ»β€πŸ’»πŸ”₯

0개의 λŒ“κΈ€