ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • μ–΄λ…Έν…Œμ΄μ…˜(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/ κ°€ ν™ˆνŽ˜μ΄μ§€λ©°, κ°œλ°œμžκ°€ ν•„μš”ν•œ μž‘μ—…μ„ μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έλ§ŒμœΌλ‘œλ„ νŽΈν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. λ‚˜μ€‘μ— ν•„μš”ν•  λ•Œ ν™•μΈν•΄λ³΄μ‹œλ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€.

     

     

    마무리


    사싀상 μ–΄λ…Έν…Œμ΄μ…˜μ„ κ°œλ°œμžκ°€ 직접 μ„ μ–Έν•˜μ—¬ κ°œλ°œν•  일은 거의 μ—†μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 이미 λ§Œλ“€μ–΄μ Έ μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” 방법은 μ•Œκ³  μžˆμ–΄μ•Όκ² μŠ΅λ‹ˆλ‹€. μ˜€λŠ˜μ€ μ–΄λ…Έν…Œμ΄μ…˜ μ „λΆ€λ₯Ό κ³΅λΆ€ν•œ 것은 μ•„λ‹ˆμ§€λ§Œ, κΌ­ μ•Œκ³  μžˆμ–΄μ•Όν•˜λŠ” 것듀을 μœ„μ£Όλ‘œ μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 

     

    μ΅œκ·Όμ— λ§Œλ“€μ–΄μ§„ λ§Žμ€ μžλ°” 기반의 ν”„λ ˆμž„μ›λ“€μ€ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ½”λ“œμ˜ 양을 맀우 많이 쀄이고, λ‹¨μˆœ 반볡적인 μž‘μ—…λ„ μ€„μ΄λŠ” 데 도움을 μ€λ‹ˆλ‹€. ν•˜μ§€λ§Œ, λ‹¨μˆœν•˜κ²Œ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” λ°©λ²•λ§Œ μ•Œλ©΄ μ‹€λ ₯이 λŠ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ–΄λ…Έν…Œμ΄μ…˜μ„ μ§€μ •ν•˜λ©΄ μ½”λ“œκ°€ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ λ³€ν™˜λ˜λŠ”μ§€μ— λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄λŠ” μŠ΅κ΄€μ„ κ°€μ§€λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

     

     

    κ°μ‚¬ν•©λ‹ˆλ‹€ :)

     

     

     

     

     

    λŒ“κΈ€

Designed by Tistory.