โ ์ธ์์ ๊ฐ์ฅ ํ๋ฆฐ ๋จน๋ฌผ๋ ๊ฐ์ฅ ์ข์ ๊ธฐ์ต๋ ฅ๋ณด๋ค ๋ซ๋ค. โ
- ์ค์ฉ์ฃผ์ ํ๋ก๊ทธ๋๋จธ ์ค

์๋ฐ์ Class ํด๋์ค (Java.lang.Class)
์๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ์ฐ๋ฆฌ๋ ๋ณดํต ๋ณ์๋ ํด๋์ค๋ฅผ ์ง์ ์ ์ธํ๊ณ ๋ง๋ค์ด ์ฌ์ฉํ์ฌ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค์์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ถ๋ฌ์ ๋ค๋ฃจ์ด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ์ฆ, ์ฝ๋๋ฅผ ์คํํ๊ธฐ์ ์ปดํ์ผ ๋จ์์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํด๋๋ฅผ ๋ค์ ธ๊ฐ๋ฉฐ ํด๋์ค ์ ์๋ฌธ์ ์ฐพ์ ํด๋์ค ์ ๋ณด๋ฅผ ์ป๋ ๊ฒ์ด ์๋, ์ฝ๋ ์์์ ํธ์ถ ๋ก์ง์ ํตํด ํด๋์ค ์ ๋ณด๋ฅผ ์ป์ด์ ๋ค๋ฃธ์ผ๋ก์จ ๋ฐํ์ ๋จ์์ ๋ค์ด๋๋ฏนํ๊ฒ ํด๋์ค๋ฅผ ํธ๋ค๋ง ํ๋ ๊ฒ์ด๋ค. ์ด๋ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ฐ๋ก Class ํด๋์ค ๊ฐ์ฒด์ด๋ค.
Class ํด๋์ค๋ java.lang.Class ํจํค์ง์ ๋ณ๋๋ก ์กด์ฌํ๋ ๋ ๋ฆฝํ ํด๋์ค๋ก์, ์์ ์ด ์ํ ํด๋์ค์ ๋ชจ๋ ๋ฉค๋ฒ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ํ๊ฒฝ์์ ๋์ ์ผ๋ก ์ ์ฅ๋ ํด๋์ค๋ ์ธํฐํ์ด์ค ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉ๋๋ค. ์ฌ๊ธฐ์ ์คํดํ์ง ๋ง์์ผ ํ ๊ฒ์ด ํด๋์ค ์๋ฃํ์ ๋งํ๋๊ฒ ์๋๋ผ ํด๋์ค ์ด๋ฆ์ด "Class" ์ธ ํด๋์ค๋ฅผ ๋งํ๋ ๊ฒ์ด๋ค.

์๋ฐ์ ๋ชจ๋ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ์ปดํ์ผ ํ .java โ .class ํ์ผ๋ก ๋ณํ๋๋ค. ์ด .class ํ์ผ์๋ ๋ฉค๋ฒ๋ณ์, ๋ฉ์๋, ์์ฑ์ ๋ฑ ๊ฐ์ฒด์ ์ ๋ณด๋ค์ด ๋ค์ด ์๋๋ฐ, JVM์ ํด๋์ค ๋ก๋(ClassLoader)์ ์ํด์ ํด๋์ค ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋, Class ํด๋์ค๋ ์ด .class ํ์ผ์ ํด๋์ค ์ ๋ณด๋ค์ ๊ฐ์ ธ์ ํ ์์ญ์ ์๋์ผ๋ก ๊ฐ์ฒดํ๊ฐ ๋๊ฒ ๋๋ค. ๊ทธ๋์ ๋ฐ๋ก new ์ธ์คํด์คํ ์์ด ๋ฐ๋ก ๊ฐ์ ธ์ ์ฌ์ฉํ๋ฉด ๋๋ค.

