본문 바로가기
Java

java - 어댑터 패턴(구조 패턴)

by sinabeuro 2021. 8. 20.
728x90

Adapter pattern

어댑터 패턴은 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 합니다.

SOLID(객체지향 5원칙) 중에서 개방폐쇄 원칙(OCP)를 따릅니다.

 

Adapter는 실생활에서 100v를 200v로 변경해주거나, 그 반대로 해주는 흔히 돼지코라고 불리는 변환기를 예로 들 수 있습니다.

 

기존에 있는 시스템에 새로운 써드파티 라이브러리가 추가되거나,

레거시 인터페이스를 새로운 인터페이스로 교체하는 경우

코드의 재사용성을 높일 수 있는 방법이 어댑터 패턴을 사용합니다.

 

어댑터 패턴 다이어그램

 

 

 

인터페이스가 달라서 서로 맞추지 못할 때 중간에 어댑터 클래스를 두고 클래스 간의 호환성을 맞춥니다.

 

어댑터 패턴 구현 예제

서로 다른 두개의 인터페이스 Electronic110V, Electronic220V​

// Electronic110V.java
public interface Electronic110V {
    public void powerOn();
}

 

// Electronic220V.java
public interface Electronic220V {
    public void connect();
}

 

// HairDryer.java
public class HairDryer implements Electronic110V {
    @Override
    public void powerOn() {
        System.out.println("110v 헤어드라이기 ON");
    }
}
// Cleaner.java
public class Cleaner implements Electronic220V{
    @Override
    public void connect() {
        System.out.println("220v 청소기 ON");
    }
}

HairDryer 클래스는 Electronic110V를 상속받고, Cleaner 클래스는 Electronic220V을 상속받습니다.

그렇다면 HairDryer 클래스로 만든 인스턴스와 Cleaner 클래스로 만든 인스턴스 간에 속성과 메소드가 다르게 됩니다.

이 경우에 두 인스턴스 간에 호환을 맞추기 위해 어탭터 클래스를 정의하여 사용하는 것입니다.

 

// SocketAdapter.java
public class SocketAdapter implements Electronic110V {

    private Electronic220V electronic220V;

    public SocketAdapter(Electronic220V electronic220V){
        this.electronic220V = electronic220V;
    }

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

어댑터 클래스는 Electronic110V 인터페이스를 상속받되, 인자로는 Electronic2200V 인터페이스를 상속받은 객체를 받습니다.

Electronic110V 메소드와 Electronic220V 메소드 간의 호환을 위해,

Electronic110V 인터페이스의 powerOn 메소드를 오버라이드하여

Electronic220V 인터페이스의 connect 메소드를 호출합니다.

 

 

public class Main {

    public static void main(String[] args) {

        HairDryer hairDryer = new HairDryer();
        connect(hairDryer);	// 110v 헤어드라이기 ON

        Cleaner cleaner = new Cleaner();
        Electronic110V adapter = new SocketAdapter(cleaner);
        connect(adapter);	// 220v 청소기 ON

    }

    public static void connect(Electronic110V electronic110V) {
        electronic110V.powerOn();
    }
}

Electronic2200V 인터페이스를 상속한 객체를 Electronic110V 인터페이스를 상속한 SocketAdapter 클래스(어댑트 클래스)로 다시 인스턴스를 생성합니다.

생성된 인스턴스를 통해서 Electronic110V 인터페이스 메소드를 통해서 Electronic2200V 인터페이스 메소드를 호출할 수 있게 되는 것이죠.

 

 

 

728x90

'Java' 카테고리의 다른 글

java - 데코레이터 패턴(구조 패턴)  (0) 2021.08.23
java - 프록시 패턴(구조 패턴)  (0) 2021.08.23
java - 싱글톤 패턴(생성 패턴)  (0) 2021.08.20
java - Gof의 디자인 패턴 개론  (0) 2021.08.20
Java - 자료형(숫자편)  (0) 2021.06.21

댓글