JiwonDev

์ž๋ฐ” ์–ด๋…ธํ…Œ์ด์…˜(@Annotation)

by JiwonDev

์ž๋ฐ”์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ (@Annotation )์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์œ„ํ•œ ์ผ์ข…์˜ ์ฃผ์„์œผ๋กœ, [๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ] ์ปดํŒŒ์ผ ๊ณผ์ •๊ณผ ์‹คํ–‰๊ณผ์ •์—์„œ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ & ์ปดํŒŒ์ผ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ •๋ณด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

๋˜ํ•œ ๊ผญ ์ปดํŒŒ์ผ๋Ÿฌ ์„ค์ •์ด ์•„๋‹ˆ๋”๋ผ๋„, ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํˆด์ด ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ ์ฝ์–ด ๋นŒ๋“œ ๋˜๋А ๋ฐฐ์น˜์‹œ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

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

@AnnotationName

์–ด๋…ธํ…Œ์ด์…˜์„ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” [ํ‘œ์ค€ ์–ด๋…ธํ…Œ์ด์…˜]๊ณผ, @interface ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ๋˜๋Š” [๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜]์ด ์žˆ๋‹ค. 

ํ‘œ์ค€ ์–ด๋…ธํ…Œ์ด์…˜ (*๊ฐ€ ๋ถ™์€ ๊ฒƒ์€ ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜)

 


# ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€์–ด๋…ธํ…Œ์ด์…˜

@Override

์˜ค๋ฐ”๋ผ์ด๋”ฉ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ–ˆ๋Š”์ง€, ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฒดํฌ๋ฅผ ํ•œ๋‹ค. 

class Parent {
void myMethod(){~}
}
class Child extends Parent{
// ??? ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•˜๋ ค๋‹ค๊ฐ€ ์‹ค์ˆ˜๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ž‘์„ฑํ•˜์˜€๋‹ค.
// ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„œ๋Š” ์ด๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•˜๋ ค๊ณ  ํ•œ๊ฑด์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.
void myMetho(){~}
}
class Child extends Parent{
@Override
void myMetho(){~} // ์ปดํŒŒ์ผ ์—๋Ÿฌ! ๋ถ€๋ชจ์—๊ฒŒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ
}

 

@Deprecated

์ด๋ฆ„๋งŒ ๋ด๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” ์˜› ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์— ๋ถ™์ธ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ญ์ œํ•˜๋ฉด ๋˜์ง€ ์•Š๋ƒ?๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž๋ฐ”์—์„œ๋Š” ๊ธฐ์กด ์•ฑ์˜ ํ•˜์œ„ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

@Deprecated
public int getDate(){
return normalize().getDayOfMonth();
}
์‹ค์ œ Deprecated๋œ ๋ฉ”์„œ๋“œ. ์ปดํŒŒ์ผ์‹œ์—๋„ ๊ฒฝ๊ณ ๋ฌธ์ด ์˜ฌ๋ผ์˜ค์ง€๋งŒ, ๋ณดํ†ต IDE์—์„œ ๋จผ์ € ์•Œ๋ ค์ค€๋‹ค.

 

@FunctionalInterface

ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์— ์‚ฌ์šฉํ•˜๋ฉฐ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ๋ฌธ๋ฒ•์ ์œผ๋กœ ํ™•์ธํ•œ๋‹ค. (ํ•˜๋‚˜์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€?)

 

@SuppressWarnings("๊ฒฝ๊ณ ")

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

@SuppressWarnings("unchecked")
ArrayList list = new ArrayList(); // ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์Œ
list.add(obj); // unchecked ๊ฒฝ๊ณ  ๋ฐœ์ƒ

 

๊ทธ ์™ธ ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋‹ค๋Š”๊ฑฐ๋งŒ ์•Œ๊ณ ์žˆ์ž.

 


# ์ง์ ‘ ๋งŒ๋“ค๊ธฐ, ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜

