Post

Reflection์ด๋ž€?

Reflection์ด๋ž€?

๐Ÿฅ‘ ๋“ค์–ด๊ฐ€๋ฉฐ

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์Šคํ”„๋ง ๊ณต๋ถ€์˜ ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค.. ๋ฏธ๋ค„๋’€๋˜ ํ† ๋น„์˜ ์Šคํ”„๋ง์„ ๊บผ๋‚ด ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ด๋ฒˆ์—” ๋Œ€์ถฉ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋” ๊ผผ๊ผผํžˆ ๋ณด๋ ค ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ฝ๋˜ ์ค‘ ์ฑ…์˜ 1์žฅ์—์„œ๋ถ€ํ„ฐ ๋ฆฌํ”Œ๋ ‰์…˜์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋™์•ˆ ๋ฆฌํ”Œ๋ ‰์…˜์ด ๋ฌด์—‡์ธ์ง€ ๊ฐ์œผ๋กœ ์•Œ๊ณ ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์— ์ œ๋Œ€๋กœ ์•Œ์•„๋ณด๋ ค ํ•œ๋‹ค.


ํ† ๋น„์˜ ์Šคํ”„๋ง์— ๋‚˜์˜จ ์„ค๋ช…์— ๋”ฐ๋ฅด๋ฉด, ์ž๋ฐ” ๋นˆ(JavaBean)์€ ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ๊ด€๋ก€๋ฅผ ๋”ฐ๋ผ ๋งŒ๋“ค์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

  1. ๋””ํดํŠธ ์ƒ์„ฑ์ž(Default Constructor)

    • ํˆด์ด๋‚˜ ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค.
  2. ํ”„๋กœํผํ‹ฐ(Property)

    • ์ž๋ฐ” ๋นˆ์ด ํ˜ธ์ถœํ•˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์†์„ฑ์ด๋‹ค.
    • setter์™€ getter๋ฅผ ์ด์šฉํ•ด ์ˆ˜์ • or ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋ฆฌํ”Œ๋ ‰์…˜์ด๋ž€ ๋ฌด์—‡์ด๊ณ , ์–ด๋–ป๊ฒŒ ์ด ๊ฒƒ์„ ์ด์šฉํ•ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฑธ๊นŒ? ์ด์— ๋Œ€ํ•ด ์•Œ๋ ค๋ฉด ํด๋ž˜์Šค(Class)๋ผ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค.


๐Ÿ“Œ ํด๋ž˜์Šค(Class)๋ž€?

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ค‘ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™€ ๋‹ค๋ค„์•ผํ•  ์ผ์ด ์žˆ๋‹ค. ์ด ํด๋ž˜์Šค(Class) ๊ฐ์ฒด๊ฐ€ ์ฝ”๋“œ ์ƒ์—์„œ ํ˜ธ์ถœ ๋กœ์ง์„ ํ†ตํ•ด ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์–ป์–ด์™€ ๋‹ค๋ฃธ์œผ๋กœ์จ ๋Ÿฐํƒ€์ž„ ๋‹จ์—์„œ ๋‹ค์ด๋‚˜๋ฏนํ•˜๊ฒŒ ํด๋ž˜์Šค๋ฅผ ํ•ธ๋“ค๋งํ•˜๊ฒŒ ๋„์™€์ค€๋‹ค.

ํด๋ž˜์Šค๋Š” java.lang.Class ํŒจํ‚ค์ง€์— ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋Š” ๋…๋ฆฝํ˜• ํด๋ž˜์Šค๋กœ์„œ,ย ์ž์‹ ์ดย ์†ํ•œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—ย ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ ๋™์ ์œผ๋กœ ์ €์žฅ๋œ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

  • ํด๋ž˜์Šค ๊ฐ์ฒด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public final class Class<T> implements java.io.Serializable,
                              GenericDeclaration,
                              Type,
                              AnnotatedElement,
                              TypeDescriptor.OfField<Class<?>>,
                              Constable {
    private static final int ANNOTATION = 0x00002000;
    private static final int ENUM       = 0x00004000;
    private static final int SYNTHETIC  = 0x00001000;

    private static native void registerNatives();
    static {
        registerNatives();
    }
    ...
}