JVM์ ํด๋์ค ๋ก๋(class loader)๋ ์คํ ์์ ํ์ํ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ์ญํ ์ ํ๋ค.
๋จผ์ ๊ธฐ์กด์ ์์ฑ๋ ํด๋์ค ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋์ง ํ์ธํ๊ณ ์์ผ๋ฉด ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๊ณ , ์์ผ๋ฉด classpath์ ์ง์ ๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ์ ํด๋์ค ํ์ผ์ ์ฐพ์ ํด๋น ํด๋์ค ํ์ผ์ ์ฝ์ด์ Class ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
๋ง์ผ ๋ชป ์ฐพ์ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ตํ์๋ ClassNotFoundException ์์ธ๋ฅผ ๋์ฐ๊ฒ ๋๋ค.
Class ํด๋์ค ๊ฐ์ฒด ์ป๊ธฐ
์๋ฐ์์ Class ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ์ด 3๊ฐ์ง๊ฐ ์กด์ฌํ๋ค. ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๊ฐ์ง๋ง ๊ฐ๊ธฐ ๋ฐฉ์์ ๋ฐ๋ผ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ ๋ชจ๋ ์์๋ ํ์๊ฐ ์๋ค.
๋ค์์ ์ฐ๋ฆฌ๊ฐ ์ตํ์๋ String ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ธ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก String ํด๋์ค์ Class ํด๋์ค ์ ๋ณด๋ฅผ ์ป๋ ์์์ด๋ค.
Object.getClass() ๋ก ์ป๊ธฐ
- ๋ชจ๋ ํด๋์ค์ ์ต์์ ํด๋์ค์ธ Object ํด๋์ค์์ ์ ๊ณตํ๋
getClass()๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ธ์จ๋ค. - ๋จ, ํด๋น ํด๋์ค๊ฐ ์ธ์คํด์คํ ๋ ์ํ ์ด์ด์ผ ํ๋ค๋ ์ ์ฝ์ด ์๋ค.
public static void main(String[] args) {
// ์คํธ๋ง ํด๋์ค ์ธ์คํด์คํ
String str = new String("Classํด๋์ค ํ
์คํธ");
// getClass() ๋ฉ์๋๋ก ์ป๊ธฐ
Class<? extends String> cls = str.getClass();
System.out.println(cls); // class java.lang.String
}
.class ๋ฆฌํฐ๋ด๋ก ์ป๊ธฐ
- ์ธ์คํด์ค๊ฐ ์กด์ฌํ์ง ์๊ณ , ์ปดํ์ผ๋ ํด๋์ค ํ์ผ๋ง ์๋ค๋ฉด ๋ฆฌํฐ๋ด๋ก Class ๊ฐ์ฒด๋ฅผ ๊ณง๋ฐ๋ก ์ป์ ์ ์๋ค.
- ๊ฐ์ฅ ์ฌํํ๊ฒ Class ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ด๋ค.
public static void main(String[] args) {
// ํด๋์ค ๋ฆฌํฐ๋ด(*.class)๋ก ์ป๊ธฐ
Class<? extends String> cls2 = String.class;
System.out.println(cls2); // class java.lang.String
}
Class.forName() ์ผ๋ก ์ป๊ธฐ
- ์์ ๋ฆฌํฐ๋ด ๋ฐฉ์๊ณผ ๊ฐ์ด ์ปดํ์ผ๋ ํด๋์ค ํ์ผ์ด ์๋ค๋ฉด ํด๋์ค ์ด๋ฆ๋ง์ผ๋ก Class ๊ฐ์ฒด๋ฅผ ๋ฐํ ๋ฐ์ ์ ์๋ค.
- ๋จ, ์ด๋๋ ํด๋์ค์ ๋๋ฉ์ธ์ ์์ธํ ์ ์ด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋์ ํด๋์ค ํ์ผ ๊ฒฝ๋ก์ ์คํ๊ฐ ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผํ๋ค. (๋์๋ฌธ์ ์ค์ ๋ฑ)
- ๋ง์ผ Class ๊ฐ์ฒด๋ฅผ ์ฐพ์ง ๋ชปํ๋ค๋ฉด
ClassNotFoundException๋ฅผ ๋ฐ์ ์ํค๊ธฐ ๋๋ฌธ์ ์์ธ์ฒ๋ฆฌ๊ฐ ๊ฐ์ ๋๋ค. - ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋๊ฐ์ง ๋ฐฉ๋ฒ๋ณด๋ค forName์ ํตํด ์ป๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ฉฐ ๋์ ๋ก๋ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ข๋ค.
public static void main(String[] args) {
try {
// ๋๋ฉ์ธ.ํด๋์ค๋ช
์ผ๋ก ์ป๊ธฐ
Class<?> cls3 = Class.forName("java.lang.String");
System.out.println(cls3); // class java.lang.String
} catch (ClassNotFoundException e) {}
}
Class ํด๋์ค ๊ฐ์ฒด๋ฅผforName()๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ '๋์ ๋ก๋ฉ'์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ณดํต ๋ค๋ฅธ ํด๋์ค ํ์ผ์ ๋ถ๋ฌ์ฌ๋๋ ์ปดํ์ผ ์ JVM์ Method Area์ ํด๋์ค ํ์ผ์ด ๊ฐ์ด ๋ฐ์ธ๋ฉ(binding)์ด ๋์ง๋ง,forName()์ผ๋ก .classํ์ผ์ ๋ถ๋ฌ์ฌ ๋๋ ์ปดํ์ผ์ ๋ฐ์ธ๋ฉ์ด ๋์ง์๊ณ ๋ฐํ์๋ ๋ถ๋ฌ์ค๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋์ ๋ก๋ฉ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋์ ์ปดํ์ผ ํ์ ์ ์ฒดํฌ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ ๋ฌด๊ฐ ํ์ธ๋์ง ์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค.
๋๋ถ๋ถ์ ํด๋์ค ์ ๋ณด๋ ํ๋ก๊ทธ๋จ์ด ๋ก๋ฉ๋ ๋ ์ด๋ฏธ Method Area ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ค ์์คํ ์ ์ค๋ผํด, MySQL, SQL Server ๋ฑ ์ฌ๋ฌ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ํ ์ ์๋ค๊ณ ํ๋๋ฐ, ๊ทธ๋ ๋ค๊ณ ์ด ์์คํ ์ ์ปดํ์ผํ ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋๋ผ์ด๋ฒ)๋ฅผ ๊ฐ์ด ์ปดํ์ผํ ํ์๋ ์๋ค. ์์คํ ์ ๊ตฌ๋ํ ๋ ์ด๋ค DB์ ์ฐ๊ฒฐํ ์ง ๊ฒฐ์ ๋๋ฉด ํด๋น ๋๋ผ์ด๋ฒ๋ง ๋ก๋ฉํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ด๋forName()์ ํตํด ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ก ์๋ผ๋ฉด์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ๋ก๋ฉํ๋ฉด ์ข๋ค.
Class ํด๋์ค ๋ฉ์๋ ์ข ๋ฅ

