nyximos.log

[Java] ์• ๋…ธํ…Œ์ด์…˜ ๋ณธ๋ฌธ

Programming/JAVA

[Java] ์• ๋…ธํ…Œ์ด์…˜

nyximos 2022. 9. 11. 15:24

๐Ÿ‘ฉ‍๐Ÿš€ ๋ชฉํ‘œ

์ž๋ฐ”์˜ ์• ๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด ํ•™์Šตํ•˜์„ธ์š”.

๐Ÿ‘ฉ‍๐Ÿ’ป ํ•™์Šตํ•  ๊ฒƒ

  • ์• ๋…ธํ…Œ์ด์…˜ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • @retention
  • @target
  • @documented
  • ์• ๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ

 

 

 

Annotation

  • ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์ฃผ์„์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • JDK 1.5์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
  • JDK์—์„œ ์ œ๊ณตํ•˜๋Š” annotation์€ java.lang.annotation ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
  • Built in Annotation๊ณผ Meta-Annotation์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด๋‚ด๋Š” Custom Aannotation์ด ์žˆ๋‹ค.

 

์šฉ๋„

  • Information for the compiler- Annotations can be used by the compiler to detect errors or suppress warnings.
    • ์ฃผ์„์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ์–ต์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Compile-time and deployment-time processing -  Software tools can process annotation information to generate code, XML files, and so forth.
    • ์†Œํ”„ํŠธ์›จ์–ด ๋„๊ตฌ๋Š” ์ฃผ์„ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ, XML ํŒŒ์ผ ๋“ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Runtime processing -  Some annotations are available to be examined at runtime.
    • ์ผ๋ถ€ ์ฃผ์„์€ ๋Ÿฐํƒ€์ž„์— ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Built-in Annotation

  • JDK์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค.

 

@Override

  • ๋ฉ”์„œ๋“œ ์•ž์—๋งŒ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ˆ˜ํผํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.
    • ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„์„ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • → @Override ์•ˆ์“ฐ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ƒˆ๋กœ์šด ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์œผ๋กœ ์ธ์‹
class Child extends Parent {
    @Override
    void parentmethod();
}

 

 

@Deprecated

  • ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์— ๋ถ™์ธ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด java.util.Date์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ์—๋Š” ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ๋‹ค.
  • ๊ธฐ์กด์˜ ๊ฒƒ ๋Œ€์‹  ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ฐœ์„ ๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•œ๋‹ค.

 

 

 

Meta-Annotation

  • ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜

 

@Target

  • ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๊ฐ€๋Šฅํ•œ ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ง€์ •ํ•  ๋•Œ๋Š” ๊ด„ํ˜ธ { } ๋ฅผ ์‚ฌ์šฉ
  • ์ ์šฉ ๋Œ€์ƒ ์ข…๋ฅ˜ : ANNOTATION_TYPE, CONSTRUCTOR, FILD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE, TYPE_PARAMETER, TYPE_USE

 

@Retention

  • ์–ด๋…ธํ…Œ์ด์…˜์ด ์œ ์ง€๋˜๋Š” ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์œ ์ง€์ •์ฑ…์€ ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์œ ์ง€ ์ •์ฑ… retention policy

  • SOURCE : ์†Œ์Šค ํŒŒ์ผ์—๋งŒ ์กด์žฌ ๐Ÿ™†‍โ™€๏ธ, ํด๋ž˜์ŠคํŒŒ์ผ์—๋Š” ์กด์žฌ ๐Ÿ™…‍โ™€๏ธ
  • CLASS : ํด๋ž˜์Šค ํŒŒ์ผ์— ์กด์žฌ ๐Ÿ™†‍โ™€๏ธ, ์‹คํ–‰์‹œ ์‚ฌ์šฉ ๐Ÿ™…‍โ™€๏ธ, Default
  • RUNTIME : ํด๋ž˜์Šค ํŒŒ์ผ์— ์กด์žฌ ๐Ÿ™†‍โ™€๏ธ, ์‹คํ–‰์‹œ ์‚ฌ์šฉ ๐Ÿ™†‍โ™€๏ธ'
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}

 

 

@Documented

  • ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์ €๋ณด๊ฐ€ javadoc์œผ๋กœ ์ž‘์„ฑํ•œ ๋ฌธ์„œ์— ํฌํ•จ๋˜๋„๋ก ํ•œ๋‹ค.
  • ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์• ๋„ˆํ…Œ์ด์…˜ ์ค‘์— @Override์™€ @SuppressWarnings๋ฅผ ์ œ์™ธํ•œ ์–ด๋…ธํ…Œ์ด์…˜์— ๋ถ™์–ด์žˆ๋‹ค. 

 

 

 