์ž๋ฐ”์˜ ๋ชจ๋“  ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ปดํŒŒ์ผ ํ›„ .java -> .class ํŒŒ์ผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. .class ํŒŒ์ผ์€ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํŒŒ์ผ์ธ๋ฐ, ์ด ํŒŒ์ผ์€ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ฉฐ, JVM(์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ )์ด ์‹คํ–‰๋  ๋•Œ ํด๋ž˜์Šค ๋กœ๋”(ClassLoader)์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋œ๋‹ค.

java.lang.Class ํด๋ž˜์Šค๋Š” JVM์ด ํด๋ž˜์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•  ๋•Œ, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(metadata)๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด์ด๋‹ค. ์ฆ‰, JVM์ด .class ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ(ํž™ ์˜์—ญ)์— ๋กœ๋“œํ•  ๋•Œ, ์ด ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ์–ป๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์™œ new ์—†์ด ์ƒ์„ฑ ๊ฐ€๋Šฅํ• ๊นŒ?

ํด๋ž˜์Šค ๊ฐ์ฒด๋Š” JVM์ด ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด๋ฏธ ๋กœ๋”ฉ๋œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํด๋ž˜์Šค ๊ฐ์ฒด๋Š” ํ•ญ์ƒ ์กด์žฌํ•˜๋ฏ€๋กœ, ์•„๋ž˜์˜ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ํ•ด๋‹น ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์„ ๋ฆฌํ”Œ๋ ‰์…˜(Reflection)์ด๋ผ๊ณ  ํ•œ๋‹ค.

JVM์˜ ํด๋ž˜์Šค ๋กœ๋”(class loader)๋Š” ์‹คํ–‰ ์‹œ์— ํ•„์š”ํ•œ ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋จผ์ € ๊ธฐ์กด์— ์ƒ์„ฑ๋œ ํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ์œผ๋ฉด ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์—†์„ ๊ฒฝ์šฐ classpath์— ์ง€์ •๋œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ์„œ ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฐพ์•„ ํ•ด๋‹น ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฝ์–ด์„œ Class ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๋งŒ์ผ ๋ชป ์ฐพ์œผ๋ฉด ClassNotFoundException ์˜ˆ์™ธ๋ฅผ ๋„์šฐ๊ฒŒ ๋œ๋‹ค.

ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•

getClass() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

  • ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ธ Object ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” getClass() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ๋‹ค.
  • ๋‹จ, ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋œ ์ƒํƒœ ์ด์–ด์•ผ ํ•œ๋‹ค.
1
2
String s = new String();
Class c = s.getClass();

.class ๋ฆฌํ„ฐ๋Ÿด ์‚ฌ์šฉ

1
Class c = String.class;

Class.forName() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ(๋™์  ๋กœ๋”ฉ)

  • ํด๋ž˜์Šค์˜ ๋„๋ฉ”์ธ์„ ์ƒ์„ธํžˆ ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • ํด๋ž˜์Šค ํŒŒ์ผ ๊ฒฝ๋กœ์— ์˜คํƒ€๊ฐ€ ์žˆ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งŒ์ผ Class ๊ฐ์ฒด๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋ฉดย ClassNotFoundException๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋œ๋‹ค.
    • ๋ณดํ†ต ๋‹ค๋ฅธ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ๋Š” ์ปดํŒŒ์ผ ์‹œ JVM์˜ Method Area์— ํด๋ž˜์Šค ํŒŒ์ผ์ด ๊ฐ™์ด ๋ฐ”์ธ๋”ฉ(binding)๋œ๋‹ค.
    • forName()์œผ๋กœ .class ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๋Š” ์ปดํŒŒ์ผ์— ๋ฐ”์ธ๋”ฉ์ด ๋˜์ง€์•Š๊ณ  ๋Ÿฐํƒ€์ž„ ๋•Œ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ๋กœ๋”ฉ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฒดํฌ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๋‹ค๋ฅธ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์  ๋กœ๋”ฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.
