μλ° μ΄λ Έν μ΄μ (@Annotation)
by JiwonDevμλ°μμ μ¬μ©νλ μ΄λ Έν μ΄μ (@Annotation )μ μ»΄νμΌλ¬λ₯Ό μν μΌμ’ μ μ£ΌμμΌλ‘, [λ°μ΄ν°λ₯Ό μ‘°μνκ±°λ μ½λμ μν₯μ λ―ΈμΉμ§ μμΌλ©°] μ»΄νμΌ κ³Όμ κ³Ό μ€νκ³Όμ μμ μ΄λ»κ² μΆκ°μ μΈ μ²λ¦¬ & μ»΄νμΌμ ν΄μΌ νλμ§ μ 보λ₯Ό μ€ μ μλ€.
λν κΌ μ»΄νμΌλ¬ μ€μ μ΄ μλλλΌλ, μννΈμ¨μ΄ κ°λ° ν΄μ΄ μ΄λ Έν μ΄μ μ 보λ₯Ό μ½μ΄ λΉλ λλ λ°°μΉμμ νμν μ½λλ₯Ό μλμΌλ‘ μμ±ν μ μλλ‘ λ§λ€ μ μλ€.
μ΄λ Έν μ΄μ μ μ κ·Ήμ μΌλ‘ μ¬μ©νκΈ°μ μλ μ΄λ¬ν μ€μ μ 보λ₯Ό XMLλ±μΌλ‘ λ°λ‘ κ΄λ¦¬νλλ°, μ΄λ Έν μ΄μ μ μ¬μ©νλ©° μλ° μμ€μ½λμ ν¨κ» ν©μ³ νλλ‘ κ΄λ¦¬ ν μ μκ² λμλ€. λν @μ΄λ Έν μ΄μ μ μ΄μ©νλ©΄ μ½λμμ μ€μ μ λ³΄κ° λͺ ννκ² λ€μ΄λμ κ°λ°μμ μ€μλ₯Ό μ€μ¬μ€λ€.
@AnnotationName
μ΄λ Έν μ΄μ μ μλ°μμ μ 곡νλ [νμ€ μ΄λ Έν μ΄μ ]κ³Ό, @interface νκ·Έλ₯Ό μ΄μ©ν΄ μ΄λ Έν μ΄μ μ μλ‘ λ§λ€ λ μ¬μ©λλ [λ©ν μ΄λ Έν μ΄μ ]μ΄ μλ€.
# μμ£Ό μ¬μ©νλ νμ€μ΄λ Έν μ΄μ
@Override
μ€λ°λΌμ΄λ©μ μ¬λ°λ₯΄κ² νλμ§, μ»΄νμΌ νμμ 체ν¬λ₯Ό νλ€.
class Parent {
void myMethod(){~}
}
class Child extends Parent{
// ??? μ€λ²λΌμ΄λ©μ νλ €λ€κ° μ€μλ‘ λ€λ₯Έ μ΄λ¦μ μμ±νμλ€.
// νμ§λ§ μ»΄νμΌλ¬ μ
μ₯μμλ μ΄κ² μ€λ²λΌμ΄λ©μ νλ €κ³ νκ±΄μ§ μ μ μλ€.
void myMetho(){~}
}
class Child extends Parent{
@Override
void myMetho(){~} // μ»΄νμΌ μλ¬! λΆλͺ¨μκ² μ‘΄μ¬νμ§ μλ λ©μλ
}
@Deprecated
μ΄λ¦λ§ λ΄λ μ μ μλ―μ΄, λ μ΄μ μ¬μ©νμ§ μλ κ²μ κΆμ₯νλ μ νλλ λ©μλμ λΆμΈλ€. μ¬μ©νμ§ μμΌλ©΄ μμ νλ©΄ λμ§ μλ?κ³ μκ°ν μ μμ§λ§ μλ°μμλ κΈ°μ‘΄ μ±μ νμνΈνμ±μ μ 곡νκΈ° μν΄ ν΄λΉ μ΄λ Έν μ΄μ μ μ¬μ©νλ€.
@Deprecated
public int getDate(){
return normalize().getDayOfMonth();
}
@FunctionalInterface
ν¨μν μΈν°νμ΄μ€μ μ¬μ©νλ©°, μ»΄νμΌλ¬κ° ν¨μνμΌλ‘ μ¬λ°λ₯΄κ² μμ±νλμ§ λ¬Έλ²μ μΌλ‘ νμΈνλ€. (νλμ μΆμλ©μλλ§ κ°μ§κ³ μλκ°?)
@SuppressWarnings("κ²½κ³ ")
ν΄λΉ λ©μλ, νλμ κ²½κ³ λ©μμ§κ° λνλλ μ»΄νμΌλ¬κ° 무μνλλ‘ μ€μ νλ€. μ¬λ¬ κ°λ₯Ό 무μνλ €λ©΄ { "a", "b", "c" } λ‘ μμ±νλ€. ν΄λΉ μ΄λ Έν μ΄μ μ μ¬μ©μΌλ‘ μ΄ κ²½κ³ λ₯Ό κ°λ°μκ° νμΈνμκ³ , μ€λ₯κ° μλλΌλ κ²μ μλ €μ€ μ μλ€.
@SuppressWarnings("unchecked")
ArrayList list = new ArrayList(); // μ λ€λ¦ νμ
μ μ§μ νμ§ μμμ
list.add(obj); // unchecked κ²½κ³ λ°μ
# μ§μ λ§λ€κΈ°, λ©ν μ΄λ Έν μ΄μ
@interface λ₯Ό μ΄μ©νμ¬ ν΄λμ€ μ μνλ―μ΄ μλ‘μ΄ μ΄λ Έν μ΄μ μ λ§λ€ μ μλ€. java.lang.annotation.ElementTypeμ μ΄μ©νμ¬ νΉμ νμ μλ§ μ μ©λλλ‘ μ€μ νλ€.
@Target( νμ
μ§μ )
@Retention( μ΄λ
Έν
μ΄μ
μλͺ
μ£ΌκΈ° )
public @interface SuppressWarnings{
String[] value();
...
}
@Target
μ΄λ Έν μ΄μ μ μ μ©λμμ μ§μ νλ€.
// ν΄λμ€(type), νλ(filed), λ©μλ(method)μ μ μ©κ°λ₯ν μ΄λ
Έν
μ΄μ
.
@Target( {TYPE, FILED, METHOD } )
public @interface MyAnnotation{...}
// μ°Έκ³ λ‘ TYPE, FILED λ±μ java.lang.annotation.ElementType μ μ‘΄μ¬νλ μ€μ κ°μ΄λ€.
@Target( {ElementType.TYPE, ElementType.METHOD } )
public @interface MyAnnotation{...}
@Retention
μ΄λ Έν μ΄μ μ΄ μ μ§(retention)λλ μκΈ°, μ¦ μ΄λ Έν μ΄μ μ μλͺ μ£ΌκΈ°λ₯Ό μ§μ ν΄μ€ μ μλ€. CLASSλ‘ μ§μ νλ©΄ λ°νμμμ μ‘΄μ¬νλ μ΄λ Έν μ΄μ μ μ¬μ©νλ 건 λΆκ°λ₯νλ° (리νλ μ λΆκ°λ₯, JVMμ ClassLoader κΉμ§λ§ μ¬μ©κ°λ₯) CLASS λ₯Ό μ°λ μΌμ κ±°μ μκ³ λ³΄ν΅ SOURCE/RUNTIME λ‘ κ΅¬λΆμ§μ΄ μ¬μ©νλ€.
SOURCE | μμ€ μ½λλ₯Ό λΆμν λλ§ μλ―Έμκ³ , μ»΄νμΌ μ΄ν λ°μ΄νΈ μ½λμλ λ¨μ§ μλλ€. |
CLASS (κΈ°λ³Έκ°) | λ°μ΄νΈ μ½λ νμΌκΉμ§ μ‘΄μ¬λ νλ, 리νλ μ μ μ΄μ©ν΄μ μ΄λ Έν μ΄μ μ 보λ₯Ό μ»μ μλ μλ€. (λ³΄ν΅ μ μμ΄λ€.) |
RUNTIME | λ°μ΄νΈ μ½λ νμΌκΉμ§ μ‘΄μ¬νκ³ λ¦¬νλ μ μ μ΄μ©νμ¬ λ°νμ μμ μ΄λ Έν μ΄μ μ 보λ₯Ό μ»μ μ μλ€. |
@Target(ElementType.METHOD )
@Retention(RetentionPolicy.SOURCE) // μ»΄νμΌ μ΄νμλ μμ΄μ§.
public @interface Override{...}
//μ°Έκ³ λ‘ μ΄λ
Έν
μ΄μ
μ μΈ μμλ λ³ μκ΄ μλ€.
@Documented
@Retention(RetentionPolicy.RUNTIME) // μ€ν νμλ μ¬μ©κ°λ₯(리νλ μ
)
@Target( TYPE )
public @interface FunctionalInterface{...}
@Documented
javadocμΌλ‘ μμ±ν λ¬Έμ(html)μ ν¬ν¨μν€λ €λ©΄ @Documentedλ₯Ό μ¬μ©νλ€. μ°λ¦¬κ° μ§μ μ¬μ©ν μΌμ κ±°μ μλ€.
//μ°Έκ³ λ‘ μ΄λ
Έν
μ΄μ
μ μΈ μμλ λ³ μκ΄ μλ€.
@Documented
@Retention(RetentionPolicy.RUNTIME) // μ€ν νμλ μ¬μ©κ°λ₯(리νλ μ
)
@Target( TYPE )
public @interface FunctionalInterface{...}
@Inherited (μμ)
ν΄λΉ μ΄λ Έν μ΄μ μ λμμ μμκΉμ§ μ μ©λκ² ν λ μ¬μ©νλ€. κ±°μ μ¬μ©ν μΌμ΄ μλ μ΄λ Έν μ΄μ μ΄κΈ΄ νλ€.
@Inheriteed
@interface MyAnno
@MyAnno
class Parent{} // μ΄λ
Έν
μ΄μ
μ μ©λ¨
class Child extends Parent{} // μ΄λ
Έν
μ΄μ
μ μ©λ¨.
@Repeatable
κ°μ μ΄λ Έν μ΄μ μ μ¬λ¬κ° λΆμΌ μ μλλ‘ λ§λ€μ΄μ€λ€. μ΄κ²λ κ±°μ μ¬μ©ν μΌμ μλ€.
@Repeatable(ToDos.class)
@interface ToDo{
...
}
// λ¨, μ λλ‘ μ¬μ©νκΈ° μν΄μλ νλλ‘ λ¬Άμ΄μ κ΄λ¦¬ν 컨ν
μ΄λ μ΄λ
Έν
μ΄μ
μ κ°μ΄ μ μν΄μΌνλ€.
@interface ToDos{
ToDo[] value();// μ΄λ
Έν
μ΄μ
μ λ°°μ΄νμ
μΌλ‘ μ μΈ. μ°Έκ³ λ‘ μ΄λ¦μ λ°λμ valueμ¬μΌν¨.
// μ΄λ
Έν
μ΄μ
μμμ μ΄λ¦μ΄ valueμΈ κ²½μ°μλ μλ΅νμ¬ μ
λ ₯ κ°λ₯.
}
@ToDo("delete test codes.")
@ToDo("override inheriteed methods")
class MyClass{
...
}
# μ΄λ Έν μ΄μ νμ μ μνκΈ°
μ΄λ Έν μ΄μ λ ν΄λμ€μ λμΌνκ² μ μ ν μ μλ€. λ¨ νμ μ μ μν λ 맀κ°λ³μκ° μλ μΆμλ©μλλ§ μ΄μ©ν μ μλ€. λΉμ°ν μΆμλ©μλλ‘λ§ μ΄λ£¨μ΄μ ΈμμΌλ―λ‘, μμΈλ₯Ό μ μΈνλκ±°λ μ λ€λ¦<T>λ₯Ό μ¬μ©νλ 건 λΆκ°λ₯νλ€.
@interface μ΄λ
Έν
μ΄μ
μ΄λ¦{
νμ
μμμ΄λ¦(); // μΆμλ©μλλ§ μ¬μ©ν μ μλ€.
}
@interface TestInfo{
int count();
static final id =100; // μμΈμ μΌλ‘ μμλ μ¬μ©κ°λ₯νλ€. μλ΅ν΄λ μμλ‘ μ·¨κΈν¨.
String testedBy();
String[] testTools(); // λ°°μ΄
TestType testType(); // enum μ΄λ Classλ κ°λ₯νλ€.
DateTime testDate(); // μμ μ΄ μλ λ€λ₯Έ μ΄λ
Έν
μ΄μ
(@DataTime)μ ν¬ν¨ν μ μλ€.
}
μ΄λ κ² μ μν μ΄λ Έν μ΄μ μ μλμ κ°μ΄ μ¬μ©ν μμλ€. μ΄λ κ² λ°μ μ 보λ₯Ό μ»΄νμΌλ¬λ μννΈμ¨μ΄ κ°λ° ν΄μ΄ μ¬μ©ν μ μλ€. 보ν΅μ μ΄λ Έν μ΄μ μ μ μ₯λ κ°μ λ€λ£¨λ μΌμ κ±°μ μκ³ λ³΄ν΅ λ§λ€μ΄μ§ μ΄λ Έν μ΄μ μ μλμ κ°μ΄ μ¬μ©νκ² λλ€.
@ default κ°
μ μ©μ κ°μ μ§μ νμ§ μμμ λ μ¬μ©ν μ μλ κΈ°λ³Έκ°μ μ§μ ν μ μλ€. λΉμ°νκ±°μ§λ§ default λ©μλλ μ¬μ© λΆκ°λ₯νλ€.
@interface TestInfo{
int count() default 1 // κΈ°λ³Έκ° 1
// λΉμ°νκ±°μ§λ§ κΈ°λ³Έκ°μΌλ‘ nullμ μ€ μλ μλ€.
int id = 100; // μ΄λ static final int id=100μΌλ‘ λ³νλλ€. μ¦ μμμ΄λ€.
}
@ value μμ
μμμ μ΄λ¦μ΄ valueμΌλλ μ¬μ©μ μ΄λ¦μ μλ΅ν μ μλ€.
@interface TestInfo{
String value();
}
@TestInfo("μ΄λ κ² λ°λ‘ μ¬μ©ν μμμ") // value="~"λ‘ μ·¨κΈλ¨.
class NewClass {...}
@ μμ νμ μ΄ λ°°μ΄μΌ λ
κ΄νΈ { } λ₯Ό μ¬μ©ν΄μ μ λ ₯νλ©°, κ°μ΄ νλ μΈκ²½μ° κ΄νΈλ₯Όμλ΅ν΄λ λλ€.
@Test(testTools= {"JUnit", "AutoTester"} )// λ°°μ΄ νμ
@Test(testTools ="JUnit")// κ°μ΄ νλμΌ λ μλ΅κ°λ₯
@Test(testTools = {})// μ€ κ°μ΄ μμλ λΉκ΄νΈλ₯Ό μ€μΌν¨. testTools; μ΄λ°κ±° μλ¨.
@ μ΄λ Έν μ΄μ μ κΈ°λ³Έ μΆμλ©μλ
java.lang.annotation.Annotation μ λͺ¨λ μ΄λ Έν μ΄μ μ μ‘°μ μΈν°νμ΄μ€μ΄λ€. νμ§λ§ extendsλ‘ μμμ ν μλ μλ€.(νλ©΄ μ»΄νμΌ μλ¬) κ·ΈλΌμλ λΆκ΅¬νκ³ μ΄λ κ² λ§λ μ΄μ λ, Objectμ λ©μλμ²λΌ λͺ¨λ μ΄λ Έν μ΄μ μ΄ κ°μ§κ³ μλ μΆμλ©μλλ₯Ό μ 곡νκΈ° μν΄μμ΄λ€.
package java.lnag.annotation;
public interface Annotation{
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType(); // μ΄λ
Έν
μ΄μ
νμ
λ°ν
}
@ Marker μ΄λ Έν μ΄μ
κ±°μ°½ν건 μλκ³ , μμμμ΄ λΉμ΄μλ μ΄λ Έν μ΄μ μ μλ―Ένλ€. μ΄λ¦ κ·Έλλ‘ νΉμ νλ, λ©μλλ₯Ό ꡬλΆν λ§μ»€λ‘ μ°μΈλ€.
@Target(METHOD)
@Retention(SOURCE)
public @interface Test{} // λ§μ»€ μ΄λ
Έν
μ΄μ
@Test // ν
μ€νΈ νμμ©λ.
public void method(){...}
@Deprecated // μ¬μ©νλ©΄ κ²½κ³ λμ°λ μ©λ.
public int getDate(){...}
'πκΈ°λ³Έ μ§μ > Java κΈ°λ³Έμ§μ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μμΈ μ²λ¦¬μ λ€μν λ°©λ² (0) | 2021.08.16 |
---|---|
μλ°μ μ§λ ¬ν(Serialization)λ? (0) | 2021.08.04 |
νλ‘κ·Έλλ° μν°ν¨ν΄ (Anti-pattern) (0) | 2021.08.02 |
StringBufferμ StringBulider (0) | 2021.07.27 |
μ°λ λ λκΈ°ν (sync, volatile, AtomicClass) (0) | 2021.07.27 |
λΈλ‘κ·Έμ μ 보
JiwonDev
JiwonDev