๐ 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 ๋ฉ์๋๋ฅผ ์คํํด๋ณด๋ฉด ์ ์๋๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ ์ด๋ํฐ ํจํด์ ํธํ์ฑ์ด ์๋ ๊ธฐ์กด ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๋ณํํด ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ํจํด์ ๋๋ค.
์ด๋ํฐ ํจํด์ ๋์์ธ ํจํด ์ค์์ ๊ตฌ์กฐ ํจํด์ ์ํฉ๋๋ค. ๋ง์ ํด๋์ค๋ค์ด ์์กด์ฑ์ ๊ฐ์ง๋๋ฐ ์ด๋ฐ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ฉ์ดํ๊ฒ ๋ง๋ค๊ณ ์ ์ง๋ณด์๋ฅผ ๋์ฑ ๊ฐํธํ๊ฒ ๋ง๋ค์ด์ค๋๋ค.