-
μ΄λ Έν μ΄μ (Annotation) - @Override, @Deprecated, @SuppressWarnings, @Target, @Retention, @Documented, @Inherited, @interfaceκ°λ°/Java 2022. 4. 18. 22:20
μλ νμΈμπΏοΈ
μ€λμ μ΄λ Έν μ΄μ μ λν΄ κ³΅λΆν΄λ³΄κ² μ΅λλ€.
ν΄λΉ λ΄μ©μ μλ°μ μ 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/ κ° ννμ΄μ§λ©°, κ°λ°μκ° νμν μμ μ μ΄λ Έν μ΄μ μ μΈλ§μΌλ‘λ νΈνκ² μ²λ¦¬ν μ μλλ‘ λμμ€λλ€. λμ€μ νμν λ νμΈν΄λ³΄μλ©΄ μ’κ² μ΅λλ€.
λ§λ¬΄λ¦¬
μ¬μ€μ μ΄λ Έν μ΄μ μ κ°λ°μκ° μ§μ μ μΈνμ¬ κ°λ°ν μΌμ κ±°μ μμ΅λλ€. νμ§λ§, μ΄λ―Έ λ§λ€μ΄μ Έ μλ μ΄λ Έν μ΄μ μ μ¬μ©νλ λ°©λ²μ μκ³ μμ΄μΌκ² μ΅λλ€. μ€λμ μ΄λ Έν μ΄μ μ λΆλ₯Ό 곡λΆν κ²μ μλμ§λ§, κΌ μκ³ μμ΄μΌνλ κ²λ€μ μμ£Όλ‘ μ΄ν΄λ³΄μμ΅λλ€.
μ΅κ·Όμ λ§λ€μ΄μ§ λ§μ μλ° κΈ°λ°μ νλ μμλ€μ μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ μ½λμ μμ λ§€μ° λ§μ΄ μ€μ΄κ³ , λ¨μ λ°λ³΅μ μΈ μμ λ μ€μ΄λ λ° λμμ μ€λλ€. νμ§λ§, λ¨μνκ² μ΄λ Έν μ΄μ μ μ¬μ©νλ λ°©λ²λ§ μλ©΄ μ€λ ₯μ΄ λμ§ μμ΅λλ€. μ΄λ Έν μ΄μ μ μ§μ νλ©΄ μ½λκ° λ΄λΆμ μΌλ‘ μ΄λ»κ² λ³νλλμ§μ λν΄μ μ΄ν΄λ³΄λ μ΅κ΄μ κ°μ§λ κ²μ΄ μ’μ΅λλ€.
κ°μ¬ν©λλ€ :)
'κ°λ° > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Set, Queue, Map (0) 2022.04.19 [Collection] ArrayList κ΄λ ¨ 꼬리 μ§λ¬Έ λ΅λ³ κ³΅λΆ κΈ°λ‘ (0) 2022.04.18 [Thread] Threadλ₯Ό μμ±νλ λ°©λ² - Runnable μΈν°νμ΄μ€μ Thread ν΄λμ€μ μ°¨μ΄ (0) 2022.04.13 Garbage Collector μ΄μΌκΈ° - μ μ, μ, μΈμ , μ΄λ»κ², μκ³ λ¦¬μ¦, μ’ λ₯ (0) 2022.04.11 μ μ°¨μ§ν₯μΈμ΄ VS κ°μ²΄μ§ν₯μΈμ΄ (0) 2022.04.10