2025-03-19
์ด๋ฒ ํ์ต์์๋ Java Reflection (๋ฆฌํ๋ ์
) ๊ฐ๋
๊ณผ ํ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํฉ๋๋ค.
๋ฆฌํ๋ ์
์ ํ์ฉํ๋ฉด ๋ฐํ์์ ํด๋์ค ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ํ์ํ๊ณ ์์ ํ ์ ์์ผ๋ฉฐ,
์ด๋ Spring, Hibernate, JUnit(Mock ํ
์คํธ) ๋ฑ์ ํ๋ ์์ํฌ์์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
Reflection(๋ฆฌํ๋ ์
)์ด๋ Java ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ํด๋์ค์ ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ํ์ํ๊ณ ์กฐ์ํ ์ ์๋ ๊ธฐ๋ฅ์
๋๋ค.
์ฆ, ์ปดํ์ผ ํ์์ด ์๋ ๋ฐํ์์ ํด๋์ค, ๋ฉ์๋, ํ๋ ๋ฑ์ ์ ๋ณด๋ฅผ ์กฐํํ๊ณ ํ์ฉํ๋ ๊ธฐ์ ์
๋๋ค.
Reflection์ ์ฃผ์ ํน์ง
- ํด๋์ค ์ ๋ณด ์กฐํ: ํด๋์ค ์ด๋ฆ, ์์ฑ์, ๋ฉ์๋, ํ๋ ์ ๋ณด ํ์ธ ๊ฐ๋ฅ
- ๋์ ๊ฐ์ฒด ์์ฑ: ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋์ ์ผ๋ก ์์ฑ ๊ฐ๋ฅ
- ๋ฉ์๋ ํธ์ถ: ํน์ ๋ฉ์๋๋ฅผ ์ง์ ์คํ ๊ฐ๋ฅ
- ํ๋ ์กฐ์: ๊ฐ์ฒด์ ํ๋ ๊ฐ์ ๋์ ์ผ๋ก ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
Reflection์ Spring, Hibernate, JUnit ๋ฑ์ ํ๋ ์์ํฌ์์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ํ์ฉ๋ฉ๋๋ค.
@Autowired
, @Bean
๋ฑ์ ์ด๋
ธํ
์ด์
์ ํตํด ์์กด์ฑ ์ฃผ์
(DI)์ ํ ๋ ๋ฆฌํ๋ ์
์ ์ฌ์ฉ ApplicationContext
์์ ๋น(Bean) ๊ฐ์ฒด๋ฅผ ๋์ ์ผ๋ก ํ์ Mockito.when(mockObject.method()).thenReturn(value)
ObjectMapper.readValue(json, MyClass.class)
์ด์ Reflection์ ์ฌ์ฉํ์ฌ ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
package Ch29_;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class C01BASIC {
public static void main(String[] args) throws Exception {
// Class ๊ฐ์ฒด๋ฅผ ํตํด ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด
Class<?> clazz = Class.forName("java.lang.String");
// ๋ชจ๋ ์์ฑ์ ์ถ๋ ฅ
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
for (Constructor<?> con : constructors) {
System.out.println(con);
}
// ๋ชจ๋ ๋ฉ์๋ ์ถ๋ ฅ
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
System.out.println(m);
}
}
}
public java.lang.String()
public java.lang.String(byte[],java.nio.charset.Charset)
...
public int length()
public char charAt(int)
public boolean equals(java.lang.Object)
...
โก String
ํด๋์ค์ ์์ฑ์ ๋ฐ ๋ฉ์๋ ๋ชฉ๋ก์ ์ถ๋ ฅํ๋ ์ฝ๋์
๋๋ค.
์ด๋ฒ์๋ Reflection์ ์ด์ฉํ์ฌ ํน์ ํด๋์ค์ ํ๋, ๋ฉ์๋, ์์ฑ์๋ฅผ ๋์ ์ผ๋ก ์กฐ์ํ๋ ์์ ๋ฅผ ์ดํด๋ด ๋๋ค.
Reflection์ ํ
์คํธํ๊ธฐ ์ํด Simple
ํด๋์ค๋ฅผ ์์ฑํ์ต๋๋ค.
class Simple {
String name;
int age;
String addr;
// ์ฌ๋ฌ ๊ฐ์ ์์ฑ์
public Simple() {}
public Simple(String name) { this.name = name; }
public Simple(String name, int age) { this.name = name; this.age = age; }
public Simple(String name, int age, String addr) { this.name = name; this.age = age; this.addr = addr; }
// Getter ๋ฐ Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getAddr() { return addr; }
public void setAddr(String addr) { this.addr = addr; }
@Override
public String toString() {
return "Simple [name=" + name + ", age=" + age + ", addr=" + addr + "]";
}
}
package Ch29_;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class C02BASIC {
public static void main(String[] args) throws Exception {
// Simple ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ
Class<?> clazz = Class.forName("Ch29_.Simple");
// ๊ฐ์ฒด ์์ฑ
Simple ob = new Simple();
ob.setAge(10);
// ๋ฆฌํ๋ ์
์ ์ด์ฉํ ๋ฉ์๋ ํธ์ถ
Method method = clazz.getDeclaredMethod("getAge");
Object result = method.invoke(ob);
System.out.println("getAge() ๊ฒฐ๊ณผ: " + result);
// ๋ฆฌํ๋ ์
์ ์ด์ฉํ ์์ฑ์ ํธ์ถ
Constructor<?> constructor = clazz.getConstructor(String.class);
Object obj = constructor.newInstance("ํ๊ธธ๋");
System.out.println("์์ฑ๋ ๊ฐ์ฒด: " + obj);
// ๋ฆฌํ๋ ์
์ ์ด์ฉํ ํ๋ ์กฐ์
Field field = clazz.getDeclaredField("addr");
field.set(ob, "๋๊ตฌ");
System.out.println("์์ ๋ ๊ฐ์ฒด: " + ob);
}
}
getAge() ๊ฒฐ๊ณผ: 10
์์ฑ๋ ๊ฐ์ฒด: Simple [name=ํ๊ธธ๋, age=0, addr=null]
์์ ๋ ๊ฐ์ฒด: Simple [name=null, age=10, addr=๋๊ตฌ]
โก Reflection์ ์ด์ฉํ์ฌ ํด๋์ค์ ํ๋ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ,
โก ๋ฉ์๋๋ฅผ ์คํํ๋ฉฐ,
โก ์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ๊ณผ์ ์
๋๋ค.
โ
Reflection์ ์ฌ์ฉํ๋ฉด ๋ฐํ์ ์ค์๋ ํด๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์กฐ์ ๊ฐ๋ฅ
โ
ํ๋, ์์ฑ์, ๋ฉ์๋๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ๊ฐ๋ฅ
โ
ํ๋ ์์ํฌ(Spring, Hibernate)์์ ํ์ฉ๋จ
โ
๋จ์ : ์คํ ์๋๊ฐ ๋๋ฆฌ๊ณ , ๋ณด์ ์ด์๊ฐ ์์ ์ ์์
ํ์ฉ ๋ถ์ผ | ์ค๋ช |
---|---|
Spring ํ๋ ์์ํฌ | @Autowired ๋ฑ ์์กด์ฑ ์ฃผ์
(DI) ๊ตฌํ |
JUnit & Mockito | ๋จ์ ํ ์คํธ์์ Mock ๊ฐ์ฒด ์์ฑ ์ ํ์ฉ |
JSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Jackson ๋ฑ) | ๊ฐ์ฒด์ JSON ๊ฐ ๋ณํ ์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋จ |
ORM ํ๋ ์์ํฌ (Hibernate ๋ฑ) | ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๊ฐ์ฒด ๋งคํ ์ ์ฌ์ฉ |