Reflection์ด๋?
๐ฅ ๋ค์ด๊ฐ๋ฉฐ
์คํ๋ง์ ์ฌ์ฉํ๋ฉด์ ์คํ๋ง ๊ณต๋ถ์ ํ์์ฑ์ ๋๊ผ๋ค.. ๋ฏธ๋ค๋๋ ํ ๋น์ ์คํ๋ง์ ๊บผ๋ด ๋ค์ ๊ณต๋ถํ๋ฉด์ ์ด๋ฒ์ ๋์ถฉ ๊ณต๋ถํ๋ ๊ฒ์ด ์๋ ๋ ๊ผผ๊ผผํ ๋ณด๋ ค ํ๋ค. ๊ทธ๋ ๊ฒ ์ฝ๋ ์ค ์ฑ ์ 1์ฅ์์๋ถํฐ ๋ฆฌํ๋ ์ ์ ๋ํด ์ธ๊ธํ๋ ๊ฒ์ด์๋ค. ๊ทธ๋์ ๋ฆฌํ๋ ์ ์ด ๋ฌด์์ธ์ง ๊ฐ์ผ๋ก ์๊ณ ์์๋๋ฐ ์ด๋ฒ์ ์ ๋๋ก ์์๋ณด๋ ค ํ๋ค.
ํ ๋น์ ์คํ๋ง์ ๋์จ ์ค๋ช ์ ๋ฐ๋ฅด๋ฉด, ์๋ฐ ๋น(JavaBean)์ ์๋์ ๋ ๊ฐ์ง ๊ด๋ก๋ฅผ ๋ฐ๋ผ ๋ง๋ค์ด์ง ์ค๋ธ์ ํธ๋ผ๊ณ ํ๋ค.
๋ํดํธ ์์ฑ์(Default Constructor)
- ํด์ด๋ ํ๋ ์ ์ํฌ์์ ๋ฆฌํ๋ ์ ์ ์ด์ฉํด ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ํ์ํ๋ค.
ํ๋กํผํฐ(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
)๊ฐ ๋ฐ์ํ ์ ์์
- ๋ฉ์๋ ํธ์ถ ์คํจ, ์ ๊ทผ ๊ถํ ๋ฌธ์ ๋ฑ ์ฌ๋ฌ ์์ธ(