Skip to content

Latest commit

ย 

History

History
61 lines (42 loc) ยท 4.25 KB

File metadata and controls

61 lines (42 loc) ยท 4.25 KB

๊ทœ์น™53. ๋ฆฌํ”Œ๋ ‰์…˜ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜๋ผ

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 ๊ฐ์ฒด์™€ ๋ถ„๊ฐ„ํ•  ์ˆ˜ ์—†๋‹ค.

์š”์•ฝ

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