String getName(): ํด๋์ค์ ์ด๋ฆ์ ๋ฆฌํดํ๋ค.Package getPackage(): ํด๋์ค์ ํจํค์ง ์ ๋ณด๋ฅผ ํจํค์ง ํด๋์ค ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Field[] getFields(): public์ผ๋ก ์ ์ธ๋ ๋ณ์ ๋ชฉ๋ก์ Field ํด๋์ค ๋ฐฐ์ด ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Field getField(String name): public์ผ๋ก ์ ์ธ๋ ๋ณ์๋ฅผ Field ํด๋์ค ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Field[] getDeclaredFields(): ํด๋น ํด๋์ค์์ ์ ์๋ ๋ณ์ ๋ชฉ๋ก์ field ํด๋์ค ๋ฐฐ์ด ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Field getDeclaredField(String name): name๊ณผ ๋์ผํ ์ด๋ฆ์ผ๋ก ์ ์๋ ๋ณ์๋ฅผ Field ํด๋์ค ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Method[] getMethods(): public์ผ๋ก ์ ์ธ๋ ๋ชจ๋ ๋ฉ์๋ ๋ชฉ๋ก์ Method ํด๋์ค ๋ฐฐ์ด ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค. ํด๋น ํด๋์ค์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์๋ฐ์ ๋ฉ์๋๋ ํฌํจ๋๋ค.Method getMethod(String name, Class... parameterTypes): ์ง์ ๋ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ํ์ ์ ๊ฐ๋ ๋ฉ์๋๋ฅผ Method ํด๋์ค ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Method[] getDeclaredMethods(): ํด๋น ํด๋์ค์์ ์ ์ธ๋ ๋ชจ๋ ๋ฉ์๋ ์ ๋ณด๋ฅผ ๋ฆฌํดํ๋ค.Method getDeclaredMethod(String name, Class... parameterTypes): ์ง์ ๋ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ํ์ ์ ๊ฐ๋ ํด๋น ํด๋์ค์์ ์ ์ธ๋ ๋ฉ์๋๋ฅผ Method ํด๋์ค ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Constructor[] getConstructors(): ํด๋น ํด๋์ค์ ์ ์ธ๋ ๋ชจ๋ public ์์ฑ์์ ์ ๋ณด๋ฅผ Constructor ๋ฐฐ์ด ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.Constructor[] getDeclaredConstructors(): ํด๋น ํด๋์ค์์ ์ ์ธ๋ ๋ชจ๋ ์์ฑ์์ ์ ๋ณด๋ฅผ Constructor ๋ฐฐ์ด ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.int getModifiers(): ํด๋น ํด๋์ค์ ์ ๊ทผ์(modifier) ์ ๋ณด๋ฅผ int ํ์ ์ผ๋ก ๋ฆฌํดํ๋ค.String toString(): ํด๋น ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ฆฌํดํ๋ค.
ํด๋์ค ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
Class ํด๋์ค ๊ฐ์ฒด์๋ ์์ ์ด ์ํ ํด๋์ค์ ๊ฐ์ข ๋ฉค๋ฒ ์ ๋ณด๋ค์ด ๋ค์ด์๋ค๊ณ ํ์๋ค. ์ด๋ ๊ฒ ๋ฐ์์จ Class ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์์ ์ด ์ํ ํด๋์ค์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
public static void main(String[] args) {
// String ๊ฐ์ฒด๋ก๋ถํฐ ํด๋์ค ์ ๋ณด๋ฅผ ์ป๋๋ค
Class<? extends String> cls = String.class;
// ํด๋์ค์ ์ด๋ฆ๋ง ํธ์ถํ๋ค.
System.out.println("1. " + cls.getSimpleName()); // 1. String
// ํจํค์ง์ ์ด๋ฆ์ ํธ์ถํ๋ค.
System.out.println("2. " + cls.getPackage()); // 2. package java.lang
// ํจํค์ง์ ์ด๋ฆ์ ํธ์ถํ๋ค.
System.out.println("3. " + cls.getName()); // 3. java.lang.String
// ํด๋์ค์ ํจํค์ง ์ด๋ฆ์ ํธ์ถํ๋ค.
System.out.println("4. " + cls.toString()); // 4. class java.lang.String
// ์ ์ด์๋ถํฐ ํจํค์ง ์ด๋ฆ ๋ชจ๋๋ค ํธ์ถํ๋ค.
System.out.println("5. " + cls.toGenericString()); // 5. public final class java.lang.String
}