@interface ๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค ์ •์˜ํ•˜๋“ฏ์ด ์ƒˆ๋กœ์šด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. java.lang.annotation.ElementType์„ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํƒ€์ž…์—๋งŒ ์ ์šฉ๋˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

@Target( ํƒ€์ž…์ง€์ • )
@Retention( ์–ด๋…ธํ…Œ์ด์…˜ ์ƒ๋ช…์ฃผ๊ธฐ )
public @interface SuppressWarnings{
String[] value();
...
}

 

@Target

์–ด๋…ธํ…Œ์ด์…˜์˜ ์ ์šฉ๋Œ€์ƒ์„ ์ง€์ •ํ•œ๋‹ค.

// ํด๋ž˜์Šค(type), ํ•„๋“œ(filed), ๋ฉ”์„œ๋“œ(method)์— ์ ์šฉ๊ฐ€๋Šฅํ•œ ์–ด๋…ธํ…Œ์ด์…˜.
@Target( {TYPE, FILED, METHOD } )
public @interface MyAnnotation{...}
// ์ฐธ๊ณ ๋กœ TYPE, FILED ๋“ฑ์€ java.lang.annotation.ElementType ์— ์กด์žฌํ•˜๋Š” ์„ค์ •๊ฐ’์ด๋‹ค.
@Target( {ElementType.TYPE, ElementType.METHOD } )
public @interface MyAnnotation{...}

 


@Retention

์–ด๋…ธํ…Œ์ด์…˜์ด ์œ ์ง€(retention)๋˜๋Š” ์‹œ๊ธฐ, ์ฆ‰ ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. CLASS๋กœ ์ง€์ •ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์ƒ์— ์กด์žฌํ•˜๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•œ๋ฐ (๋ฆฌํ”Œ๋ ‰์…˜ ๋ถˆ๊ฐ€๋Šฅ, JVM์˜ ClassLoader ๊นŒ์ง€๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ) CLASS ๋ฅผ ์“ฐ๋Š” ์ผ์€ ๊ฑฐ์˜ ์—†๊ณ  ๋ณดํ†ต SOURCE/RUNTIME ๋กœ ๊ตฌ๋ถ„์ง€์–ด ์‚ฌ์šฉํ•œ๋‹ค. 

SOURCE ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ๋•Œ๋งŒ ์˜๋ฏธ์žˆ๊ณ , ์ปดํŒŒ์ผ ์ดํ›„ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์—๋Š” ๋‚จ์ง€ ์•Š๋Š”๋‹ค.
CLASS (๊ธฐ๋ณธ๊ฐ’) ๋ฐ”์ดํŠธ ์ฝ”๋“œ ํŒŒ์ผ๊นŒ์ง€ ์กด์žฌ๋Š” ํ•˜๋‚˜, ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•ด์„œ ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜๋Š” ์—†๋‹ค. (๋ณดํ†ต ์ž˜ ์•ˆ์“ด๋‹ค.)
RUNTIME ๋ฐ”์ดํŠธ ์ฝ”๋“œ ํŒŒ์ผ๊นŒ์ง€ ์กด์žฌํ•˜๊ณ  ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์‹œ์— ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
source - ์ปดํŒŒ์ผ ์ดํ›„ ํด๋ž˜์ŠคํŒŒ์ผ์— ์กด์žฌ X / runtime - ๋ฐ”์ดํŠธ์ฝ”๋“œ์— ์กด์žฌ.
@Target(ElementType.METHOD )
@Retention(RetentionPolicy.SOURCE) // ์ปดํŒŒ์ผ ์ดํ›„์—๋Š” ์—†์–ด์ง.
public @interface Override{...}
//์ฐธ๊ณ ๋กœ ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ ์ˆœ์„œ๋Š” ๋ณ„ ์ƒ๊ด€ ์—†๋‹ค.
@Documented
@Retention(RetentionPolicy.RUNTIME) // ์‹คํ–‰ ํ›„์—๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ(๋ฆฌํ”Œ๋ ‰์…˜)
@Target( TYPE )
public @interface FunctionalInterface{...}

