Post

Adapter Pattern

Adapter Pattern ์ •๋ฆฌ

์ƒํ™ฉ

Adapter Pattern์ด๋ž€?

์–ด๋Œ‘ํ„ฐ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์ด ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ตฌ์กฐ์  ๋””์ž์ธย ํŒจํ„ด์ด๋‹ค.

๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ๋กœ, ์˜๊ตญ ์ฝ˜์„ผํŠธ๋Š” ์šฐ๋ฆฌ๋‚˜๋ผ ์ฝ˜์„ธํŠธ์™€ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ ‡๊ธฐ์—, ๋งŒ์•ฝ ์ถฉ์ „๊ธฐ๋ฅผ ์ฝ˜์„ผํŠธ์— ๊ฝ‚์œผ๋ ค๊ณ  ํ•˜๋ฉด ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Adapter๊ฐ€ ์กด์žฌํ•œ๋‹ค. Adapter๋ฅผ ํ†ตํ•ด ์ฝ˜์„ผํŠธ > Adapter > ์ถฉ์ „๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ธฐ์กด ์ฝ˜์„ผํŠธ์™€ ์ถฉ์ „๊ธฐ๋ฅผ ๋ณ€ํ˜•ํ•˜์ง€ ์•Š๊ณ ๋„ ์—ฐ๊ฒฐ๊ฐ€๋Šฅํ•˜๋‹ค.

ํด๋ž˜์Šค Apdater์™€ Object Adapter์ด ์žˆ์ง€๋งŒ, ๋‹ค์ค‘ ์ƒ์†์ด ์•ˆ๋˜๋Š” Java์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ์ฒด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” Adapter ํŒจํ„ด๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

[Object Adapter]

Untitled.png

[Class Adapter]

Untitled.png

์ฝ”๋“œ ์˜ˆ์‹œ

Object Adapter

๊ธฐ์กด์˜ Duck ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋„ Turkey(์น ๋ฉด์กฐ)๋ฅผ ๋‹ค๋ฃจ๊ณ  ์‹ถ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด Adapter ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

Adapter ํด๋ž˜์Šค์—์„œ๋Š” ๊ฐ๊ฐ Duck์— ๋งž๋Š” ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

1
2
3
4
public interface Turkey {
	public void gobble();
	public void fly();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TurkeyAdapter implements Duck {
	Turkey turkey;
 
	public TurkeyAdapter(Turkey turkey) {
		this.turkey = turkey;
	}
    
	public void quack() {
		turkey.gobble();
	}
  
	public void fly() {
		for(int i=0; i < 5; i++) {
			turkey.fly();
		}
	}
}

[ํ…Œ์ŠคํŠธ ์ฝ”๋“œ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class DuckTestDrive {
	public static void main(String[] args) {
		Duck duck = new MallardDuck();

		Turkey turkey = new WildTurkey();
		Duck turkeyAdapter = new TurkeyAdapter(turkey);

		System.out.println("The Turkey says...");
		turkey.gobble();
		turkey.fly();

		System.out.println("\nThe Duck says...");
		testDuck(duck);

		System.out.println("\nThe TurkeyAdapter says...");
		testDuck(turkeyAdapter);
		
		// Challenge
		Drone drone = new SuperDrone();
		Duck droneAdapter = new DroneAdapter(drone);
		testDuck(droneAdapter);
	}

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

Class adapter

ํ•˜์ง€๋งŒ, ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์€ Java์—์„œ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

1
2
3
4
5
6
7
8
public class extends Turkey implementes Duck {
	public void quack() {
		gobble();
	}
	public void fly() {
		fly();
	}
}

๋น„๊ต(๊ฐ์ฒด ์–ด๋Œ‘ํ„ฐ vs ํด๋ž˜์Šค ์–ด๋Œ‘ํ„ฐ)

  • ๊ฐ์ฒด ์–ด๋Œ‘ํ„ฐ๋Š” ์–ด๋Œ‘ํ‹ฐ์˜ ์„œ๋ธŒ ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ๋„ ์–ด๋Œ‘ํ„ฐ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ž˜์Šค ์–ด๋Œ‘ํ„ฐ๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

๋‹ค์ค‘์ƒ์†์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” Java์—์„œ๋Š” ๊ฐ์ฒด ์–ด๋Œ‘ํ„ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ vs ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด

๋‘˜๋‹ค ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ผ๋‹ค๋Š” ๊ฒƒ์—์„œ ๋™์ผํ•˜๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์€ Component ํด๋ž˜์Šค๋ฅผ ๊ตฌ์„ฑ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ฐ์‹ธ, ํ–‰๋™์„ ์œ„์ž„ํ•œ๋‹ค. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค. (Type Change) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค๋Š” ์ฐจ์ด์ ๊ณผ ๋”๋ถˆ์–ด ์–ด๋Œ‘ํ„ฐ๋Š” ๋‹จ์ˆœ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ˜๋ฉด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ–‰๋™๊ณผ ์ฑ…์ž„์„ ์œ„์ž„ํ•œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.