ํด๋์ค ๊ตฌ์ฑ ์ถ๋ ฅํ๊ธฐ
public static void main(String[] args) {
Class<? extends String> cls = String.class;
// ๊ฐ์ง๊ณ ์๋ ํ๋๋ฅผ ๋ชจ๋ ์ถ๋ ฅํ๋ค.
System.out.println("6. " + Arrays.toString(cls.getFields())); // 6. [public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER]
// ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํธ์ถํ๋ค.
System.out.println("7. " + Arrays.toString(cls.getMethods())); // 7. [public boolean java.lang.String.equals(java.lang.Object), public java.lang.String java.lang.String.toString() ...]
// ์ธํฐํ์ด์ค ๋ชฉ๋ก์ ๋ชจ๋ ๊ฐ์ ธ์จ๋ค.
System.out.println("8. " + Arrays.toString(cls.getInterfaces())); // 8. [interface java.io.Serializable, interface java.lang.Comparable, interface java.lang.CharSequence]
// super ํด๋์ค๋ฅผ ๊ฐ์ ธ์จ๋ค
System.out.println("9. " + cls.getSuperclass()); // 9. class java.lang.Object
}

Reflection API ๊ธฐ๋ฒ
๋ฐ๋ก ์์์ ๋ดค๋ฏ์ด, Class ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ฉด ํด๋์ค์ ๋ํ ๋ชจ๋ ์ ๋ณด(ํด๋์ค์ ์ ์๋ ๋ฉค๋ฒ์ ์ด๋ฆ์ด๋ ๊ฐ์ ๋ฑ)๋ฅผ ๋ฐํ์ ๋จ์์ ์ฝ๋ ๋ก์ง์ผ๋ก ์ป์ ์ ์๋ค๋ ๊ฒ์ ์์๋ค.
ํด๋์ค ์ ๋ณด๋ค์ ์คํ๋ถ์์ ์ป์ ์ ์๋ ์ ์ ๊ฝค๋ ๋งค๋ ฅ์ ์ธ๋ฐ, ์ด๋ฌํ ์ ๋ณด๋ค์ ์ด์ฉํ์ฌ ์ค๋ก์ง Class ๊ฐ์ฒด๋ง์ผ๋ก ๋ณธ ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ ์ ์๊ณ , ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์๋ ..๋ฑ ๋ณด๋ค ๋์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๋๋ค. ์ด์ฒ๋ผ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์ ์ ์์ง ๋ชปํด๋ ๊ทธ ํด๋์ค์ ์ ๋ณด(๋ฉ์๋, ํ์ , ๋ณ์, ...)์ ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ์๋ฐ ๊ธฐ๋ฒ์ Reflection API ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ฐ ๋ฆฌํ๋ ์ (Reflection - ์ฌ์ ์ ์๋ฏธ : ๊ฑฐ์ธ ๋ฑ์ ๋น์น, ๋ฐ์ฌ)์ ๊ฐ์ฒด๋ฅผ ํตํด ํด๋์ค์ ์ ๋ณด๋ฅผ ๋ถ์ํ์ฌ ๋ฐํ์์ ํด๋์ค์ ๋์์ ๊ฒ์ฌํ๊ฑฐ๋ ์กฐ์ํ๋ ํ๋ก๊ทธ๋จ ๊ธฐ๋ฒ์ด๋ค. ํด๋์ค ํ์ผ์ ์์น๋ ์ด๋ฆ๋ง ์๋ค๋ฉด ํด๋น ํด๋์ค์ ์ ๋ณด๋ฅผ ์ป์ด๋ด๊ณ , ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ์ด ์ ์ฐํ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ฅ์ผ ํด์ค๋ค.