@Documented

javadoc์œผ๋กœ ์ž‘์„ฑํ•œ ๋ฌธ์„œ(html)์— ํฌํ•จ์‹œํ‚ค๋ ค๋ฉด @Documented๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค.

//์ฐธ๊ณ ๋กœ ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ ์ˆœ์„œ๋Š” ๋ณ„ ์ƒ๊ด€ ์—†๋‹ค.
@Documented
@Retention(RetentionPolicy.RUNTIME) // ์‹คํ–‰ ํ›„์—๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ(๋ฆฌํ”Œ๋ ‰์…˜)
@Target( TYPE )
public @interface FunctionalInterface{...}

 

@Inherited (์ƒ์†)

ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ๋Œ€์ƒ์˜ ์ž์‹๊นŒ์ง€ ์ ์šฉ๋˜๊ฒŒ ํ•  ๋–„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ผ์ด ์—†๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๊ธด ํ•˜๋‹ค.

@Inheriteed
@interface MyAnno
@MyAnno
class Parent{} // ์–ด๋…ธํ…Œ์ด์…˜ ์ ์šฉ๋จ
class Child extends Parent{} // ์–ด๋…ธํ…Œ์ด์…˜ ์ ์šฉ๋จ.

 

@Repeatable

๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์—ฌ๋Ÿฌ๊ฐœ ๋ถ™์ผ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค. ์ด๊ฒƒ๋„ ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ผ์€ ์—†๋‹ค.

@Repeatable(ToDos.class)
@interface ToDo{
...
}
// ๋‹จ, ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•  ์ปจํ…Œ์ด๋„ˆ ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ฐ™์ด ์ •์˜ํ•ด์•ผํ•œ๋‹ค.
@interface ToDos{
ToDo[] value();// ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฐฐ์—ดํƒ€์ž…์œผ๋กœ ์„ ์–ธ. ์ฐธ๊ณ ๋กœ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ value์—ฌ์•ผํ•จ.
// ์–ด๋…ธํ…Œ์ด์…˜ ์š”์†Œ์˜ ์ด๋ฆ„์ด value์ธ ๊ฒฝ์šฐ์—๋Š” ์ƒ๋žตํ•˜์—ฌ ์ž…๋ ฅ ๊ฐ€๋Šฅ.
}
@ToDo("delete test codes.")
@ToDo("override inheriteed methods")
class MyClass{
...
}

 


# ์–ด๋…ธํ…Œ์ด์…˜ ํƒ€์ž… ์ •์˜ํ•˜๊ธฐ

์–ด๋…ธํ…Œ์ด์…˜๋„ ํด๋ž˜์Šค์™€ ๋™์ผํ•˜๊ฒŒ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ ํƒ€์ž…์„ ์ •์˜ํ•  ๋• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ถ”์ƒ๋ฉ”์„œ๋“œ๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ์žˆ์œผ๋ฏ€๋กœ, ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•˜๋Š”๊ฑฐ๋‚˜ ์ œ๋„ค๋ฆญ<T>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

@interface ์–ด๋…ธํ…Œ์ด์…˜์ด๋ฆ„{
ํƒ€์ž… ์š”์†Œ์ด๋ฆ„(); // ์ถ”์ƒ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
}
@interface TestInfo{
int count();
static final id =100; // ์˜ˆ์™ธ์ ์œผ๋กœ ์ƒ์ˆ˜๋Š” ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ์ƒ๋žตํ•ด๋„ ์ƒ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•จ.
String testedBy();
String[] testTools(); // ๋ฐฐ์—ด
TestType testType(); // enum ์ด๋‚˜ Class๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
DateTime testDate(); // ์ž์‹ ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์–ด๋…ธํ…Œ์ด์…˜(@DataTime)์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
}