1
2
3
4
5
try {
    Class c = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}


๐Ÿ“Œ ๋ฆฌํ”Œ๋ ‰์…˜(Reflection)์ด๋ž€?

๋ฆฌํ”Œ๋ ‰์…˜(Reflection)์ด๋ž€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์„ ๋งํ•œ๋‹ค.

  • ์ž๋ฐ”์—์„œ ํด๋ž˜์Šค๋‚˜ ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋Ÿฐํƒ€์ž„์— ์กฐ์‚ฌํ•˜๊ณ , ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
  • ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ
  • ex) ํด๋ž˜์Šค์˜ ์ด๋ฆ„, ๋ฉ”์„œ๋“œ, ํ•„๋“œ, ์ƒ์„ฑ์ž ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์•Œ์•„๋‚ด, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ or ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

์˜ˆ์‹œ

1
2
3
4
5
6
Class<?> clazz = Class.forName("java.lang.String");
Method[] methods = clazz.getDeclaredMethods();

for (Method method : methods) {
    System.out.println(method.getName());
}

๋ฆฌํ”Œ๋ ‰์…˜์˜ ์ค‘์š”์„ฑ

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

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” ์Šคํ”„๋ง์˜ DI(dpendency injection), Proxy, ModelMapper ๋“ฑ์ด ์žˆ๋‹ค. ์ด๋ฏธ Spring, Hibernate, Lombok ๋“ฑ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ Reflection ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ฆฌํ”Œ๋ ‰์…˜

  • ์Šคํ”„๋ง์˜ DI๋Š” ์Šคํ”„๋ง์€ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด์„œ ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , @Autowired ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํ•„๋“œ๋ฅผ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด ์ค€๋‹ค.

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

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜์กด์„ฑ ์ฃผ์ž…, AOP(Aspect-Oriented Programming), ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋“ฑ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ๋ฆฌํ”Œ๋ ‰์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ invoke() ๋ฉ”์„œ๋“œ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

๋ฆฌํ”Œ๋ ‰์…˜์˜ ํ”์ : invoke

invoke() ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋™์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด๋‚˜ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์ด ์ปดํŒŒ์ผ ์‹œ์ ์ด ์•„๋‹Œ, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๊ฒฐ์ •๋  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

์ฃผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ…Œ์ŠคํŠธ ๋„๊ตฌ ๋“ฑ์—์„œ ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋™์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

invoke()์˜ ์—ญํ• 

invoke() ๋ฉ”์„œ๋“œ๋Š” java.lang.reflect.Method ํด๋ž˜์Šค์— ์†ํ•ด ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋™์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ: ์ปดํŒŒ์ผ ์‹œ์ ์—๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์ฐพ์•„ ํ˜ธ์ถœ
  • ์ธ์Šคํ„ด์Šค ์ „๋‹ฌ: ํ˜ธ์ถœํ•˜๋ ค๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์†ํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ
  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ: ํ˜ธ์ถœํ•˜๋ ค๋Š” ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋‘ ๋ฒˆ์งธ ์ธ์ž(๊ฐ€๋ณ€ ์ธ์ž ๋˜๋Š” ๋ฐฐ์—ด)๋กœ ์ „๋‹ฌ

invoke()์˜ ํŠน์ง•๊ณผ ์ฃผ์˜์‚ฌํ•ญ

  • ์„ฑ๋Šฅ ์ €ํ•˜
    • ์ •์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹(instance.printMessage("..."))์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ๋А๋ฆผ
    • JVM์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹ , ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ๊ณ  ํ˜ธ์ถœํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
    • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹คํŒจ, ์ ‘๊ทผ ๊ถŒํ•œ ๋ฌธ์ œ ๋“ฑ ์—ฌ๋Ÿฌ ์˜ˆ์™ธ(InvocationTargetException, IllegalAccessException)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ


์ถœ์ฒ˜

This post is licensed under CC BY 4.0 by the author.