java.lang.reflect์ ํต์ฌ ๋ฆฌํ๋ ์ ๊ธฐ๋ฅ(core reflection facility)์ ์ด์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ํด๋์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฅ๋ ฅ์๋ ๋๊ฐ๊ฐ ๋ฐ๋ฅธ๋ค.
-
์ปดํ์ผ ์์ ์ ์๋ฃํ์ ๊ฒ์ฌํจ์ผ๋ก์จ ์ป์ ์ ์๋ ์ด์ ๋ค์ ํฌ๊ธฐํด์ผ ํ๋ค(exception checking ํฌํจ). ๋ฆฌํ๋ ์ ์ ํตํด ์กด์ฌํ์ง ์๋, ๋๋ ์ ๊ทผํ ์ ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์คํ ๋์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ํน๋ณํ ์ฃผ์ํด์ผ ํ๋ค.
-
๋ฆฌํ๋ ์ ๊ธฐ๋ฅ์ ์ด์ฉํ๋ ์ฝ๋๋ ๋ณด๊ธฐ ์ซ์๋ฐ๋ค ์ฅํฉํ๋ค. ์๋ฆฌํ ์ฝ๋์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๊ณ , ๊ฐ๋ ์ฑ๋ ๋จ์ด์ง๋ค.
-
์ฑ๋ฅ์ด ๋ฎ๋ค. ๋ฆฌํ๋ ์ ์ ํตํ ๋ฉ์๋ ํธ์ถ ์ฑ๋ฅ์, ์ผ๋ฐ์ ์ธ ๋ฉ์๋ ํธ์ถ์ ๋นํด ํจ์ฌ ๋ฎ๋ค. ์ผ๋ง๋ ๋ฎ์์ง ์ ํํ ๋งํ๊ธฐ๋ ์ด๋ ต๋ค. ๊ณ ๋ คํด์ผํ ์กฐ๊ฑด๋ค์ด ๋ค์ํ๊ธฐ ๋๋ฌธ.
ํต์ฌ ๋ฆฌํ๋ ์ ๊ธฐ๋ฅ์ ์๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์์ฉํ๋ก๊ทธ๋จ ์ ์ ๋๊ตฌ(component-based application builder tool)๋ฅผ ์ํด ์ค๊ณ๋ ๊ธฐ๋ฅ์ด์๋ค. ๊ทธ๋ฐ ๋๊ตฌ๋ ๋ณดํต ์์ฒญ์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฐ ๋ค์, ๋ฆฌํ๋ ์ ๊ธฐ๋ฅ์ ํตํด ์ด๋ค ๋ฉ์๋์ ์์ฑ์๊ฐ ์ง์๋๋์ง๋ฅผ ์์๋ธ๋ค.
๋ช ์ฌํ ๊ฒ์, ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ฆฌํ๋ ์ ์ ํตํด ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ ค ํ๋ฉด ์๋๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ฆฌํ๋ ์ ์ ์์ฃผ ์ ํ์ ์ผ๋ก๋ง ์ฌ์ฉํ๋ฉด ์ค๋ฒํค๋๋ ํผํ๋ฉด์ ๋ฆฌํ๋ ์ ์ ๋ค์ํ ์ฅ์ ์ ๋๋ฆด ์ ์๋ค.
์ปดํ์ผ ์์ ์๋ ์กด์ฌํ์ง ์๋ ํด๋์ค๋ฅผ ์ด์ฉํด์ผ ํ๋ ํ๋ก๊ทธ๋จ ๊ฐ์ด๋ฐ ์๋น์๋ ํด๋น ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ์ธํฐํ์ด์ค๋ ์์ ํด๋์ค(๊ท์น 52)๋ฅผ ์ปดํ์ผ ์์ ์ ์ด๋ฏธ ๊ฐ์ถ๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ทธ๋ด ๋๋, ๊ฐ์ฒด ์์ฑ์ ๋ฆฌํ๋ ์ ์ผ๋ก ํ๊ณ ๊ฐ์ฒด ์ฐธ์กฐ๋ ์ธํฐํ์ด์ค๋ ์์ ํด๋์ค๋ฅผ ํตํ๋ฉด ๋๋ค.
// ๊ฐ์ฒด ์์ฑ์ ๋ฆฌํ๋ ์
์ผ๋ก, ์ฐธ์กฐ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ก
public static void main(String[] args) {
// ํด๋์ค ์ด๋ฆ์ Class ๊ฐ์ฒด๋ก ๋ณํ
Class<?> cl = null;
try {
cl = Class.forName(args[0]);
} catch(ClassNotFoundException e) {
System.err.println("Class not found.");
System.exit(1);
}
// ํด๋น ํด๋์ค์ ๊ฐ์ฒด ์์ฑ
Set<String> s = null;
try {
s = (Set<String>) cl.newInstance();
} catch(IllegalAccessException e) {
System.err.println("Class not accessible.");
System.exit(1);
} catch(InstantiationException e) {
System.err.println("Class not instantiable.");
System.exit(1);
}
// Set ์ด์ฉ
s.addAll(Arrays.asList(args).subList(1, args.length));
System.out.println(s);
}์ฅ๋๊ฐ์ ๋ถ๊ณผํ ํ๋ก๊ทธ๋จ์ด์ง๋ง, ์ฌ์ฉํ ๊ธฐ์ ์ ์์ฃผ ๊ฐ๋ ฅํ๋ค. ์ด ํ๋ก๊ทธ๋จ์ ํ๋ ์ด์์ ๊ฐ์ฒด๋ฅผ ๊ณต๊ฒฉ์ ์ผ๋ก ์กฐ์ํ์ฌ ํด๋น ๊ตฌํ์ด Set์ ์ผ๋ฐ ๊ท์ฝ์ ์ค์ํ๋์ง ๊ฒ์ฆํ๋ ์ผ๋ฐ์ ์งํฉ ๊ฒ์ฌ ๋๊ตฌ(generic set tester)๋ก ์ฝ๊ฒ ๋ณ๊ฒฝ๋ ์ ์๋ค.
ํํธ ์ด ์์ ๋ ๋ฆฌํ๋ ์ ์ ๋ ๊ฐ์ง ๋จ์ ๋ ๋ณด์ฌ์ค๋ค.
์ฒซ๋ฒ์งธ๋ก ์ด ์์ ๋ ์ธ๊ฐ์ง ์คํ์์ ์ค๋ฅ(runtime error)๋ฅผ ๋ฐ์์ํค๋๋ฐ, ๋ฆฌํ๋ ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์์๋๋ผ๋ฉด ์ปดํ์ผ ์์ ์ ๊ฒ์ฌํ ์ ์๋ ์ค๋ฅ๋ค์ด๋ค.
๋๋ฒ์งธ๋ก ์ด ์์ ๋ ์ด๋ฆ์ ๋์ํ๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ค๋ฌด์ค ๊ฐ๋์ ๋ฉ์ฒญํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์์ฑ์๋ฅผ ํธ์ถ๋ก ๋์ ํ์ผ๋ฉด ํ ์ค์ด๋ฉด ๋์์ ์ฝ๋๋ค.
ํ์ง๋ง ์ด๋ฐ ๋ฌธ์ ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ถ๋ถ์์ฌ๋ ๋ํ๋๋ค. ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ ๋๋ฉด ๋ค๋ฅธ Set ๊ฐ์ฒด์ ๋ถ๊ฐํ ์ ์๋ค.
๋ฆฌํ๋ ์ ์ ํน์ ํ ์ข ๋ฅ์ ๋ณต์กํ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ํ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ค. ํ์ง๋ง ๋จ์ ์ด ๋ง๋ค. ์ปดํ์ผ ์์ ์๋ ์ ์ ์๋ ํด๋์ค๋ฅผ ์ด์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ ์๋ค๋ฉด, ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ๋ ๊ฐ๋ฅํ๋ฉด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋๋ง ์ฌ์ฉํ๊ณ , ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋๋ ์ปดํ์ผ ์ ์๊ณ ์๋ ์ธํฐํ์ด์ค๋ ์์ ํด๋์ค๋ฅผ ์ด์ฉํ๋ผ.