์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ›์€ ์ •๋ณด๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํˆด์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์€ ์–ด๋…ธํ…Œ์ด์…˜์— ์ €์žฅ๋œ ๊ฐ’์„ ๋‹ค๋ฃจ๋Š” ์ผ์€ ๊ฑฐ์˜ ์—†๊ณ  ๋ณดํ†ต ๋งŒ๋“ค์–ด์ง„ ์–ด๋…ธํ…Œ์ด์…˜์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

 

@ default ๊ฐ’

์ ์šฉ์‹œ ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋–„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํ•œ๊ฑฐ์ง€๋งŒ default ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

@interface TestInfo{
int count() default 1 // ๊ธฐ๋ณธ๊ฐ’ 1
// ๋‹น์—ฐํ•œ๊ฑฐ์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ null์„ ์ค„ ์ˆ˜๋Š” ์—†๋‹ค.
int id = 100; // ์ด๋Š” static final int id=100์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ์ฆ‰ ์ƒ์ˆ˜์ด๋‹ค.
}

 

@ value ์š”์†Œ

์š”์†Œ์˜ ์ด๋ฆ„์ด value์ผ๋•Œ๋Š” ์‚ฌ์šฉ์‹œ ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

@interface TestInfo{
String value();
}
@TestInfo("์ด๋ ‡๊ฒŒ ๋ฐ”๋กœ ์‚ฌ์šฉํ• ์ˆ˜์žˆ์Œ") // value="~"๋กœ ์ทจ๊ธ‰๋จ.
class NewClass {...}

 

@ ์š”์†Œ ํƒ€์ž…์ด ๋ฐฐ์—ด์ผ ๋•Œ

๊ด„ํ˜ธ { } ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž…๋ ฅํ•˜๋ฉฐ, ๊ฐ’์ด ํ•˜๋‚˜ ์ธ๊ฒฝ์šฐ ๊ด„ํ˜ธ๋ฅผ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.

@Test(testTools= {"JUnit", "AutoTester"} )// ๋ฐฐ์—ด ํƒ€์ž…
@Test(testTools ="JUnit")// ๊ฐ’์ด ํ•˜๋‚˜์ผ ๋• ์ƒ๋žต๊ฐ€๋Šฅ
@Test(testTools = {})// ์ค„ ๊ฐ’์ด ์—†์„๋• ๋นˆ๊ด„ํ˜ธ๋ฅผ ์ค˜์•ผํ•จ. testTools; ์ด๋Ÿฐ๊ฑฐ ์•ˆ๋จ.

 

@ ์–ด๋…ธํ…Œ์ด์…˜์˜ ๊ธฐ๋ณธ ์ถ”์ƒ๋ฉ”์„œ๋“œ

java.lang.annotation.Annotation ์€ ๋ชจ๋“  ์–ด๋…ธํ…Œ์ด์…˜์˜ ์กฐ์ƒ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ํ•˜์ง€๋งŒ extends๋กœ ์ƒ์†์€ ํ•  ์ˆ˜๋Š” ์—†๋‹ค.(ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ) ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ์ด์œ ๋Š”, Object์˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๋ชจ๋“  ์–ด๋…ธํ…Œ์ด์…˜์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

package java.lnag.annotation;
public interface Annotation{
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType(); // ์–ด๋…ธํ…Œ์ด์…˜ ํƒ€์ž…๋ฐ˜ํ™˜
}

 

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

๊ฑฐ์ฐฝํ•œ๊ฑด ์•„๋‹ˆ๊ณ , ์š”์†Œ์—†์ด ๋น„์–ด์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ํŠน์ • ํ•„๋“œ, ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•  ๋งˆ์ปค๋กœ ์“ฐ์ธ๋‹ค.

@Target(METHOD)
@Retention(SOURCE)
public @interface Test{} // ๋งˆ์ปค ์–ด๋…ธํ…Œ์ด์…˜
@Test // ํ…Œ์ŠคํŠธ ํ‘œ์‹œ์šฉ๋„.
public void method(){...}
@Deprecated // ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๊ณ ๋„์šฐ๋Š” ์šฉ๋„.
public int getDate(){...}
๋ธ”๋กœ๊ทธ์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