Skip to content

Latest commit

ย 

History

History
312 lines (194 loc) ยท 9.91 KB

File metadata and controls

312 lines (194 loc) ยท 9.91 KB

์–ด๋…ธํ…Œ์ด์…˜

๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ• ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ @Override์™€ ๊ฐ™์ด @ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ• ์š”์†Œ๋กœ Java5๋ถ€ํ„ฐ ๋“ฑ์žฅํ–ˆ๋‹ค.

๋‹จ์–ด์˜ ์˜๋ฏธ์ธ ์ฃผ์„๊ณผ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์—ญํ• ๋กœ์จ ์‚ฌ์šฉ๋˜๋Š”๋ฐ ๋ฉ”์„œ๋“œ/ํด๋ž˜์Šค ๋“ฑ์— ์˜๋ฏธ๋ฅผ ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•œ ํ‘œ์‹์ด ์•„๋‹Œ ์ปดํŒŒ์ผํƒ€์ž„ ์ด๋‚˜ ๋Ÿฐํƒ€์ž„์— ํ•ด์„๋  ์ˆ˜ ์žˆ๋‹ค.


โ—พ ์žฅ์ 

๊ธฐ์กด์˜ ์ž๋ฐ”๋Š” ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ๊ฐ ๊ณ„์ธต๋ณ„ ์„ค์ • ๋ฐ์ดํ„ฐ๋“ค์„ XML์— ๋ช…์‹œํ–ˆ์—ˆ๋Š”๋ฐ ์„œ๋น„์Šค์˜ ๊ทœ๋ชจ๊ฐ€ ํด ์ˆ˜๋ก ์„ค์ •์–‘์ด ๋งŽ์•„์ง€๊ณ  ๋„๋ฉ”์ธ ์ฒ˜๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋“ค์ด ๋ถ„์‚ฐ๋˜์–ด ์žˆ์–ด ์ˆ˜์ •์ด ํž˜๋“ค์—ˆ๋‹ค.

์–ด๋…ธํ…Œ์ด์…˜์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ ์ง์ ‘ ํด๋ž˜์Šค์— ๋ช…์‹œํ•ด ์ค„ ์ˆ˜ ์žˆ๊ฒŒ๋˜์–ด ์ˆ˜์ •์ด ํ•„์š”ํ• ๋•Œ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ  ์–ดํ† ํ…Œ์ด์…˜์˜ ์žฌ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