์ปค์Šคํ…€ ์• ๋„ˆํ…Œ์ด์…˜ ์ •์˜

  • @๊ธฐํ˜ธ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.
  • ๋ชจ๋“  ์• ๋„ˆํ…Œ์ด์…˜์˜ ์กฐ์ƒ์€ Annotation์ด๋‹ค.
    • ์•”๋ฌต์ ์œผ๋กœ java.lang.annotation.Annotation ํ™•์žฅ
    • → equals(), hashCode(). toString() ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์• ๋„ˆํ…Œ์ด์…˜์€ ์ƒ์† ํ—ˆ์šฉ๐Ÿ™…‍โ™€๏ธ → ๋ช…์‹œ์ ์œผ๋กœ ์กฐ์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค. 
  • ์• ๋„ˆํ…Œ์ด์…˜์˜ ์š”์†Œ๋Š” ๋ฐ˜ํ™˜๊ฐ’์ด ์žˆ๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์—†๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์š”์†Œ์˜ ํƒ€์ž…์€ ๊ธฐ๋ณธํ˜•, String, enum, ์• ๋„ˆํ…Œ์ด์…˜, Class๋งŒ ํ—ˆ์šฉํ•œ๋‹ค.
  • ( ) ์•ˆ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.
  • ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.
  • ์š”์†Œ๋ฅผ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.
@interface ์• ๋„ˆํ…Œ์ด์…˜๋ช… {
    ํƒ€์ž… ์š”์†Œ๋ช…();
    int count();
    String[] testTools();
    TestType testType();
}

 

  • ๊ฐ ์š”์†Œ๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๊ฐ’์ด ์‚ฌ์šฉ๋œ๋‹ค.
    • ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ null์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฆฌํ„ฐ๋Ÿด์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
@interface TestInfo {
    int count() default 1;
}

@TestInfo // @TestInfo(count=1)๊ณผ ๋™์ผ
public class NewClass { ... }

 

  • ์• ๋„ˆํ…Œ์ด์…˜ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๊ณ  ์ด๋ฆ„์ด value์ผ ๋•Œ, ์š”์†Œ์˜ ์ด๋ฆ„์„ ์ƒ๋žตํ•˜๊ณ  ๊ฐ’๋งŒ ์ ์–ด๋„ ๋œ๋‹ค.
@interface TestInfo {
    String value();
}

@TestInfo("passed")   // @TestInfo(value="passed")์™€ ๋™์ผ
class NewClass {...}

 

 

 

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

  • ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ผ์ข…
  • ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€์‚ฌ, ์ˆ˜์ •, ์ƒ์„ฑํ•˜๋Š” ์—ญํ• 
  • ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ํ•„์š”
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ํ•˜๋Š” ์ค‘์— ์ƒˆ๋กœ์šด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ํด๋ž˜์Šค(๋ฐ”์ดํŠธ์ฝ”๋“œ)๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ„๊ฐœ์˜ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ

 

์‚ฌ์šฉ ์˜ˆ

  • ๋กฌ๋ณต : ๊ธฐ์กด์ฝ”๋“œ ๋ณ€๊ฒฝ
  • AutoService : ๋ฆฌ์†Œ์Šค ํŒŒ์ผ ์ƒ์„ฑ
  • @Override

 

๋™์ž‘๊ตฌ์กฐ

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

2. ์–ด๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ๋“ค์ด ๊ฐ์ž์˜ ์—ญํ• ์— ๋งž๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์€ ์–ด๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ ์‹คํ–‰

3. ์–ด๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ ๋‚ด๋ถ€์—์„œ ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ

4. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ์–ด๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์ œ์„œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ , ๋ชจ๋“  ์–ด๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐ˜๋ณต

 

 

 

 

 

์ฐธ์กฐ

12์ฃผ์ฐจ ๊ณผ์ œ: ์• ๋…ธํ…Œ์ด์…˜

๋‚จ๊ถ์„ฑ, ์ž๋ฐ”์˜ ์ •์„ ๊ธฐ์ดˆํŽธ, ๋„์šฐ์ถœํŒ, 2019

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

'Programming > JAVA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] ์ œ๋„ค๋ฆญ  (1) 2022.09.26
[Java] I/O  (1) 2022.09.21
[Java] Enum  (1) 2022.09.08
[Java] ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ  (0) 2022.09.06
[Java] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ  (0) 2022.09.01