12.11 ๋ฆฌํ๋ ์
- ์๋ฐ๋ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ฉํ ์ ๋ณด(ํจํค์ง ์ ๋ณด, ํ์ ์ ๋ณด, ๋ฉค๋ฒ ์ ๋ณด ๋ฑ)๋ฅผ Class ๊ฐ์ฒด๋ก ๊ด๋ฆฌํจ
-> ๋ฆฌํ๋ ์ (reflection) : ์ด๋ฌํ ๋ฉํ ์ ๋ณด๋ฅผ ํ๋ก๊ทธ๋จ์์ ์ฝ๊ณ ์์ ํ๋ ํ์
* ํ๋ก๊ทธ๋จ์์ Class ๊ฐ์ฒด๋ฅผ ์ป๋ ๋ฐฉ๋ฒ - ์
์ค ์ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ผ๋ ๋์ผํ Class ๊ฐ์ฒด ์ป์
1) Class clazz = ํด๋์ค์ด๋ฆ.class; //ํด๋์ค๋ก๋ถํฐ ์ป๊ธฐ 1
2) Class clazz = Class.forName("ํจํค์ง...ํด๋์ค์ด๋ฆ"); //ํด๋์ค๋ก๋ถํฐ ์ป๊ธฐ 2
3) Class clazz = ๊ฐ์ฒด์ฐธ์กฐ๋ณ์.getClass(); //๊ฐ์ฒด๋ก๋ถํฐ ์ป๊ธฐ
1. ํจํค์ง์ ํ์ ์ ๋ณด ์ป๊ธฐ
- ํจํค์ง์ ํ์ (ํด๋์ค, ์ธํฐํ์ด์ค) ์ด๋ฆ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํ ๋ฉ์๋
| ๋ฉ์๋ | ์ฉ๋ |
| Package getPackage() | ํจํค์ง ์ ๋ณด ์ฝ๊ธฐ |
| String getSimpleName() | ํจํค์ง๋ฅผ ์ ์ธํ ํ์ ์ด๋ฆ |
| String getName() | ํจํค์ง๋ฅผ ํฌํจํ ์ ์ฒด ํ์ ์ด๋ฆ |
2. ๋ฉค๋ฒ ์ ๋ณด ์ป๊ธฐ
- ํ์ (ํด๋์ค, ์ธํฐํ์ด์ค)๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉค๋ฒ ์ ๋ณด๋ฅผ ์ป๋ ๋ฉ์๋ (๋ชจ๋ java.lang.reflect ํจํค์ง์ ์กด์ฌ)
| ๋ฉ์๋ | ์ฉ๋ |
| Constructor[ ] getDeclaredConstructors() | ์์ฑ์ ์ ๋ณด ์ฝ๊ธฐ |
| Field[ ] getDeclaredFields() | ํ๋ ์ ๋ณด ์ฝ๊ธฐ |
| Method[ ] getDeclaredMethods() | ๋ฉ์๋ ์ ๋ณด ์ฝ๊ธฐ |
3. ๋ฆฌ์์ค ๊ฒฝ๋ก ์ป๊ธฐ
- Class ๊ฐ์ฒด๋ ํด๋์ค ํ์ผ(~.class)์ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์
-> ์ด ๊ฒฝ๋ก๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ ๊ฒฝ๋ก์ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค ํ์ผ์ ์ ๋ณด ์ป์ ์ ์์
| ๋ฉ์๋ | ์ฉ๋ |
| URL getResource(String name) | ๋ฆฌ์์ค ํ์ผ์ URL ๋ฆฌํด (๊ฒฝ๋ก ์ ๋ณด๊ฐ ๋ด๊ธด URL ๊ฐ์ฒด ๋ฆฌํด) |
| InputStream getResourceAsStream(String name) | ๋ฆฌ์์ค ํ์ผ์ InputStream ๋ฆฌํด (ํ์ผ์ ๋ด์ฉ์ ์ฝ์ ์ ์๋๋ก) |
String photo1Path = clazz.getResource("photo1.jpg").getPath();
//C:\...\bin\photo1.jpg
- getPath() : URL ๊ฐ์ฒด์ ๋ฉ์๋๋ก ์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฆฌํดํจ
12.12 ์ด๋ ธํ ์ด์
- ์ด๋
ธํ
์ด์
: ์ฝ๋์์ @๋ก ์์ฑ๋๋ ์์
- ํด๋์ค ๋๋ ์ธํฐํ์ด์ค๋ฅผ ์ปดํ์ผํ๊ฑฐ๋ ์คํํ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊ฒ์ธ์ง๋ฅผ ์๋ ค์ฃผ๋ ์ค์ ์ ๋ณด
1) ์ปดํ์ผ ์ ์ฌ์ฉํ๋ ์ ๋ณด ์ ๋ฌ (์: @Override - ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ์๋ ์ฌ์ ์ ๊ฒ์ฌ๋ฅผ ํ๋๋ก ์ค์ ํจ)
2) ๋น๋ ํด์ด ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ ๋ ์ฌ์ฉํ๋ ์ ๋ณด ์ ๋ฌ
3) ์คํ ์ ํน์ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ ์ ๋ณด ์ ๋ฌ
1. ์ด๋ ธํ ์ด์ ํ์ ์ ์์ ์ ์ฉ
- ์ด๋
ธํ
์ด์
๋ ํ๋์ ํ์
์ -> ์ด๋
ธํ
์ด์
์ฌ์ฉ์ ์ํด์๋ ๋จผ์ ์ ์๋ถํฐ ํด์ผ ํจ
(์ธํฐํ์ด์ค ์ ์์ ์ ์ฌํจ - @interface ๋ค์ ์ฌ์ฉํ ์ด๋
ธํ
์ด์
์ด๋ฆ์ด ์จ๋ค)
public @interface AnnotationName {
}
@AnnotationName
- ์ด๋ ธํ ์ด์ ์ ์์ฑ์ ๊ฐ์ง ์ ์์ : ํ์ , ์ด๋ฆ์ผ๋ก ๊ตฌ์ฑ, ์ด๋ฆ ๋ค์ ๊ดํธ ๋ถ์
public @interface AnnotationName {
String prop1();
int prop2() default 1;
}
@AnnotationName(prop1 = "๊ฐ");
@AnnotationName(prop1 = "๊ฐ", prop2 = 3);
- ์ด๋
ธํ
์ด์
์ ๊ธฐ๋ณธ ์์ฑ์ธ value๋ฅผ ๊ฐ์ง ์ ์์
- ์ฝ๋์์ ์ฌ์ฉํ ๋์๋ ๊ฐ๋ง ๊ธฐ์ , ๊ทธ๋ฌ๋ฉด value ์์ฑ์ ์๋์ผ๋ก ๋์
๋จ
- ํ์ง๋ง value ์์ฑ๊ณผ ๋ค๋ฅธ ์์ฑ์ ๊ฐ์ ๋์์ ์ฃผ๊ณ ์ ํ ๋์๋ ์์ฑ ์ด๋ฆ์ ๋ฐ๋์ ๋ช
์
public @interface AnnotationName {
String value();
int prop2() default 1;
}
@AnnotationName("๊ฐ");
@AnnotationName(value = "๊ฐ", prop2 = 3);
2. ์ด๋ ธํ ์ด์ ์ ์ฉ ๋์
- ElementType ์ด๊ฑฐ ์์๋ก ์ ์๋, ์ ์ฉํ ์ ์๋ ๋์์ ์ข ๋ฅ (์ด๋ค ๋์-ํด๋์ค/๋ฉ์๋ ๋ฑ-์ ์ค์ ์ ๋ณด๋ฅผ ์ ์ฉํ ๊ฒ์ธ์ง)
| ElementType ์ด๊ฑฐ ์์ | ์ ์ฉ ์์ |
| TYPE | ํด๋์ค, ์ธํฐํ์ด์ค, ์ด๊ฑฐ ํ์ |
| ANNOTATION_TYPE | ์ด๋ ธํ ์ด์ |
| FIELD | ํ๋ |
| CONSTRUCTOR | ์์ฑ์ |
| METHOD | ๋ฉ์๋ |
| LOCAL_VARIABLE | ๋ก์ปฌ ๋ณ์ |
| PACKAGE | ํจํค์ง |
- @Target ์ด๋
ธํ
์ด์
: ์ ์ฉ ๋์์ ์ง์ ํ ๋ ์ฌ์ฉ
- ๊ธฐ๋ณธ ์์ฑ value๋ ElementType ๋ฐฐ์ด์ ๊ฐ์ผ๋ก ๊ฐ์ง : ์ ์ฉ ๋์์ ๋ณต์ ๊ฐ๋ก ์ง์ ํ๊ธฐ ์ํด!
@Target ( {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
//ํด๋์ค, ํ๋, ๋ฉ์๋์ ์ ์ฉ ๊ฐ๋ฅ
//์์ฑ์์๋ ์ ์ฉ ๋ถ๊ฐ๋ฅ - @Target์ CONSTRUCTOR๊ฐ ์์ผ๋ฏ๋ก!
public @interface AnnotationName {
}
@AnnotationName //ํด๋์ค์ ์ ์ฉ
public class ClassName {
@AnnotationName //ํ๋์ ์ ์ฉ
private String fieldName;
//@AnnotationName - ๋ถ๊ฐ๋ฅ
public ClassName() {}
@AnnotationName //๋ฉ์๋์ ์ ์ฉ
public void methodName() {}
}
3. ์ด๋ ธํ ์ด์ ์ ์ง ์ ์ฑ
- @AnnotationName์ ์ธ์ ๊น์ง ์ ์งํ ๊ฒ์ธ๊ฐ
- @Retention ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด ์ ์ง ์ ์ฑ
์ ์ง์ ํจ
- ๊ธฐ๋ณธ ์์ฑ์ธ value๋ RetentionPolicy ์ด๊ฑฐ ์์ ๊ฐ์ ๊ฐ์ง
| RetentionPolicy ์ด๊ฑฐ ์์ | ์ด๋ ธํ ์ด์ ์ ์ฉ ์์ | ์ด๋ ธํ ์ด์ ์ ๊ฑฐ ์์ |
| SOURCE | ์ปดํ์ผํ ๋ ์ ์ฉ | ์ปดํ์ผํ ํ์ ์ ๊ฑฐ๋จ |
| CLASS | ๋ฉ๋ชจ๋ฆฌ๋ก ๋ก๋ฉํ ๋ ์ ์ฉ | ๋ฉ๋ชจ๋ฆฌ๋ก ๋ก๋ฉ๋ ํ์ ์ ๊ฑฐ๋จ |
| RUNTIME | ์คํํ ๋ ์ ์ฉ | ๊ณ์ ์ ์ง๋จ |
@Target ( {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD} )
@Retention ( RetentionPolicy.RUNTIME )
public @interface AnnotationName {
}
4. ์ด๋ ธํ ์ด์ ์ค์ ์ ๋ณด ์ด์ฉ
- ์ด๋
ธํ
์ด์
์ ์๋ฌด๋ฐ ๋์์ ๊ฐ์ง์ง ์๋ ์ค์ ์ ๋ณด์ผ ๋ฟ์
-> ์ด ์ค์ ์ ๋ณด๋ฅผ ์ด์ฉํด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชซ์!
- ๋ฆฌํ๋ ์ ์ ์ด์ฉํด ์ ์ฉ ๋์์ผ๋ก๋ถํฐ ์ด๋ ธํ ์ด์ ์ ์ ๋ณด๋ฅผ ์ป์ด๋ด๋ ๋ฉ์๋๋ค
| ๋ฆฌํด ํ์ | ๋ฉ์๋๋ช (๋งค๊ฐ๋ณ์) | ์ค๋ช |
| boolean | isAnnotationPresent(AnnotationName.class) | ์ง์ ํ ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋์๋์ง ์ฌ๋ถ |
| Annotation | getAnnotation(AnnotationName.class) | ์ง์ ํ ์ด๋
ธํ
์ด์
์ด ์ ์ฉ๋์ด ์์ -> ์ด๋
ธํ
์ด์
์ ๋ฆฌํด ๊ทธ๋ ์ง ์๋ค๋ฉด -> null ์ ๋ฆฌํด |
| Annotation[ ] | getDeclaredAnnotations( ) | ์ ์ฉ๋ ๋ชจ๋ ์ด๋ ธํ ์ด์ ์ ๋ฆฌํด |
- ์ ์ฉ ๋์์ METHOD, ์ ์ง ์ ์ฑ ์ RUNTIME์ผ๋ก ํ๊ณ , ๊ตฌ๋ถ์ ์ ๋ํ ์ค์ ์ ๋ณด๋ฅผ ์์ฑ์ผ๋ก ๊ฐ์ง๊ณ ์๋ @PrintAnnotation
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target( {ElementType.METHOD} )
@Retention(RetentionPolicy.RUNTIME)
public @interface PrintAnnotation {
String value() default "-"; //์ ์ ์ข
๋ฅ
int number() default 15; //์ถ๋ ฅ ํ์
}
public class Service {
@PrintAnnotation
public void method1() {
System.out.println("์คํ ๋ด์ฉ 1");
}
@PrintAnnotation("*")
public void method2() {
System.out.println("์คํ ๋ด์ฉ 2");
}
@PrintAnnotation(value="#", number=20)
public void method3() {
System.out.println("์คํ ๋ด์ฉ 3");
}
}
- ์คํ ํด๋์ค์ธ PrintAnnotationExample์์๋ Service ํด๋์ค์ ์ ์ธ๋ ๋ฉ์๋๋ฅผ ๋ฆฌํ๋ ์ ํด์ @PrintAnnotation์ ์ค์ ์ ๋ณด๋ฅผ ์ป์ด๋ธ ํ, ๊ตฌ๋ถ์ ์ ์ถ๋ ฅํ๊ณ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถ์ํด
import java.lang.reflect.Method;
public class PrintAnnotationExample {
public static void main(String[] args) throws Exception {
Method[] declaredMethods = Service.class.getDeclaredMethods();
for(Method method : declaredMethods) {
//PrintAnnotation ์ป๊ธฐ
PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class);
//์ค์ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ์ ์ถ๋ ฅ
printLine(PrintAnnotation);
//๋ฉ์๋ ํธ์ถ
method.invoke(new Service());
//์ค์ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ์ ์ถ๋ ฅ
printLine(printAnnotation);
}
}
public static void printLine(PrintAnnotation printAnnotation) {
if(printAnnotation != null) {
//number ์์ฑ๊ฐ ์ป๊ธฐ
int number = printAnnotation.number();
for(int i = 0; i<number; i++) {
//value ์์ฑ๊ฐ ์ป๊ธฐ
String value = printAnnotation.value();
System.out.print(value);
}
System.out.println();
}
}
}
| --------------- ์คํ ๋ด์ฉ 1 --------------- ############### ์คํ ๋ด์ฉ 3 ############### *************** ์คํ ๋ด์ฉ 2 *************** |
- Service.class.getDeclaredMethods()๋ก ๊ฐ์ ธ์จ ๋ฉ์๋ ์์ ๋๋ฌธ์ ์คํ๋ด์ฉ 1, 3, 2 ์ด๋ ๊ฒ ๋์ด
'์ธ์ด > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Java] 13. ์ ๋ค๋ฆญ (2) - 3~5 (0) | 2025.08.04 |
|---|---|
| [Java] 13. ์ ๋ค๋ฆญ (1) - 1, 2 (0) | 2025.07.30 |
| [Java] 12. java.base ๋ชจ๋ (5) - 9, 10 (1) | 2025.07.25 |
| [Java] 12. java.base ๋ชจ๋ (4) - 7, 8 (0) | 2025.07.24 |
| [Java] 12. java.base ๋ชจ๋ (3) - 4~6 (2) | 2025.07.22 |