๋ฆฌํ๋ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๋ณด๋ค๋ ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ง์ด ์ฌ์ฉ๋๋ค. ์๋ํ๋ฉด ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ์ฉํ๋ ์ฌ๋์ด ์ด๋ค ํด๋์ค๋ช ๊ณผ ๋ฉค๋ฒ๋ค์ ๊ตฌ์ฑํ ์ง ๋ชจ๋ฅด๋๋ฐ, ์ด๋ฌํ ์ฌ์ฉ์ ํด๋์ค๋ค์ ๊ธฐ์กด์ ๊ธฐ๋ฅ๊ณผ ๋์ ์ผ๋ก ์ฐ๊ฒฐ ์ํค๊ธฐ ์ํ์ฌ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ๋ํ์ ์ธ ์๋ก๋ ์คํ๋ง์ DI(dpendency injection), Proxy, ModelMapper ๋ฑ์ด ์๋ค. ์ด๋ฏธ Spring, Hibernate, Lombok ๋ฑ ๋ง์ ํ๋ ์์ํฌ์์ Reflection ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์๋ค.
์๋ฐ ๋ฆฌํ๋ ์ ์ฌ์ฉ๋ฒ
๋ค์์ ๋ฆฌํ๋ ์ ์์ ์ ์ฐ์ผ ์ค๋น๋ฌผ ํด๋์ค์ด๋ค. Person ํด๋์ค์๋ public๊ณผ private, staticํ ํ๋์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์์ฑ์๋ ์๊ท๋จผํธ์ ๋ฐ๋ผ ๋๊ฐ์ง๋ก ์ค๋นํ์๋ค. ์ด์ ์ด ๋ณต์กํ๊ฒ ๊ตฌ์ฑ๋์ด ์๋ Person ํด๋์ค์ ๋ฉค๋ฒ ์ ๋ณด๋ค์ ๋ฆฌํ๋ ์ ์ผ๋ก ๋์ ์ผ๋ก ๋ถ๋ฌ์ ์ด๋ป๊ฒ ๋ค์ด๋๋ฏนํ๊ฒ ๋ค๋ฃฐ์ ์๋์ง ์ฒดํํด๋ณด์.
// ํ์ ํจํค์ง ๋ก๋
import java.lang.reflect.*;
class Person {
public String name; // public ํ๋
private int age; // private ํ๋
public static int height = 180; // static ํ๋
// ์ด๋ฆ, ๋์ด๋ฅผ ์
๋ ฅ๋ฐ๋ ์์ฑ์
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// ๊ธฐ๋ณธ ์์ฑ์
public Person() {
}
public void getField() {
System.out.printf("์ด๋ฆ : %s, ๋์ด : %d\n", name, age);
}
// public ๋ฉ์๋
public int sum(int left, int right) {
return left + right;
}
// static ๋ฉ์๋
public static int staticSum(int left, int right) {
return left + right;
}
// private ๋ฉ์๋
private int privateSum(int left, int right) {
return left + right;
}
}
๋์ ์ผ๋ก ์์ฑ์ ๊ฐ์ ธ์ ์ด๊ธฐํํ๊ธฐ
getConstructor()๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ์์ฑ์์ ๋งค๊ฐ๋ณ์ ํ์ ์ ๋ฐ์ธ๋ฉ ํด์ฃผ์ด์ผ ํ๋ค.- ๋ง์ผ ์ด๋ ํ ๋งค๊ฐ๋ณ์ ํ์ ์ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํธ์ถ๋๊ฒ ๋๋ค.
- ๋ง์ฝ ํด๋นํ๋ ์์ฑ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด NoSuchMethodException์ด ๋ฐ์๋๋ค.
public static void main(String[] args) throws Exception {
// ํด๋์ค ๊ฐ์ฒด ๊ฐ์ ธ์ค๊ธฐ (forName ๋ฉ์๋ ๋ฐฉ์)
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// ์์ฑ์ ๊ฐ์ ธ์ค๊ธฐ - Person(String name, int age)
Constructor<Person> constructor = personClass.getConstructor(String.class, int.class); // getConstructor ์ธ์๋ก ์์ฑ์์ ๋งค๊ฐ๋ณ์ ํ์
์ ๋ฐ์ธ๋ฉ ํด์ฃผ์ด์ผ ํ๋ค.
// ๊ฐ์ ธ์จ ์์ฑ์๋ก ์ธ์คํด์ค ๋ง๋ค๊ธฐ
Person person1 = constructor.newInstance("ํ๊ธธ๋", 55);
person1.getField(); // ์ด๋ฆ : ํ๊ธธ๋, ๋์ด : 55
}
๋์ ์ผ๋ก ๋ฉ์๋ ๊ฐ์ ธ์ ์คํํ๊ธฐ
getMethod()๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ์์ฑ์์ ๋งค๊ฐ๋ณ์ ํ์ ์ ๋ฐ์ธ๋ฉ ํด์ฃผ์ด์ผ ํ๋ค.- ๋ง์ฝ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ฉ์๋๋ผ๋ฉด ๋ฉ์๋ ๋ช ๋ง ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
- ์คํ์ Method ํ์
์์ ์ ๊ณตํ๋
invoke()๋ฅผ ํธ์ถํ์ฌ ์คํํ๋ฉด ๋๋ค.- instance ๋ฉ์๋ - ๋งค๊ฐ๋ณ์๋ก ์ธ์คํด์ค ํ์
- static ๋ฉ์๋ - ๋งค๊ฐ๋ณ์ ํ์ ์์
- private ๋ฉ์๋ - invoke ํ๊ธฐ์ ์ ๊ณต๊ฐํ ํ ํ์์์
public static void main(String[] args) throws Exception {
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// ํน์ public ๋ฉ์๋ ๊ฐ์ ธ์ ์คํ
// getMethod("๋ฉ์๋๋ช
", ๋งค๊ฐ๋ณ์ํ์
๋ค)
Method sum = personClass.getMethod("sum", int.class, int.class);
int result = (int) sum.invoke(new Person(), 10, 20);
System.out.println("result = " + result); // 30
// ํน์ static ๋ฉ์๋ ๊ฐ์ ธ์ ์คํ
Method staticSum = personClass.getMethod("staticSum", int.class, int.class);
int staticResult = (int) staticSum.invoke(null, 100, 200);
System.out.println("staticResult = " + staticResult); // 300
// ํน์ private ๋ฉ์๋ ๊ฐ์ ธ์ ์คํ
Method privateSum = personClass.getDeclaredMethod("privateSum", int.class, int.class);
privateSum.setAccessible(true); // private ์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ access ํ ์ ์๋๋ก ์ค์
int privateResult = (int) privateSum.invoke(new Person(), 1000, 2000);
System.out.println("privateResult = " + privateResult); // 3000
}
๋์ ์ผ๋ก ํ๋ ๊ฐ์ ธ์ ์กฐ์ํ๊ธฐ
getField()๋ฅผ ํตํด ํด๋์ค์ ํ๋๋ฅผ ์ป์ ์ ์๋ค.- ํ๋ ๊ฐ ๋ณ๊ฒฝ์
set()๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋๋ค. - ํ๋๋ ํด๋์ค๊ฐ ์ธ์คํด์ค๊ฐ ๋์ด์ผ Heap ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋จ์ผ๋ก ์ธ์คํด์ค๊ฐ ํ์ํ๋ค.
- ๋ค๋ง, static ํ๋๋ผ๋ฉด Method Area์ ์ด๋ฏธ ์ ์ฌ๋์ด ์์ผ๋ฏ๋ก ์ธ์คํด์ค๊ฐ ํ์์๋ค.
public static void main(String[] args) throws Exception {
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// static ํ๋๋ฅผ ๊ฐ์ ธ์ ์กฐ์ํ๊ณ ์ถ๋ ฅํ๊ธฐ
Field height_field = personClass.getField("height");
height_field.set(null, 200);
System.out.println(height_field.get(null)); // 200
}
public static void main(String[] args) throws Exception {
Person person = new Person("ํ๊ธธ๋", 55);
// ํด๋์ค ๊ฐ์ฒด ๊ฐ์ ธ์ค๊ธฐ
Class<Person> personClass = (Class<Person>) Class.forName("Person");
// public ํ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
Field name_field = personClass.getField("name");
// private ํ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
Field age_field = personClass.getDeclaredField("age");
age_field.setAccessible(true); // private ์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ access ํ ์ ์๋๋ก ์ค์
// ํ๋ ์กฐ์ํ๊ธฐ
name_field.set(person, "์๊บฝ์ ");
age_field.set(person, 88);
System.out.println(name_field.get(person)); // ์๊บฝ์
System.out.println(age_field.get(person)); // 200
}
์ด๋ ๊ฒ ๋ฆฌํ๋ ์
์ ์ฌ์ฉํ๋ฉด ํด๋์ค์ ๋ฉ์๋์ ๋ฉํ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ ์ผ๋ก ์ ์ฐํ๊ฒ ๋ง๋ค ์ ์๋ค. ํ์ง๋ง ๋ฆฌํ๋ ์
๊ธฐ์ ์ ๋ฐํ์์ ๋์ํ๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ ์์ ์ ์ค๋ฅ๋ฅผ ์ก์ ์ ์๋ค๋ ๋จ์ ์ด ์กด์ฌํ๋ค.
๋ง์ผ ๋ฆฌํ๋ ์
์ผ๋ก getMethod("๋ฉ์๋๋ช
") ๋ฅผ ํตํด ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ๊ฐ์ ํ์ ๋ ์ธ์๋ก ์กด์ฌํ์ง๋ ์๋ ๋ฉ์๋๋ช
์ ๊ธฐ์ฌํ ๊ฒฝ์ฐ, ํด๋น ์ฝ๋๋ฅผ ์ง์ ์คํํด์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํด ๋ฏธ๋ฆฌ ๋๋นํ ์ ์๊ฒ ๋๋ค.
๊ฐ์ฅ ์ข์ ์ค๋ฅ๋ ๊ฐ๋ฐ์๊ฐ ์ฆ์ ํ์ธํ ์ ์๋ ์ปดํ์ผ ์ค๋ฅ์ด๊ณ , ๊ฐ์ฅ ๋ฌด์์ด ์ค๋ฅ๋ ์ฌ์ฉ์๊ฐ ์ง์ ์คํํ ๋ ๋ฐ์ํ๋ ๋ฐํ์ ์ค๋ฅ๋ค. ๋ฐ๋ผ์ ๋ฆฌํ๋ ์
์ ์ด๋ณด์๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋๋ฐ๋ ์ ์ํด์ผํ๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://www.youtube.com/watch?v=Mc6OaicCZVA
https://www.youtube.com/watch?v=NI6QZy6juc8
https://12bme.tistory.com/129
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.