๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS

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

๊ฐœ๋ฐœ์ž HOON 2022. 12. 27. 01:09

 

๐Ÿ 1. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด(Adapter Pattern)์ด๋ž€?

 

ํ•œ๊ตญ์˜ ๊ฐ€์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „์••์€ 220V์ž…๋‹ˆ๋‹ค. ๋ฏธ๊ตญ์˜ ๊ฐ€์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „์••์€, 110V๋ฅผ ์‚ฌ์šฉํ•˜์ฃ .

ํ•œ๊ตญ์‚ฌ๋žŒ์ด ๋ฏธ๊ตญ์œผ๋กœ ์—ฌํ–‰์„ ๊ฐ€์„œ, ์ˆ™์†Œ์— ๋จธ๋ฌธ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.

ํ•œ๊ตญ์˜ ํ•ธ๋“œํฐ ์ถฉ์ „๊ธฐ๋ฅผ ๋“ค๊ณ , ๋ฏธ๊ตญ์—์„œ ๊ผฝ์œผ๋ ค๊ณ  ํ•˜๋‹ˆ, ๋‹จ์ž๊ฐ€ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฏธ๊ตญ์˜ ์ „๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, 110V์— ๋งž๋Š” ๋‹จ์ž๋ฅผ ๊ผฝ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต ํ•œ๊ตญ์˜ ์ถฉ์ „๊ธฐ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋ฏธ๊ตญ์˜ ์ถฉ์ „๊ธฐ๋ฅผ ์ƒˆ๋กœ ์‚ฌ์ง€ ์•Š๊ณ ,  ์–ด๋Œ‘ํ„ฐ(Adapter, ๋ณ€ํ™˜๊ธฐ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์€ ํ˜ธํ™˜์„ฑ์ด ์—†๋Š” ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ์ด ์—†๋Š” ๊ธฐ์กด ํด๋ž˜์Šค๋Š” ํ•œ๊ตญ์˜ 220V ์ถฉ์ „๊ธฐ์™€ ๋™์ผํ•˜๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋Œ‘ํ„ฐ๋กœ ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ์˜ ์„ค๊ณ„ ์›์น™ SOLID์ค‘, ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™์— ์†ํ•˜๋Š” OCP๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

OCP : ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ, ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์„ ๋งํ•œ๋‹ค.
๋ณดํ†ต OCP๋ฅผ ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐœ๋ฐฉ์ (open)์ด๊ณ , ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ํ์‡„์ (closed)์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์ •์˜ํ•œ๋‹ค.

 

์œ„์—์„œ ๋ฏธ๊ตญ๊ณผ ํ•œ๊ตญ์˜ ์ถฉ์ „๊ธฐ๋ฅผ ํ†ตํ•ด์„œ ๋น„์œ ๋ฅผ ํ•ด๋ดค์œผ๋‹ˆ, ์ด๋ฅผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•ด ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ํ‘œํ˜„ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

/* 110VElectronic.java */
public interface 110VElectronic{
	void powerOn(); // ์ „์› ์ผœ๊ธฐ
}

/* 220VElectronic.java */
public interface 220VElectronic{
	void connect(); // ์ „์›์„ ์ผœ๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‚˜, ์ง„ํ™”๋œ ๋ฒ„์ „์ด๋ผ ๊ฐ€์ •.
}

/* AmericaPowerSupplier.java */
public class AmericaPowerSupplier implements 110VElectronic{
	@Override
    public void powerOn(){
    	System.out.println("๋ฏธ๊ตญ ์ถฉ์ „๊ธฐ 110V ์ผœ์ง");
    }
}

/* KoreaPowerSupplier.java */
public class KoreaPowerSupplier implements 220VElectronic{
	@Override
    public void connect(){
    	System.out.println("ํ•œ๊ตญ ์ถฉ์ „๊ธฐ 220V ์ผœ์ง");
    }
}

/* RussiaPowerSupplier.java */
public class RussiaPowerSupplier implements 220VElectronic{
	@Override
    public void connect(){
    	System.out.println("๋Ÿฌ์‹œ์•„ ์ถฉ์ „๊ธฐ 220V ์ผœ์ง");
    }
}

 

110V ํŒŒ์›Œ์™€ 220V ํŒŒ์›Œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ (powerOn, connect) ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฏธ๊ตญ, ํ•œ๊ตญ, ๋Ÿฌ์‹œ์•„์˜ ์ถฉ์ „๊ธฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๋ฏธ๊ตญ์€ 110V์˜ ํŒŒ์›Œ, ํ•œ๊ตญ๊ณผ ๋Ÿฌ์‹œ์•„๋Š” 220V์˜ ํŒŒ์›Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

public class Main{
	public static void main(String[] args){
    	AmericaPowerSupplier america = new AmericaPowerSupplier();
    	KoreaPowerSupplier korea = new KoreaPowerSupplier();
        RussiaPowerSupplier russia = new RussiaPowerSupplier();
        
        connect(ameria); // ๋ฏธ๊ตญ ์ถฉ์ „๊ธฐ 110V ์ผœ์ง
        connect(korea); // ์ปดํŒŒ์ผ ์—๋Ÿฌ, ๋งž์ง€ ์•Š์Œ
        connect(russia); // ์ปดํŒŒ์ผ ์—๋Ÿฌ, ๋งž์ง€ ์•Š์Œ
    }
    
    // ์ฝ˜์„ผํŠธ
    public static void connect(110VElectronic electronic){
    	electronic.powerOn();
    }

}

์ด์ œ ์ถฉ์ „๊ธฐ๋ฅผ ๋‹จ์ž์— ๊ฝ‚์„ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋Š” ๋ฏธ๊ตญ์ด๊ธฐ ๋•Œ๋ฌธ์— connect ํ•จ์ˆ˜์—์„œ 110VElectronic ํƒ€์ž…์˜ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€์—์„œ๋Š” powerOn ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„ค์š”.

 

์ด ๊ฒฝ์šฐ์—, ๋ฏธ๊ตญ์˜ ์ถฉ์ „๊ธฐ๋ฅผ ์—ฐ๊ฒฐ์ด ๋˜์ง€๋งŒ, ํ•œ๊ตญ๊ณผ ๋Ÿฌ์‹œ์•„์˜ ์ถฉ์ „๊ธฐ๋Š” 110VElectronic ํƒ€์ž…์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ์š”?

 

๋ฐ”๋กœ ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

 

๐Ÿ 2. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด(Adapter Pattern) ๊ตฌํ˜„ํ•˜๊ธฐ

 

public class SocketAdapter implements 110VElectronic{
	private 220VElectronic electronic;
    
    public SocketAdapter(220VElectronic electronic){
    	this.electronic = electronic;
    }

	@Override
    public void powerOn(){
    	electronic.connect();
    }
}

 

์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ์ง€์ผœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1. ์–ด๋Œ‘ํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    1-1. ๋ณ€๊ฒฝํ•  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•ฉ๋‹ˆ๋‹ค. (์—ฌ๊ธด ๋ฏธ๊ตญ์ด๋‹ˆ๊นŒ 110VElectronic์„ implements ํ•ฉ์‹œ๋‹ค.)
    1-2. ํ•„๋“œ์™€ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๊ฐ์ฒด ํƒ€์ž… ๊ฐ–๊ณ , ์ƒ์„ฑ์ž๋กœ ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์ฑ„์›๋‹ˆ๋‹ค.
2. ์žฌ์ •์˜์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„ ๋ณ€ํ™˜์„ ํ•ฉ๋‹ˆ๋‹ค.
=> 110VElectronic์€ powerOn์ด๊ณ , 220VElectronic์€ connect ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค๋ฅธ ์ ์ด ํฌ๊ฒŒ ์—†์ง€๋งŒ, ์‹ค์ œ ๋กœ์ง์—์„œ๋Š” ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” convert ๋กœ์ง์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

public class Main{
	public static void main(String[] args){
    	AmericaPowerSupplier america = new AmericaPowerSupplier();
    	KoreaPowerSupplier korea = new KoreaPowerSupplier();
        RussiaPowerSupplier russia = new RussiaPowerSupplier();
        
        connect(ameria); // ๋ฏธ๊ตญ ์ถฉ์ „๊ธฐ 110V ์ผœ์ง
        
        110VElectronic adapterWithKorea = new SocketAdapter(korea);
        connect(adapterWithKorea); // ํ•œ๊ตญ ์ถฉ์ „๊ธฐ 220V ์ผœ์ง
        
        110VElectronic adapterWithRussia = new SocketAdapter(russia);
        connect(russia); // ์ปดํŒŒ์ผ ์—๋Ÿฌ, ๋งž์ง€ ์•Š์Œ
        connect(adapterWithRussia); // ๋Ÿฌ์‹œ์•„ ์ถฉ์ „๊ธฐ 220V ์ผœ์ง
    }
    
    // ์ฝ˜์„ผํŠธ
    public static void connect(110VElectronic electronic){
    	electronic.powerOn();
    }

}

์ด์ œ ์™„์„ฑ๋œ ์–ด๋Œ‘ํ„ฐ์™€ ์ถฉ์ „๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. (์ƒ์„ฑ์ž ์ธ์ž๋กœ ์ „๋‹ฌ = ์—ฐ๊ฒฐ๋กœ ๋น„์œ )

์ด์ œ connect ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์ž˜ ์ž‘๋™๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์€ ํ˜ธํ™˜์„ฑ์ด ์—†๋Š” ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์€ ๋””์ž์ธ ํŒจํ„ด ์ค‘์—์„œ ๊ตฌ์กฐ ํŒจํ„ด์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ํด๋ž˜์Šค๋“ค์ด ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š”๋ฐ ์ด๋Ÿฐ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๋”์šฑ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.