μ΄λ Έν μ΄μ (Annotation) - @Override, @Deprecated, @SuppressWarnings, @Target, @Retention, @Documented, @Inherited, @interface
μλ νμΈμπΏοΈ
μ€λμ μ΄λ Έν μ΄μ μ λν΄ κ³΅λΆν΄λ³΄κ² μ΅λλ€.
ν΄λΉ λ΄μ©μ μλ°μ μ chapter 17μ κΈ°λ°μΌλ‘ μ 리ν κ²μ λλ€ :)
μ΄λ Έν μ΄μ μ΄λ?
μ΄λ Έν μ΄μ μ ν΄λμ€λ λ©μλ λ±μ μ μΈμμ @λ₯Ό μ¬μ©νλ κ²μ λ§ν©λλ€. μ΄λ Έν μ΄μ μ μμ΄λ‘ Annotationμ΄λ©°, λ©νλ°μ΄ν°(Metadata)λΌκ³ λΆλ¦¬κΈ°λ ν©λλ€. μ΄λ Έν μ΄μ μ JDK5λΆν° λ±μ₯νμ΅λλ€ :)
μ΄λ Έν μ΄μ μ λ€μκ³Ό κ°μ κ²½μ°μ μ¬μ©ν©λλ€.
- μ»΄νμΌλ¬μκ² μ΄λ€ μ 보λ₯Ό μλ €μ£Όλ κ²½μ°
- μ»΄νμΌν λ μ€μΉ(deployment) μμ μμ μ μ§μ νλ κ²½μ°
- μ€νν λ λ³λμ μ²λ¦¬κ° νμν κ²½μ°
μ΄λ Έν μ΄μ μ μ λμλκ°?
κΈ°μ‘΄μ μλ° μΉ μ ν리μΌμ΄μ μμλ ꡬμ±κ³Ό μ€μ κ°μ XML μ€μ νμΌμ ν΅ν΄ λͺ μνκ³ κ΄λ¦¬νμμ΅λλ€. μ΄λ λ³κ²½λ μ μλ λ°μ΄ν°λ€μ μ½λκ° μλ μΈλΆ νμΌλ‘ λΆλ¦¬ν¨μΌλ‘μ¨ μ»΄νμΌ μμ΄ λ³κ²½μ¬νμ μ μ©νκΈ° μν¨μ΄μλλ°, μ΄λ° λ°©λ²μ΄ νλ‘κ·Έλ¨ μμ± λλ§λ€ λ§μ μ€μ μ μμ±ν΄μΌ νλ λΆνΈν¨μ λ³κ² λμμ΅λλ€. μΉ μ ν리μΌμ΄μ μ΄ μ»€μ§μ λ°λΌ μ΄λ λ κ·Ήλνλμκ³ κ²°κ΅ μ΄λ₯Ό ν΄κ²°νκΈ° μν λ°©λ²μ΄ νμνκ² λμμ΅λλ€. κ·Έλ¦¬κ³ κ·Έ λ°©λ²μΌλ‘ λμ¨ κ²μ΄ λ°λ‘ μ΄λ Έν μ΄μ μ΄λΌκ³ ν©λλ€.
μ΄λ Έν μ΄μ μ μ¬μ©νκ² λ κ²½μ° λ°μ΄ν°μ λν μ ν¨μ± κ²μ¬ 쑰건μ λ³΄λ€ μ½κ² νμ ν μ μκ³ , μ½λκ° κΉλν΄μ§κ² λ©λλ€. λν μ΄λ Έν μ΄μ κ³Ό 리νλμ μ κ°μ΄ μ΄μ©νλ©΄ μνλ ν΄λμ€λ₯Ό μ£Όμ νλ κ²λ κ°λ₯ν΄μ§λ€.
미리 μ ν΄μ Έ μλ 3κ°μ μ΄λ Έν μ΄μ
μλ° μΈμ΄μλ μ¬μ©νκΈ° μν΄μ μ ν΄μ Έ μλ 3κ°μ§ μ΄λ Έν μ΄μ μ΄ μμ΅λλ€. (JDK6κΉμ§)
- @Override
- @Deprecated
- @SuppressWarnings
@Override
ν΄λΉ λ©μλκ° λΆλͺ¨ ν΄λμ€μ μλ λ©μλλ₯Ό Overrideνλ€λ κ²μ λͺ μμ μΌλ‘ μ μΈν©λλ€. μμ ν΄λμ€μ μ¬λ¬ λ©μλκ° μμ λ, μ΄λ€ λ©μλκ° Override λμλμ§ μ½κ² μ μ μμ μλ μκ³ , μ λλ‘ λ©μλλ₯Ό Override νλ€κ³ μκ°νλλ°, λ§€κ° λ³μκ° νλ λΉ μ‘μ μλ μμ΅λλ€. λ°λΌμ λͺ ννκ² "μ΄ λ©μλλ Override λ κ±°λκΉ λ§μ½μ λ΄κ° μλͺ» μ½λ©νμΌλ©΄ μ»΄νμΌλ¬ λκ° μλ €μ€μΌ ν΄~~" λΌκ³ μ§μ ν΄ μ£Όλ κ²μ΄λΌκ³ μκ°νλ©΄ λ©λλ€.
@Deprecated
package c.annotation;
public class AnnotationDeprecated {
@Deprecated
public void noMoreUse() {
}
}
미리 λ§λ€μ΄μ Έ μλ ν΄λμ€λ λ©μλκ° λ μ΄μ μ¬μ©λμ§ μλ κ²½μ°κ° μμ΅λλ€. κ·Έλ° κ²μ deprecatedλΌκ³ νλλ°, μ»΄νμΌλ¬μκ² "μλ λ μ΄μ μ¬μ©νμ§ μμΌλκΉ κ·Έλ κ² μμμ€. κ·Έλ¦¬κ³ λμ€μ λκ° μ΄κ±° μ°λ©΄ κ²½κ³ ν λ² ν΄μ£Όκ³ ..."λΌκ³ μΌλ¬ μ£Όλ κ²μ΄λΌκ³ μκ°νλ©΄ λ©λλ€.
"κ·Έλ₯ μ§μλ²λ¦¬μ§ μ μ΄λ κ² DeprecatedλΌκ³ νμλ₯Ό ν΄μΌ νλκ±°μ§?" λΌκ³ μκ° ν μλ μμ΅λλ€. κ·Έλ°λ°, λ§μ½ μ¬λ¬λΆλ€μ΄ λ€λ₯Έ μ¬λλ€κ³Ό κ°μ΄ κ°λ°νκ³ μλλ°, μ΄λ€ ν΄λμ€λ λ©μλλ₯Ό λΆνμνλ€κ³ μκ°ν΄μ μ§μλ²λ¦¬λ©΄ μ΄λ»κ² λ κΉμ? λ§μ½ μ§μλ²λ¦° λ©μλλ ν΄λμ€λ₯Ό μ°Έμ‘°νκ³ μλ λΆλΆμ΄ μλλ°, κ·Έ κ°λ°μκ° μ΄λ¬ν λ³κ²½μ¬νμ λͺ¨λ₯΄κ³ μλ€λ©΄, μ»΄νμΌν λ μλ¬κ° λ°μν κ²μ λλ€. κ·Έλ¬λ―λ‘, νμ νΈνμ±μ μν΄μ Deprecatedλ‘ μ μΈνλ κ²μ κΌ νμνλ©°, κ°μ₯ μ’μ λ°©λ²μΌλ‘λ κ³λ κΈ°κ°μ κ±°μ³ μλ¦Όμ μ€ νμ μ§μ°λ κ²μ΄ λ°λμ§νκ² μ΅λλ€.
@SuppressWarnings
κ°νΉ μ½λ©μ νλ€ λ³΄λ©΄ μ»΄νμΌλ¬μμ κ²½κ³ (Warning)λ₯Ό μ리λ κ²½μ°κ° μμ΅λλ€. νλ‘κ·Έλ¨μλ λ¬Έμ κ° μλλ°, λ΄κ° μ μμμ νλλ° μ΄λ¬ν κ²½κ³ κ° λνλλ©΄ μ¬μ§ λ§μμ΄ λΆνΈνκΈ°λ ν©λλ€. κ·Έλ΄ λ μ»΄νμΌλ¬μκ² "μλ μΌλΆλ¬ μ΄λ κ² μ½λ©ν κ±°λκΉ λκ° κ²½κ³ λ₯Ό ν΄ μ€ νμκ° μμ΄"λΌκ³ μ΄μΌκΈ° ν΄μ£Όλ κ²μ λλ€.
μ΄ μ΄λ Έν μ΄μ μ λ€λ₯Έ μ΄λ Έν μ΄μ κ³Ό λ€λ₯΄κ² μκ΄νΈ μμ λ¬Έμμ΄μ λ겨μ€λλ€.
package c.annotation;
public class AnnotationSample {
@SuppressWarnings("deprecation")
public void useDeprecated() {
AnnotationDeprecated child = new AnnotationDeprecated();
child.noMoreUse();
}
}
μλ₯Ό λ€μ΄, @SuppressWarnings("deprecation") μ΄λ κ² μ μΈν μ μμ΅λλ€. μλλ deprecatedμ λν κ²½κ³ κ° λ μΌ νμ§λ§, μ΄λ°μμΌλ‘ μ μΈνκ³ λλ©΄, μ»΄νμΌμ ν΄λ μλ¬΄λ° λ©μΈμ§κ° λνλμ§ μμ΅λλ€. νμ§λ§, μ΄ μ΄λ Έν μ΄μ μ λ무 λ¨μ©ν κ²½μ°μλ Deprecatedλ λ©μλλ₯Ό μ¬μ©ν΄λ λͺ¨λ₯΄κ³ λμ΄κ° μλ μμΌλ μ μνκΈ°λ°λλλ€.
μ΄λ Έν μ΄μ μ μ μΈνκΈ° μν λ©ν μ΄λ Έν μ΄μ
λ©ν μ΄λ Έν μ΄μ (Meta Annotation)μ΄λΌλ κ²μ μ΄λ Έν μ΄μ μ μ§μ μ μΈν λ μ¬μ©ν©λλ€. λ©ν μ΄λ Έν μ΄μ μ λ€μκ³Ό κ°μ΄ 4κ°κ° μ‘΄μ¬ν©λλ€. μ΄λ Έν μ΄μ μ μ μΌν λ κΌ μ΄ 4κ°λ₯Ό λͺ¨λ μ¬μ©ν΄μΌνλ κ²μ μλλλ€.
- @Target
- @Retention
- @Documented
- @Inherited
@Target
μ΄λ Έν μ΄μ μ μ΄λ€ κ²μ μ μ©ν μ§λ₯Ό μ μΈν λ μ¬μ©ν©λλ€. μ μ© λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
@Target(ElementType.METHOD)
μ΄μ²λΌ @Target() κ΄νΈ μμ μ μ© λμμ μ§μ νλλ°, κ·Έ λμ λͺ©λ‘μ λ€μκ³Ό κ°μ΅λλ€.
μμ νμ | λμ |
CONSTRUCTOR | μμ±μ μ μΈμ |
FIELD | enum μμλ₯Ό ν¬ν¨ν νλ(field) κ° μ μΈμ |
LOCAL_VARIABLE | μ§μ λ³μ μ μΈ μ |
METHOD | λ©μλ μ μΈμ |
PACKAGE | ν¨ν€μ§ μ μΈμ |
PARAMETER | λ§€κ° λ³μ μ μΈμ |
TYPE | ν΄λμ€, μΈν°νμ΄μ€, enum λ± μ μΈμ |
@Retention
μΌλ§λ μ€λ μ΄λ Έν μ΄μ μ λ³΄κ° μ μ§λλμ§λ₯Ό λ€μκ³Ό κ°μ΄ μ μΈν©λλ€.
@Retention(RetentionPolicy.RUNTIME)
@Targetμ²λΌ κ΄νΈ μμ μ§μ νλ μ μ© κ°λ₯ν λμμ λ€μκ³Ό κ°μ΅λλ€.
λμ | |
SOURCE | μ΄λ Έν μ΄μ μ λ³΄κ° μ»΄νμΌμ μ¬λΌμ§ |
CLASS | ν΄λμ€ νμΌμ μλ μ΄λ Έν μ΄μ μ λ³΄κ° μ»΄νμΌλ¬μ μν΄μ μ°Έμ‘° κ°λ₯ν¨. νμ§λ§, κ°μ λ¨Έμ (Virtual Machine)μμλ μ¬λΌμ§ |
RUNTIME | μ€νμ μ΄λ Έν μ΄μ μ λ³΄κ° κ°μ λ¨Έμ μ μν΄μ μ°Έμ‘° κ°λ₯ |
@Documented
ν΄λΉ "μ΄λ Έν μ΄μ μ λν μ λ³΄κ° Javadocs(API) λ¬Έμμ ν¬ν¨λλ€λ κ²"μ μ μΈν©λλ€.
@Inherited
λͺ¨λ μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€μ μ΄λ Έν μ΄μ μ μ¬μ© κ°λ₯νλ€λ κ²μ μ μΈν©λλ€.
@interface
μ΄λ
Έν
μ΄μ
μ μ μΈν λ μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄, ν΄λμ€λ₯Ό public @interface UserAnnotation {} μ΄λ°μμΌλ‘ μ μΈνλ©΄, @UserAnnotation μΌλ‘ μ΄λ
Έν
μ΄μ
μ΄ μ¬μ© κ°λ₯ν΄μ§λλ€.
μΆκ°λ‘, μ΄λ Έν μ΄μ μ μμμ΄ λμ§ μμ΅λλ€. λν 둬볡(lombok)μ΄λΌλ κ²μ΄ μλλ°, https://projectlombok.org/ κ° ννμ΄μ§λ©°, κ°λ°μκ° νμν μμ μ μ΄λ Έν μ΄μ μ μΈλ§μΌλ‘λ νΈνκ² μ²λ¦¬ν μ μλλ‘ λμμ€λλ€. λμ€μ νμν λ νμΈν΄λ³΄μλ©΄ μ’κ² μ΅λλ€.
λ§λ¬΄λ¦¬
μ¬μ€μ μ΄λ Έν μ΄μ μ κ°λ°μκ° μ§μ μ μΈνμ¬ κ°λ°ν μΌμ κ±°μ μμ΅λλ€. νμ§λ§, μ΄λ―Έ λ§λ€μ΄μ Έ μλ μ΄λ Έν μ΄μ μ μ¬μ©νλ λ°©λ²μ μκ³ μμ΄μΌκ² μ΅λλ€. μ€λμ μ΄λ Έν μ΄μ μ λΆλ₯Ό 곡λΆν κ²μ μλμ§λ§, κΌ μκ³ μμ΄μΌνλ κ²λ€μ μμ£Όλ‘ μ΄ν΄λ³΄μμ΅λλ€.
μ΅κ·Όμ λ§λ€μ΄μ§ λ§μ μλ° κΈ°λ°μ νλ μμλ€μ μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μ½λμ μμ λ§€μ° λ§μ΄ μ€μ΄κ³ , λ¨μ λ°λ³΅μ μΈ μμ λ μ€μ΄λ λ° λμμ μ€λλ€. νμ§λ§, λ¨μνκ² μ΄λ Έν μ΄μ μ μ¬μ©νλ λ°©λ²λ§ μλ©΄ μ€λ ₯μ΄ λμ§ μμ΅λλ€. μ΄λ Έν μ΄μ μ μ§μ νλ©΄ μ½λκ° λ΄λΆμ μΌλ‘ μ΄λ»κ² λ³νλλμ§μ λν΄μ μ΄ν΄λ³΄λ μ΅κ΄μ κ°μ§λ κ²μ΄ μ’μ΅λλ€.
κ°μ¬ν©λλ€ :)