[๋””์ž์ธํŒจํ„ด] ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด (Adapter Pattern)

๋ฐ˜์‘ํ˜•
๐Ÿ’ก ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด (Adapter Pattern)
 ํ•œ ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์žํ•˜๋Š” ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ธํ„ฐ
ํŽ˜์ด์Šค ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ๊ฐ™์ด ์“ธ ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋“ค์„ ์—ฐ๊ฒฐํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•œ๊ตญ์˜ 220v ๋ฐฉ์‹์˜ ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ ๋“ฑ์˜ ์ฝ˜์„ผํŠธ๋ฅผ ์ผ๋ณธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด 110v ๊ทœ๊ฒฉ์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค (๋ฌผ๋ก  ๋ณ€์••๊ธฐ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ํ”„๋ฆฌ๋ณผํŠธ๋ผ๋Š” ์ „์ œํ•˜์—)

 

 

Wrapper
ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋”๋ผ๋„ ๊ฐ™์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ž˜ํ•‘ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ.
์ „๊ธฐ ์ฝ˜์„ผํŠธ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Wrapper ๋กœ ์ด์šฉํ•จ์œผ๋กœ์„œ ํด๋ผ์ด์–ธํŠธ์™€ ๊ตฌํ˜„๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ–ฅํ›„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ์–ด๋Œ‘ํ„ฐ์— ์บก์Šํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

 

๊ธฐ์กด ์‹œ์Šคํ…œ๊ณผ ์ œ๊ณต๋ฐ›์€ ํด๋ž˜์Šค๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋Ÿฐ ๊ฒฝ์šฐ, 220v ์ฝ˜์„ผํŠธ๋ฅผ 110v ๊ทœ๊ฒฉ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋“ฏ์ด ์ค‘๊ฐ„์— ๊ฐ ์‹œ์Šคํ…œ์„ ํ˜ธํ™˜์‹œ์ผœ์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

โ–  ์˜ˆ์ œ : ์˜ค๋ฆฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์น ๋ฉด์กฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

์š”๊ตฌ์‚ฌํ•ญ

์˜ค๋ฆฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ˜„์žฌ ์‹œ์Šคํ…œ์—๋Š” Duck ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ ์˜ค๋ฆฌ ํด๋ž˜์Šค๋“ค์ด ์กด์žฌํ•œ๋‹ค. ์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ณ ๊ฐ์‚ฌ๋กœ๋ถ€ํ„ฐ Turkey ๋ฅผ ์ œ๊ณต๋ฐ›์•„ ์ถ”๊ฐ€ํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•˜๋‹ค. Duck ๋งŒ์ด ์กด์žฌํ•˜๋Š” ํ˜„์žฌ์˜ ์‹œ์Šคํ…œ์— Turkey ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? Turkey๋ฅผ Duck์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค‘๊ฐ„์— Duck ์— ๋งž์ถฐ์„œ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? ๋งˆ์น˜ 220v ๋ฅผ 110v ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค. 

 

1. ๊ธฐ์กด์˜ Duck ์ธํ„ฐํŽ˜์ด์Šค

public interface Duck {
    public void quack();
    public void fly();
}

2. Duck ๋ฅผ ๊ตฌํ˜„ํ•œ MallardDuck ํด๋ž˜์Šค

public class MallardDuck implements Duck {
    public void quack() {
        System.out.println("MallardDuck ๊ฝฅ");
    }
    public void fly() {
        System.out.println("MallardDuck ๋‚ ๊ณ  ์žˆ์–ด์š”~");
    }
}

3. ์—…์ฒด๋กœ๋ถ€ํ„ฐ Turkey ๋ฅผ ์ œ๊ณต๋ฐ›์•˜๋‹ค.

public interface Turkey {
    public void gobble();
    public void fly();
}
// Turkey ๋ฅผ ๊ตฌํ˜„ํ•œ WildTurkey ํด๋ž˜์Šค
public class WildTurkey implements Turkey {
    public void gobble() {
        System.out.println("์น ๋ฉด์กฐ gobble gobble~");
    }

    public void fly() {
        System.out.println("์น ๋ฉด์กฐ๋Š” ์งง์€ ๊ฑฐ๋ฆฌ๋งŒ ๋‚  ์ˆ˜ ์žˆ์–ด์š”");
    }
}

4. ์—…์ฒด๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ Turkey ๋ฅผ ๊ธฐ์กด ๋‚˜์˜ ์‹œ์Šคํ…œ Duck ์— ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. Duck์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค„ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋งŒ๋“ค์ž.

public class TurkeyAdapter implements Duck {
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey){
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        for(int i=0; i < 3; i++) {
            turkey.fly();
        }
    }
}

5. ์‹คํ–‰ํ•ด๋ณด์ž.

