1) ์ด๋ ธํ ์ด์ (Annotation)
(1) ์ด๋ ธํ ์ด์ ์ด๋
- ์ฝ๋์์ “@”์ผ๋ก ์์ฑ๋๋ ์์๋ฅผ ์ด๋ ธํ ์ด์ ์ด๋ผ๊ณ ํ๋ฉฐ, ์ด๋ ธํ ์ด์ ์ ํด๋์ค ๋๋ ์ธํฐํ์ด์ค๋ฅผ ์ปดํ์ผํ๊ฑฐ๋ ์คํํ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊ฒ์ธ์ง๋ฅผ ์๋ ค์ฃผ๋ ์ค์ ์ ๋ณด์ด๋ค.
- ์ด๋ ธํ ์ด์ ์ ์ฃผ๋ก ์ธ ๊ฐ์ง ์ฉ๋๋ก ์ฌ์ฉ๋์ด์ง๋ค.
โ ์ปดํ์ผ ์ ์ฌ์ฉํ๋ ์ ๋ณด ์ ๋ฌ
โก ๋น๋ ํด์ด ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ ๋ ์ฌ์ฉํ๋ ์ ๋ณด ์ ๋ฌ
โข ์คํ ์ ํน์ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ ์ ๋ณด ์ ๋ฌ
- ์ปดํ์ผ ์, ์ฌ์ฉ๋๋ ์ ๋ณด ์ ๋ฌ์ ๋ํ์ ์ธ ์๋ @Override ์ด๋ ธํ ์ด์ ์ด๋ค.
- @Override๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ์๋ ์ฌ์ ์ ๊ฒ์ฌ๋ฅผ ํ๋๋ก ์ค์ ํ๋ฉฐ ์ ํํ ์ฌ์ ์๋์ง ์์๋ค๋ฉด ์ปดํ์ผ๋ฌ๋ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
- ์ด๋ ธํ ์ด์ ์ ์๋ฐ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ ๋ ํ์์ ์ธ ์์๋ก ํนํ, ์น ๊ฐ๋ฐ์ ๋ง์ด ์ฌ์ฉ๋๋ Spring ํ๋ ์ ์ํฌ ๋๋ Spring Boot์์ ๋ค์ํ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ค์ ํ๋ค.
(2) ์ด๋ ธํ ์ด์ ํ์ ์ ์์ ์ ์ฉ
- ์ด๋ ธํ ์ด์ ๋ ํ๋์ ํ์ ์ด๋ฏ๋ก ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ ์ ์๋ถํฐ ํด์ผ ํ๋ฉฐ, ์ด๋ ธํ ์ด์ ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ธํฐํ์ด์ค ์ ์ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๋ค.
[์์]
public @interface AnnotationName { }
→ @interface ๋ค์ ์ฌ์ฉํ ์ด๋
ธํ
์ด์
์ด๋ฆ์ด ์จ๋ค.
@AnnotationName
public class AnnoExample {}
→ ์ ์ํ ์ด๋
ธํ
์ด์
์ ์ฝ๋์์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ!
- ๋ํ, ์ด๋ ธํ ์ด์ ์ ์์ฑ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ ์์ฑ์ ํ์ ๊ณผ ์ด๋ฆ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ์ด๋ฆ ๋ค์ ๊ดํธ๋ฅผ ๋ถ์ธ๋ค.
- ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ default ํค์๋๋ก ์ง์ ํ ์ ์๋ค.
[์์]
public @interface AnnotationName {
String prop1();
int prop2() default 1;
}
@AnnotationName(prop1 = “๊ฐ”)
→ prop1์ ๊ธฐ๋ณธ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๊ฐ์ ๊ธฐ์ ํด์ผ ํ๊ณ
@AnnotationName(prop1 = “๊ฐ”, prop2 = 3)
→ prop2๋ ๊ธฐ๋ณธ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ์๋ต ๊ฐ๋ฅํ๋ค.
[์์]
public @interface AnnotationName {
String value();
int prop2() default 1;
}
→ value๋ ์ด๋
ธํ
์ด์
์ ๊ธฐ๋ณธ ์์ฑ์ผ๋ก value ์์ฑ์ ๊ฐ์ง ์ด๋
ธํ
์ด์
์ ์ฝ๋์์
์ฌ์ฉํ ๋๋ ์๋์ ๊ฐ์ด ๊ฐ๋ง ๊ธฐ์ ํ ์ ์๋ค.
@AnnotationName(“๊ฐ”);
→ ์ด ๊ฐ์ value ์์ฑ์ ์๋์ผ๋ก ๋์
๋๋ค.
@AnnotationName(value=“๊ฐ”, prop2=3);
→ ํ์ง๋ง value ์์ฑ๊ณผ ๋ค๋ฅธ ์์ฑ์ ๊ฐ์ ๋์์ ์ฃผ๊ณ ์ถ๋ค๋ฉด value ์์ฑ๋ช
์ ์ ์ด์ค์ผ ํจ
(3) ์ด๋ ธํ ์ด์ ์ ์ฉ ๋์
- ์๋ฐ์์ ์ด๋ ธํ ์ด์ ์ ์ค์ ์ ๋ณด์ด๋ฉฐ ์ด๋ค ๋์์ ์ค์ ์ ๋ณด๋ฅผ ์ ์ฉํ ๊ฒ์ธ์ง, ์ฆ ํด๋์ค์ ์ ์ฉํ ๊ฒ์ธ์ง, ๋ฉ์๋์ ์ ์ฉํ ๊ฒ์ธ์ง๋ฅผ ๋ช ์ํด์ฃผ์ด์ผ ํ๋ค.
- ์ ์ฉํ ์ ์๋ ๋์์ ์ข ๋ฅ๋ ElementType ์ด๊ฑฐ ์์๋ก ์ ์๋์ด ์๋ค.
Element.TYPE : ํด๋์ค, ์ธํฐํ์ด์ค, ์ด๊ฑฐ ํ์
Element.ANNOTATION_TYPE : ์ด๋
ธํ
์ด์
Element.FIELD : ํ๋
Element.CONSTRUCTOR : ์์ฑ์
Element.METHOD : ๋ฉ์๋
Element.LOCAL_VARIABLE : ๋ก์ปฌ ๋ณ์
Element.PACKAGE : ํจํค์ง
@Target( { Element.TYPE, Element.FIELD, Element.METHOD } )
public @interface AnnotationName { }
- ์ ์ฉ ๋์์ ์ง์ ํ ๋์๋ “@Target” ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉฐ @Target์ ๊ธฐ๋ณธ ์์ฑ์ธ value๋ ElementType ๋ฐฐ์ด์ ๊ฐ์ผ๋ก ๊ฐ์ง๋ค.
- ์ด๊ฒ์ ์ ์ฉ ๋์์ ๋ณต์ ๊ฐ๋ก ์ง์ ํ๊ธฐ ์ํจ์ด๋ฉฐ ์์ ์ด๋ ธํ ์ด์ ์ ํด๋์ค, ํ๋, ๋ฉ์๋์ ํด๋น ์ด๋ ธํ ์ด์ ์ ์ ์ฉํ ์ ์๊ณ ๊ทธ ์ธ์ ์์ฑ์, ํจํค์ง ๋ฑ์๋ ์ ์ฉํ ์ ์๋ค.
(4) ์ด๋ ธํ ์ด์ ์ ์ง ์ ์ฑ
- ์ด๋ ธํ ์ด์ ์ ์ ์ํ ๋, ํ ๊ฐ์ง ๋ ์ค์ํ ๊ฒ์ @AnnotationName์ ์ธ์ ๊น์ง ์ ์งํ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค.
- ์ด๋ ธํ ์ด์ ์ ์ง ์ ์ฑ ์ RetentionPolicy ์ด๊ฑฐ ์์๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด ์๋ค.
@Target( { Element.TYPE, Element.FIELD, Element.METHOD } )
@Retention( RetentionPolicy.RUNTIME )
public @interface AnnotationName { }
- ์ ์ง ์ ์ฑ ์ ์ง์ ํ ๋์๋ “@Retention” ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉฐ @Retention์ ๊ธฐ๋ณธ ์์ฑ์ธ value๋ RetentionPolicy ์ด๊ฑฐ ์์ ๊ฐ์ ๊ฐ์ง๋ค.
[Reference]
- ์ด๊ฒ์ด ์๋ฐ๋ค ๊ฐ์ ํ
๋ฐ์ํ
'๐ง Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ค๋ฆญ (3) - ์ ๋ค๋ฆญ ํด๋์ค์ ์ ๋ค๋ฆญ ๋ฉ์๋ (0) | 2023.07.22 |
---|---|
์ ๋ค๋ฆญ (2) - ์ ๋ค๋ฆญ & ํ์ ํ๋ผ๋ฏธํฐ (0) | 2023.07.22 |
์ ๋ค๋ฆญ (1) - ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ด์ (1) | 2023.07.22 |
๋ฆฌํ๋ ์ (Reflection) (0) | 2023.07.22 |
(Java) JDK ๋ฐ IntelliJ ์ค์นํ๊ธฐ (2) | 2023.04.07 |