π‘ μ΄λ Έν μ΄μ μ΄λ λ³Έλ μ£Όμμ΄λ λ»μΌλ‘, μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘ ν λ¬Έλ²μ΄λ€. μ£Όμκ³Όλ κ·Έ μν μ΄ λ€λ₯΄μ§λ§ μ£Όμμ²λΌ μ½λμ λ¬μ ν΄λμ€μ νΉλ³ν μλ―Έλ₯Ό λΆμ¬νκ±°λ κΈ°λ₯μ μ£Όμ ν μ μλ€.
μ΄λ Έν μ΄μ μ μ»΄νμΌ νμ λλ λ°νμμ ν΄μλ μ μλ€.
βοΈ μ΄λ
Έν
μ΄μ
μ μ₯μ
μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ λ°μ΄ν°μ λν μ ν¨μ± κ²μ¬μ‘°κ±΄μ μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ μ§μ λͺ
μν¨μΌλ‘μ¨ μ ν¨μ‘°κ±΄μ μ½κ² νμ
ν μ μκ² λλ©° μ½λκ° κΉλν΄μ§λ€.
λ¨μν λΆκ°μ μΈ νν λΏλ§ μλλΌ reflectionμ μ΄μ©νλ©΄ μ΄λ
Έν
μ΄μ
μ§μ λ§μΌλ‘ μνλ ν΄λμ€ μ£Όμ
λ κ°λ₯
βοΈ μ΄λ
Έν
μ΄μ
μ μν
ν¬κ² λ¬Έμν, μ»΄νμΌλ¬ 체ν¬, μ½λ λΆμμ μν μ©λλ‘ μ¬μ©λ¨
λ¬Έμνλ JavaDocμ΄ μμ΄μ λ§μ΄ μ¬μ©λμ§λ μκ³ λ³Έμ§μ μΈ λͺ©μ μ μμ€ μ½λμ λ©νλ°μ΄ν°λ₯Ό νννλ κ²
μ΄λ―Έ μλ°μ λ΄μ₯λμ΄ μλ μ΄λ
Έν
μ΄μ
μ£Όλ‘ μ»΄νμΌλ¬λ₯Ό μν κ²μΌλ‘ μ»΄νμΌλ¬μκ² μ μ©ν μ 보λ₯Ό μ 곡νλ€.
λ©μλ μμλ§ λΆμΌ μ μμΌλ©° νμ¬ λ©μλκ° μνΌν΄λμ€μ λ©μλλ₯Ό μ€λ²λΌμ΄λν λ©μλμμ μ»΄νμΌλ¬μκ² λͺ
μνλ€.
μ€λ²λΌμ΄λ© ν λ λ©μλ λͺ
μμ μ€νκ° λ°μν μ μλλ° μ»΄νμΌλ¬ μ
μ₯μμλ μλ‘μ΄ λ©μλλ₯Ό μμ±νλ κ²μΈμ§ μ€λ²λΌμ΄λ© νλ κ²μΈμ§ λͺ¨λ₯Έλ€. μ΄λ° κ²½μ° μ΄λ
Έν
μ΄μ
μ μ΄μ©ν΄μ μ€νκ° λ°μν μ μλ λΆλΆμ μ‘μμ€ μ μμ.
μ°¨ν λ²μ μ μ§μλμ§ μμ μ μκΈ° λλ¬Έμ λ μ΄μ μ¬μ©λμ§ λ§μμΌ ν λ©μλλ₯Ό λνλ
νλ‘κ·Έλλ¨Έμ μλλ₯Ό μ»΄νμΌλ¬μκ² μ λ¬νμ¬ κ²½κ³ λ₯Ό μ κ±°νλ€.
μ»΄νμΌλ¬μκ² λ€μμ μΈν°νμ΄μ€λ ν¨μν μΈν°νμ΄μ€λΌλ κ²μ λ§ν¨. μ€λ²λΌμ΄λ© μ΄λ Έν μ΄μ κ³Ό κ°μ μ΄μ λ‘ μ€μλ₯Ό λ―Έμ°μ λ°©μ§νκΈ° μν΄ μ¬μ©ν¨
μ΄λ
Έν
μ΄μ
μ μ¬μ©λλ μ΄λ
Έν
μ΄μ
μΌλ‘ ν΄λΉ μ΄λ
Έν
μ΄μ
μ λμλμμ κ²°μ νλ€.
μ£Όλ‘ μλ‘μ΄ μ΄λ
Έν
μ΄μ
μ μ μν λ μ¬μ©ν¨
μ΄λ
Έν
μ΄μ
μ΄ μ μ©κ°λ₯ν λμμ μ§μ νλλ° μ¬μ©ν¨.
μ¬λ¬ κ°μ κ°μ μ§μ ν λλ λ°°μ΄μμμ²λΌ κ΄νΈ {}λ₯Ό μ¬μ©ν΄μΌ ν¨
μ΄λ
Έν
μ΄μ
μ΄ μ μ§λλ κΈ°κ°μ μ§μ νλλ° μ¬μ©νλ€.
μΈκ°μ§ μ μ§ μ μ±
μ μ¬μ©ν μ μμ
1. SOURCE : μμ€ νμΌμλ§ μ‘΄μ¬νλ©°, ν΄λμ€ νμΌμλ μ‘΄μ¬νμ§ μλλ€.
@Overrideλ @SupressWarnings κ°μ μ»΄νμΌλ¬μ μν΄ μ¬μ©λλ μ΄λ
Έν
μ΄μ
μ μ§ μ μ±
μ΄ SOURCEμ. μ»΄νμΌλ¬λ₯Ό μ§μ μμ±ν κ²μ΄ μλλ©΄ μ΄ μ μ§ μ μ±
μ μ¬μ©ν μΌ β
2. CLASS : ν΄λμ€ νμΌμλ μ‘΄μ¬νμ§λ§ λ°νμ μμ μ¬μ©μ΄ λΆκ°λ₯νλ€.
Retention μ΄λ
Έν
μ΄μ
μ default κ°μ΄μ§λ§ λ°νμ μμ μ¬μ©μ΄ λΆκ°λ₯νμ¬ μ μ¬μ©λμ§ μλλ€.
3. RUNTIME : ν΄λμ€ νμΌμ μ‘΄μ¬νλ©° λ°νμ μμλ μ¬μ© κ°λ₯νλ€. λ°νμ μμ 리νλ μ
μ ν΅ν΄ ν΄λμ€ νμΌμ μ μ₯λ μ΄λ
Έν
μ΄μ
μ 보λ₯Ό μ½μ΄μ μ²λ¦¬ν μ μκ² λ¨.
@FunctionalInterfaceλ μ»΄νμΌλ¬κ° 체ν¬νλ μ΄λ
Έν
μ΄μ
μ΄μ§λ§ λ°νμ μμλ μ¬μ©λλ―λ‘ RUNTIMEμ μ μ§μ μ±
μ κ°λλ€.
μ΄λ
Έν
μ΄μ
μ λν μ λ³΄κ° javadocμΌλ‘ μμ±λ λ¬Έμμ ν¬ν¨λλλ‘ ν λ μ¬μ©νλ μ΄λ
Έν
μ΄μ
μ΄λ€.
built-in-annotation μ€ @Override μ @SupressWarningsλ₯Ό μ μΈνκ³ λ λͺ¨λ μ΄ μ΄λ
Έν
μ΄μ
μ΄ λΆμ΄μλ€.
βοΈλ€μ΄ν°λΈ λ©μλ : JVMμ΄ μ€μΉλ OSμ λ©μλλ₯Ό λ§ν¨
λ€μ΄ν°λΈ λ©μλμ μν΄ μ°Έμ‘°λλ μμνλμ λΆμ΄λ μ΄λ
Έν
μ΄μ
μ. λ€μ΄ν°λΈ λ©μλλ λ³΄ν΅ CμΈμ΄λ‘ μμ±λμ΄ μκ³ μλ°μμλ λ©μλμ μ μΈλΆλ§ μ μνκ³ κ΅¬νμ νμ§ μλλ€.
Object ν΄λμ€μ λ©μλλ€μ λλΆλΆ λ€μ΄ν°λΈ λ©μλμ΄λ€. μ¦, μλ°λΌλ μΈμ΄λ₯Ό ν΅ν΄ OSμ λ©μλλ₯Ό νΈμΆνλ κ²
λ€μ΄ν°λΈ λ©μλμ μλ°μ μ μλ λ©μλλ₯Ό μ°κ²°νλ κ² : JNI
public @interface MyAnnotation {}
μ΄λ Έν μ΄μ νμ μ μΈμ νΉλ³ν μ’ λ₯μ μΈν°νμ΄μ€μ΄λ€
βοΈ μ΄λ
Έν
μ΄μ
λ΄μ μ μΈλ λ©μλ : μ΄λ
Έν
μ΄μ
μ μμ(element)λΌκ³ ν¨
μ΄ μμμ κ°μμ λ°λΌ Marker, Single-value, Full μ΄λ
Έν
μ΄μ
μΌλ‘ λΆλ₯ κ°λ₯
μμκ° ν κ°λ μμΌλ©°, λ¨μν νμμΌλ‘μ μ¬μ©λλ μ΄λ
Έν
μ΄μ
μ
μ΄ μ΄λ
Έν
μ΄μ
μ μ»΄νμΌλ¬μκ² μ΄λ€ μλ―Έλ₯Ό μ λ¬νλλ° μ¬μ©λ¨
μμλ‘ λ¨μΌ λ³μλ§μ κ°λ μ΄λ Έν μ΄μ μ. λ¨μΌλ³μ λ°μ μκΈ° λλ¬Έμ κ°λ§μ λͺ μνμ¬ λ°μ΄ν°λ₯Ό μ λ¬ν μ μλ€.
@interface TestInfo {
String value();
}
@TestInfo("passed") //@TestInfo(value="passed")μ λμΌ
class NewClass { ... }
μμλ‘ λ μ΄μμ λ³μλ₯Ό κ°λ μ΄λ Έν μ΄μ μΌλ‘ λ°μ΄ν°λ₯Ό λ°°μ΄ μμ key-valueμ ννλ‘ μ λ¬
μ΄ μμμλ μΌμ ν κ·μΉμ΄ μ‘΄μ¬νλ€.
@interface TestInfo {
int count() default 1;
}
@TestInfo("passed") //@TestInfo(count=1)μ λμΌ
class NewClass { ... }