@Test
void duck() {
    MallardDuck duck = new MallardDuck();

    // Turkey ๋ฅผ ์ƒ์„ฑ
    WildTurkey turkey = new WildTurkey();
    // ์ƒ์„ฑํ•œ Turkey ๋ฅผ ์–ด๋Œ‘ํ„ฐ๋ฅผ ํ†ตํ•˜์—ฌ Duck ์„ ์ด์šฉํ•˜๋„๋ก ๋ณ€ํ™˜
    Duck turkeyAdapter = new TurkeyAdapter(turkey);

    System.out.println("The WildTurkey says...");
    turkey.gobble(); // ์น ๋ฉด์กฐ gobble gobble~
    turkey.fly(); // ์น ๋ฉด์กฐ๋Š” ์งง์€ ๊ฑฐ๋ฆฌ๋งŒ ๋‚  ์ˆ˜ ์žˆ์–ด์š”

    System.out.println("The MallardDuck says...");
    testDuck(duck);

    System.out.println("The TurkeyAdapter says...");
    testDuck(turkeyAdapter);
    // → ์–ด๋Œ‘ํ„ฐ๊ฐ€ gobble ํ• ๋•Œ fly()๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.
    // testDuck()๋Š” turkey ๊ฐ€ duck ์œผ๋กœ ์ˆจ๊ฒจ์ ธ์žˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค!
}

static void testDuck(Duck duck) {
    duck.quack();
    duck.fly();
}

6. ๊ฒฐ๊ณผํ™•์ธ

The WildTurkey says...
์น ๋ฉด์กฐ gobble gobble~
์น ๋ฉด์กฐ๋Š” ์งง์€ ๊ฑฐ๋ฆฌ๋งŒ ๋‚  ์ˆ˜ ์žˆ์–ด์š”

The MallardDuck says...
MallardDuck ๊ฝฅ
MallardDuck ๋‚ ๊ณ  ์žˆ์–ด์š”~

The TurkeyAdapter says...
์น ๋ฉด์กฐ gobble gobble~
์น ๋ฉด์กฐ๋Š” ์งง์€ ๊ฑฐ๋ฆฌ๋งŒ ๋‚  ์ˆ˜ ์žˆ์–ด์š”
์น ๋ฉด์กฐ๋Š” ์งง์€ ๊ฑฐ๋ฆฌ๋งŒ ๋‚  ์ˆ˜ ์žˆ์–ด์š”
์น ๋ฉด์กฐ๋Š” ์งง์€ ๊ฑฐ๋ฆฌ๋งŒ ๋‚  ์ˆ˜ ์žˆ์–ด์š”

 

 

 

TurkeyAdapter ์—์„œ ํƒ€๊ฒŸ ์ธํ„ฐํŽ˜์ด์Šค์ธ Duck ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค. Turkey ๊ฐ€ ์–ด๋Œ‘ํ‹ฐ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

 

 

โ–  ํด๋ผ์ด์–ธํŠธ์—์„œ ์–ด๋Œ‘ํ„ฐ ์‚ฌ์šฉ

  1. ํด๋ผ์ด์–ธํŠธ์—์„œ ํƒ€๊ฒŸ ์ธํ„ฐํŽ˜์ด์Šค (Adapter) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ request() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•œ๋‹ค.
  2. ์–ด๋Œ‘ํ„ฐ์—์„œ ์–ด๋Œ‘ํ‹ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ request() ์„ ์–ด๋Œ‘ํ‹ฐ์—๋Œ€ํ•œ ์š”์ฒญ translatedRequst() ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์ง€๋งŒ, ์ค‘๊ฐ„์— ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•œ๋‹ค.

 

 

โ–  UML Diagram

 

 

 

โ–  ์–ด๋Œ‘ํ„ฐ์—๋Š” ๋‘๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

(1) ํด๋ž˜์Šค ์–ด๋Œ‘ํ„ฐ (Class Adapter)

ํด๋ž˜์Šค ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์ด์šฉํ•˜๋ ค๋ฉด ๋‹ค์ค‘ ์ƒ์†์ด ํ•„์š”ํ•˜๋‹ค. java์—์„œ๋Š” ๋‹ค์ค‘์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

(2) ์˜ค๋ธŒ์ ํŠธ ์–ด๋Œ‘ํ„ฐ (Object Adapter)

์˜ˆ์ œ์—์„œ Target ์€ Duck, Adaptee ๋Š” Turkey ๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 


์ฐธ๊ณ 
ํ—ค๋“œ ํผ์ŠคํŠธ ๋””์ž์ธ ํŒจํ„ด (Head First Design Patterns) - ์—๋ฆญ ํ”„๋ฆฌ๋จผ,์—˜๋ฆฌ์ž๋ฒ ์Šค ๋กญ์Šจ,์ผ€์ด์‹œ ์‹œ์—๋ผ,๋ฒ„ํŠธ ๋ฒ ์ด์ธ 

๋ฐ˜์‘ํ˜•