๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๋ ์ฌ์ฉํ๋ @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์ ๋ด์ฅ๋์ด ์๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ปดํ์ผ๋ฌ๋ฅผ ์ํ ์ด๋ ธํ ์ด์
ํ์ฌ ๋ฉ์๋๊ฐ ์ํผ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ๊ฒ์์ ์ปดํ์ผ๋ฌ์๊ฒ ๋ช ์ํด์ค๋ค.
๋ฉ์๋๊ฐ ์ํผํด๋์ค์ ์๋ค๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์๊ธฐ ๋๋ฌธ์ ์คํ์ ๊ฐ์ ์ค์๋ ์ก์ ์ ์๋ค.
๋ง์ปค ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ค์ ๋ฒ์ ์ ์ง์๋์ง ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ์์ผ๋ก ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ๊ฒฝ๊ณ ๋ฅผ ์๋ฆฐ๋ค.
@Deprecated๋ฅผ ๋ถ์ธ ๋ฉ์๋๋ IntelliJ์์ ์ฌ์ง๊ณผ ๊ฐ์ด ์๋ฆผ์ ๋์์ค๋ค.
๊ฒฝ๊ณ ๋ฅผ ์ ๊ฑฐํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ์๋๋ฅผ ๊ฐ์ง๊ณ ์ค๊ณ๋ฅผ ํ๋๋ฐ ์ปดํ์ผ์ ์ด๋ฅผ ์์ง ๋ชปํ๊ณ ์ปดํ์ผ ๊ฒฝ๊ณ ๋ฅผ ๋์ธ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ๊ฑฐํ๋ ๋ชฉ์ ์ด๋ค.
Java 7์ด์์์ ์ฌ์ฉ๊ฐ๋ฅํ๊ณ ์ ๋ค๋ฆญ๊ฐ์ ๊ฐ๋ณ์ธ์ ๋งค๊ฐ๋ณ์ ์ฌ์ฉ์ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๋ค
์ ๋ค๋ฆญ
์ฌ์ฉํ ํด๋์ค,๋ฉ์๋ ๋ด๋ถ์์์ ๋ฐ์ดํฐํ์
์ ์ธ๋ถ์์ ์ง์ ํ๋ ๊ธฐ๋ฒ
Java 8์ด์์์ ์ฌ์ฉ๊ฐ๋ฅํ๊ณ ์ปดํ์ผ๋ฌ์๊ฒ ํจ์ํ ์ธํฐํ์ด์ค๋ผ๋ ๊ฒ์ ์๋ฆฌ๋ ์ด๋
ธํ
์ด์
์ด๋ค.
ํจ์ํ ์ธํฐํ์ด์ค
1๊ฐ์ ์ถ์ ๋ฉ์๋๋ง์ ๊ฐ๊ณ ์๋ ์ธํฐํ์ด์ค๋ก 10์ฃผ์ฐจ์ ๋ฐฐ์ด Runnable์ด ๊ทธ ์์ด๋ค.
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ด๋ ธํ ์ด์ ์ ์ ์(์ค๋ช )ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
์ด๋
ธํ
์ด์
์ด ์ ์ง๋๋ ๊ธฐ๊ฐ(Life Time)์ ์ค์ ํ๋ ์ด๋
ธํ
์ด์
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}-
SOURCE : ์์คํ์ผ์๋ง ์กด์ฌํ๊ณ , ํด๋์คํ์ผ์๋ ์กด์ฌx, ์ปดํ์ผ๋ฌ์ ์ํด ๋ฒ๋ ค์ง๋ค.
-
CLASS : ํด๋์คํ์ผ์๋ ์กด์ฌํ์ง๋ง ๋ฐํ์ ์์ ์ ์งํ ํ์ ์๋ค๋ ๊ฒ์ ์๋ฆฌ๊ณ ์ด ๊ฐ์ด default์ด๋ค.
-
RUNTIME : ํด๋์คํ์ผ์๋ ์กด์ฌํ๊ณ ๋ฐํ์์ VM์ ์ํด ์ ์ง๋์ด ๋ฆฌํ๋์ ์ ํตํด ํด๋์ค ํ์ผ์ ์ ๋ณด๋ฅผ ์ฝ์ด ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
์ด๋
ธํ
์ด์
์ด ์ ์ฉ๊ฐ๋ฅํ ๋์(๋์ ๋์)์ ์ง์ ํ๋ค.
๋ง์ฝ ๋ค๋ฅธ ํ์ ์ด ์จ๋ค๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋์ด๋ค.
์๋์ ๊ฐ์ 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 ์ปดํฌ๋ํธ
์ด๋ ธํ ์ด์ ์ ์ ๋ณด๊ฐ javadoc์ ๋ฌธ์์ ํฌํจ๋๋๋ก ํ๋ ์ด๋ ธํ ์ด์
์์ ํด๋์ค์๊ฒ๋ ์ด๋ ธํ ์ด์ ์ด ์์๋๋๋ก ํ๋ ์ด๋ ธํ ์ด์
์ด๋ ธํ ์ด์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ธํ ์ ์๊ฒ ํ๋ ์ด๋ ธํ ์ด์
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());
}
}
}๊ฒฐ๊ณผ๋ฌผ์ ๋ณด๋ฉด ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ด๋ฆ์์์ด์ง๋ง ๊ฐ ํ๋์ ํ ๋น๋ ์ด๋
ธํ
์ด์
์ ํ๋ ๊ฐ์ ๋ค๋ฅธ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ง์ผ, ์ด๋
ธํ
์ด์
์ Retention์ RUNTIME์ผ๋ก ํ์ง ์์ผ๋ฉด ์๋์ ๊ฐ์ด ๋ฐํ์์์ ๋์ํ๋ reflection์ ์ด์ฉํด์ ๊ฐ์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ค.
๋ฐํ์์์ ๋ฆฌํ๋์ ์ ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ ๊ณผ๋ ๋ฌ๋ฆฌ ์ปดํ์ผ ํ์์ ์ด๋ฃจ์ด์ง๋ค.
์ปดํ์ผ ํ์์ ์ด๋ ธํ ์ด์ ๋ค์ ํ๋ก์ธ์ฑํ๋ javac์ ์ํ ๋น๋ ํด๋ก ์ด๋ ธํ ์ด์ ์ ์์ค์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ ์ด๋ค.
๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋๋ฐ ๋์์ด ๋๋ค.
( AbstractProcessor๋ฅผ implementsํ์ฌ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ Lombok์ @Getter, @Setter์ ๊ฐ์ ์ด๋
ธํ
์ด์
์ ์ด์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ปดํ์ผ ํ์์ ์์์ getter/setter๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋ ์ ๊ฑฐ )
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