AOP(๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.


โ—พ ์šฉ๋„

ํฌ๊ฒŒ ๋ฌธ์„œํ™”, ์ปดํŒŒ์ผ๋Ÿฌ ์ฒดํฌ, ์ฝ”๋“œ ๋ถ„์„๊ณผ ์ž๋™ ์ƒ์„ฑ,๋Ÿฐํƒ€์ž„ ํ”„๋กœ์„ธ์‹ฑ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
์ปดํŒŒ์ผ ํƒ€์ž„์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ ์‹œ์ผœ ๊ฒฝ๊ณ ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ  ๋ฌธ์„œํ™”๋Š” ์ปดํŒŒ์ผ ์‹œ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋น„์ค‘์ด ๋‚ฎ์€ ์‚ฌ์šฉ๋ฒ•์ด๋‹ค.

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ์จ ์‚ฌ์šฉ๋˜๊ณ  reflection์„ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ

"์–ด๋–ค ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ" -Karen Coyle-
ํ•œ๋งˆ๋””๋กœ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ๋Š” ๋ฐ์ดํ„ฐ

Reflection

๋ฐ˜์‚ฌ,ํˆฌ์˜์ด ๋ผ๋Š” ๋œป์œผ๋กœ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋ถ„์„ํ•ด๋‚ด๋Š” ๊ธฐ๋ฒ•
ClassName, SuperClass, Constructors, Methods, Fields, Annotations ...


โ—พ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

    @Override
    public ListNode remove(int position) {
        //์ƒ๋žต...
    }
    //...

    @Test
    void removeTest() {
        //์ƒ๋žต...
    }

์‚ฌ์šฉํ•  ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋“ฑ ์•ž์— ๋ถ™์—ฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.


โ—พ ๋ถ„๋ฅ˜

  • Maker ์–ด๋…ธํ…Œ์ด์…˜ : ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์—†๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ (ex. @Override )

  • Single-value ์–ด๋…ธํ…Œ์ด์…˜ : ๋ฉค๋ฒ„๋กœ ๋‹จ์ผ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜

  • Full ์–ด๋…ธํ…Œ์ด์…˜ : ๋‘˜ ์ด์ƒ์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค = ๊ฐ’ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•œ๋‹ค.



๋นŒํŠธ์ธ ์–ด๋…ธํ…Œ์ด์…˜

Java์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜


โ—พ Override

ํ˜„์žฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์Šˆํผ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ ๊ฒƒ์ž„์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋ช…์‹œํ•ด์ค€๋‹ค.

๋ฉ”์„œ๋“œ๊ฐ€ ์Šˆํผํด๋ž˜์Šค์— ์—†๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํƒ€์™€ ๊ฐ™์€ ์‹ค์ˆ˜๋„ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.


โ—พ Deprecated

๋งˆ์ปค ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋‹ค์Œ ๋ฒ„์ „์— ์ง€์›๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ๊ฒฝ๊ณ ๋ฅผ ์•Œ๋ฆฐ๋‹ค.

Deprecated @Deprecated๋ฅผ ๋ถ™์ธ ๋ฉ”์„œ๋“œ๋Š” IntelliJ์—์„œ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์•Œ๋ฆผ์„ ๋„์›Œ์ค€๋‹ค.


โ—พ SuppressWarning

๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์„ค๊ณ„๋ฅผ ํ–ˆ๋Š”๋ฐ ์ปดํŒŒ์ผ์€ ์ด๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์ปดํŒŒ์ผ ๊ฒฝ๊ณ ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ชฉ์ ์ด๋‹ค.


โ—พ SafeVarargs

Java 7์ด์ƒ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ์ œ๋„ค๋ฆญ๊ฐ™์€ ๊ฐ€๋ณ€์ธ์ž ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ์‹œ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค

์ œ๋„ค๋ฆญ

์‚ฌ์šฉํ•  ํด๋ž˜์Šค,๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ์™ธ๋ถ€์—์„œ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋ฒ•


โ—พ FunctionalInterface

Java 8์ด์ƒ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ฆฌ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค

1๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ 10์ฃผ์ฐจ์— ๋ฐฐ์šด Runnable์ด ๊ทธ ์˜ˆ์ด๋‹ค.



๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜

์–ด๋…ธํ…Œ์ด์…˜์— ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ •์˜(์„ค๋ช…)ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.


โ—พ @Retention

์–ด๋…ธํ…Œ์ด์…˜์ด ์œ ์ง€๋˜๋Š” ๊ธฐ๊ฐ„(Life Time)์„ ์„ค์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}
  • SOURCE : ์†Œ์ŠคํŒŒ์ผ์—๋งŒ ์กด์žฌํ•˜๊ณ , ํด๋ž˜์ŠคํŒŒ์ผ์—๋Š” ์กด์žฌx, ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ฒ„๋ ค์ง„๋‹ค.

  • CLASS : ํด๋ž˜์ŠคํŒŒ์ผ์—๋Š” ์กด์žฌํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์‹œ์— ์œ ์ง€ํ•  ํ•„์š” ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆฌ๊ณ  ์ด ๊ฐ’์ด default์ด๋‹ค.

  • RUNTIME : ํด๋ž˜์ŠคํŒŒ์ผ์—๋„ ์กด์žฌํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์•  VM์— ์˜ํ•ด ์œ ์ง€๋˜์–ด ๋ฆฌํ”Œ๋ž™์…˜์„ ํ†ตํ•ด ํด๋ž˜์Šค ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์ฝ์–ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.


โ—พ @Target

์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๊ฐ€๋Šฅํ•œ ๋Œ€์ƒ(๋™์ž‘ ๋Œ€์ƒ)์„ ์ง€์ •ํ•œ๋‹ค.

๋งŒ์•ฝ ๋‹ค๋ฅธ ํƒ€์ž…์ด ์˜จ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋„์šด๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ElmentType์ด๋ผ๋Š” enum์„ ํ†ตํ•ด ์ง€์ •ํ•œ๋‹ค. ( @Target(ElemntType.~)์™€ ๊ฐ™์ด ์‚ฌ์šฉ )

public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE,
    MODULE,

    @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS,essentialAPI=true)
    RECORD_COMPONENT;
}
  • ๊ธฐ์กด

    • TYPE : Class, Interface(์–ด๋…ธํ…Œ์ด์…˜ ํƒ€์ž… ํฌํ•จ), enum, jdk14์— ์ƒ๊ธด record

    • FIELD : ํ•„๋“œ ๊ฐ’(ํ”„๋กœํผํ‹ฐ), enum ์ƒ์ˆ˜๊ฐ’

    • METHOD : ๋ฉ”์„œ๋“œ

    • PARAMETER : ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ (๋งค๊ฐœ ๋ณ€์ˆ˜)

    • CONSTRUCTOR : ์ƒ์„ฑ์ž

    • LOCAL_VARIABLE : ์ง€์—ญ ๋ณ€์ˆ˜

    • ANNOTATION_TYPE : ์–ด๋…ธํ…Œ์ด์…˜

    • PACKAGE : ์ž๋ฐ” ํŒจํ‚ค์ง€

  • jdk 1.8 ์ดํ›„ ์ถ”๊ฐ€

    • TYPE_PARAMETER : ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜

    • TYPE_USE : ํƒ€์ž… ์‚ฌ์šฉ //jdk 9 ์ดํ›„

    • MODULE : ๋ชจ๋“ˆ

  • jdk 14์ดํ›„ ์ถ”๊ฐ€

    • RECORD_COMPONENT : Record ์ปดํฌ๋„ŒํŠธ


