// 1. 기존 클래스 (220V 콘센트)
class KoreanSocket {
    public void provide220V() {
        System.out.println("220V 전원이 공급됩니다.");
    }
}

// 2. 새로운 인터페이스 (110V 플러그)
interface USPlug {
    void supply110V();
}

// 3. 어댑터 클래스 (220V → 110V 변환)
class VoltageAdapter implements USPlug {
    private KoreanSocket koreanSocket;

    public VoltageAdapter(KoreanSocket koreanSocket) {
        this.koreanSocket = koreanSocket;
    }

    @Override
    public void supply110V() {
        koreanSocket.provide220V(); 
        System.out.println("어댑터를 통해 110V 전원으로 변환되었습니다.");
    }
}

// 4. 사용 예
public class Main {
    public static void main(String[] args) {
        KoreanSocket socket = new KoreanSocket();
        USPlug adapter = new VoltageAdapter(socket);

        adapter.supply110V();
    }
}

어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스를 연결할 때 사용하는 디자인 패턴입니다. • 기존 클래스를 수정하지 않고 새로운 인터페이스에 맞게 변환할 수 있습니다. • 라이브러리, 레거시 코드, 외부 API 등을 통합할 때 유용합니다.

✅ 장점 • 기존 코드를 수정하지 않고도 새로운 인터페이스와 호환 가능 • 레거시 코드 또는 외부 API와의 통합이 용이

❌ 단점 • 클래스 구조가 복잡해질 수 있으며, 너무 많이 사용하면 유지보수가 어려워질 수 있음 • 성능이 중요한 경우, 변환 과정이 추가 오버헤드를 발생할 수 있음