어댑터 패턴 (Adapter)
어댑터 패턴(Adapter Pattern)은 서로 호환되지 않는 두 인터페이스(클래스)를 연결하여 함께 동작할 수 있도록 변환기(Adapter) 역할을 제공하는 구조 패턴입니다.
한국의 220V 플러그가 달린 가전제품을 일본에 가져가서 110V 콘센트에 꽂으려면 돼지코(변환 어댑터)가 필요합니다. 소프트웨어에서도 기존에 잘 작성된 레거시 클래스를 수정하지 않고, 새로운 시스템(인터페이스) 규격에 맞춰 끼워넣어야 할 때 매우 강력한 힘을 발휘합니다.
<!-- ==========================================
// 📂 Target & Adaptee
// ==========================================
// 1. 클라이언트(일본 콘센트)가 기대하는 인터페이스 규격 (Target)
interface Socket110V {
void powerOn110V();
}
// 2. 외부 라이브러리나 수정할 수 없는 레거시 시스템 (Adaptee)
// (한국 가전제품은 220V만 지원합니다)
class Appliance220V {
public void powerOn220V() {
System.out.println("220V 전원이 공급되어 작동합니다. 위잉~!");
}
}
// ==========================================
// 📂 Adapter (돼지코)
// ==========================================
// 3. 어댑터 클래스 작성: 클라이언트가 기대하는 규격(Socket110V)을 구현합니다.
class SocketAdapter implements Socket110V {
// 내부에 변환해야 할 대상 객체(Adaptee)를 가집니다.
private Appliance220V appliance;
public SocketAdapter(Appliance220V appliance) {
this.appliance = appliance;
}
// 110V 요청이 오면, 내부적으로 220V 메서드를 호출하여 변환해 줍니다!
@Override
public void powerOn110V() {
System.out.println("어댑터 동작: 110V 입력을 220V로 변환합니다.");
appliance.powerOn220V();
}
}
// ==========================================
// 📂 Main.java (사용 예시)
// ==========================================
public class Main {
// 콘센트 메서드는 110V 규격만 받을 수 있습니다.
public static void connectToJapanSocket(Socket110V socket) {
socket.powerOn110V();
}
public static void main(String[] args) {
Appliance220V koreanHeater = new Appliance220V();
// connectToJapanSocket(koreanHeater); // 컴파일 에러! 타입 호환 불가
// 4. 돼지코(어댑터)를 씌웁니다.
Socket110V adapter = new SocketAdapter(koreanHeater);
// 정상 작동!
connectToJapanSocket(adapter);
}
}