โ—พ @documented

์–ด๋…ธํ…Œ์ด์…˜์˜ ์ •๋ณด๊ฐ€ javadoc์˜ ๋ฌธ์„œ์— ํฌํ•จ๋˜๋„๋ก ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜


โ—พ @Inherited

์ž์‹ ํด๋ž˜์Šค์—๊ฒŒ๋„ ์–ด๋…ธํ…Œ์ด์…˜์ด ์ƒ์†๋˜๋„๋ก ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜


โ—พ @Repeatable

์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜



์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜

annotation

IntelliJ์˜ ์ƒˆ๋กœ๋งŒ๋“ค๊ธฐ์—์„œ Annotation์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์ƒˆ๋กœ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค.

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomeAnnotation {
    String name() default "ํ™๊ธธ๋™";
}

๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด @interface์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  ์œ„์˜ ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

@interface ์•ˆ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด Maker, ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•œ๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด Single-value, ๋‘๊ฐœ์ด์ƒ์„ ๊ฐ–๋Š”๋‹ค๋ฉด Full์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜์˜ default๊ฐ’์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •ํ•ด์ค„ ์ˆ˜ ๋„ ์žˆ๋‹ค.

package javaStudy.CustomAnnotation;

public class AnnotationExClass {
    @CustomAnnotation
    private String defaultName;

    @CustomAnnotation(name="์ฒ ์ˆ˜")
    private String customName;

    public AnnotationExClass() {
        this.defaultName = "์ด๋ฆ„์—†์Œ";
        this.customName = "์ด๋ฆ„์—†์Œ";
    }

    public String getDefaultName() {
        return defaultName;
    }

    public String getName2() {
        return customName;
    }
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๋Š” default๋กœ ๊ธธ๋™์„ ํ•˜๋‚˜๋Š” ์ฒ ์ˆ˜๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜ ๊ฐ’์œผ๋กœ ๊ฐ–๊ฒŒํ•˜๊ณ  ์ƒ์„ฑ์ž๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์ด๋ฆ„์—†์Œ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด reflect๋ฅผ ํ™œ์šฉํ•ด์„œ ์–ด๋…ธํ…Œ์ด์…˜ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

    @Test
    void annotationTest() {
        AnnotationExClass annotationExClass = new AnnotationExClass();
        System.out.println("defaultName : " + annotationExClass.getDefaultName() + "\ncustomName : " + annotationExClass.getName2());


        Field[] fields = annotationExClass.getClass().getDeclaredFields();
        for(Field field : fields){
            System.out.print(field.getName() +" : ");
            Annotation[] annotations = field.getDeclaredAnnotations();
            for (Annotation annotation : annotations) {
                CustomAnnotation customAnnotation = (CustomAnnotation) annotation;
                System.out.println(customAnnotation.name());
            }
        }
    }

๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์ด๋ฆ„์—†์Œ์ด์ง€๋งŒ ๊ฐ ํ•„๋“œ์— ํ• ๋‹น๋œ ์–ด๋…ธํ…Œ์ด์…˜์˜ ํ•„๋“œ ๊ฐ’์€ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

result

๋งŒ์ผ, ์–ด๋…ธํ…Œ์ด์…˜์— Retention์„ RUNTIME์œผ๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋Ÿฐํƒ€์ž„์‹œ์— ๋™์ž‘ํ•˜๋Š” reflection์„ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•œ๋‹ค.

fail



์• ๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ

๋Ÿฐํƒ€์ž„์‹œ์— ๋ฆฌํ”Œ๋ž™์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ด๋ฃจ์–ด์ง„๋‹ค.

์ปดํŒŒ์ผ ํƒ€์ž„์— ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ํ”„๋กœ์„ธ์‹ฑํ•˜๋Š” javac์— ์†ํ•œ ๋นŒ๋“œ ํˆด๋กœ ์–ด๋…ธํ…Œ์ด์…˜์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ›…์ด๋‹ค.

๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.
( AbstractProcessor๋ฅผ implementsํ•˜์—ฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ Lombok์˜ @Getter, @Setter์™€ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ์•„์„œ getter/setter๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์ œ๊ฑฐ )





Reference

https://hiddenviewer.tistory.com/88

https://stackoverflow.com/questions/2146104/what-is-annotation-processing-in-java

http://hannesdorfmann.com/annotation-processing/annotationprocessing101/

https://medium.com/@jason_kim/annotation-processing-101-%EB%B2%88%EC%97%AD-be333c7b913