08. 어댑터 패턴

AlmondGood·2022년 7월 22일
0

디자인패턴

목록 보기
9/16

어댑터 패턴(Adapter Pattern)

해외로 여행을 가시거나, 해외 직구한 물건 중에 우리나라 220V 플러그와 맞지 않는 콘센트/플러그를 마주한 경험이 있는 분들이 있을 거라고 생각합니다.

220V 플러그로 바꾸기 위해 필요한 것이 어댑터죠.
(또는 핸드폰 충전기도 220V -> C타입 / 라이트닝으로 변환하기 때문에 어댑터입니다.)

Client : Target 인터페이스를 사용
Target : Client가 직접 사용하고자 하는 인터페이스(Adaptee가 지원하길 바라는 인터페이스)
Adapter : Target -> Adaptee
Adaptee : Adapter에서 사용하고자 하는 인터페이스
https://kscory.com/dev/design-pattern/adapter

어댑터 패턴특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환하는 패턴입니다.



어댑터 패턴 구현

핸드폰은 직류(DC) 전기를 사용하지만, 집의 콘센트로 흐르는 전기는 교류(AC) 전기입니다.
핸드폰을 충전하기 위해서는 충전기(어댑터)를 사용해야겠죠.

충전기의 플러그 부분이 플러그 인터페이스가 되고, 몸통 부분이 충전기 인터페이스에 해당하겠네요.

// 플러그 인터페이스 (Target)
interface _220VPlug {
    String getACElectric();
    String putACElectric();
}

// 충전기 인터페이스 (Adaptee)
interface CType {
    String getDCElectric();
    String putDCElectric();
}

플러그는 교류 전기를 받아, 어댑터로 교류 전기를 보내주는 역할을 하고,
충전기는 어댑터에서 직류 전기를 받아, 직류 전기를 핸드폰으로 보내는 역할을 합니다.



구체적인 플러그와 C타입 충전기 클래스입니다.
플러그를 콘센트에 꽂았다고 생각하면 쉬울 것 같습니다.

class Plug implements _220VPlug {

	// 콘센트로부터 교류 전기를 받아왔습니다.
    @Override
    public String getACElectric() {
        return "Get Alternating Current";
    }

    // 어댑터로 교류 전기를 보냅니다.
    @Override
    public String putACElectric() {
        return "Put Alternating Current";
    }
}
class CTypeCharger implements CType{

	// 어댑터로부터 직류 전기를 받습니다.
    @Override
    public String getDCElectric() {
        return "Get Direct Current";
    }

    // 핸드폰으로 직류 전기를 보냅니다.
    @Override
    public String putDCElectric() {
        return "Put Direct Current into phone";
    }
}


교류 전기를 직류 전기로 바꿔줄 어댑터입니다.

플러그로부터 교류 전기를 받고(= 플러그 인터페이스 상속),
내부에서 전기를 변환해서(= CType 변수 선언),
핸드폰으로 직류 전기를 보냅니다.

// Adapter
class ACtoDCAdapter implements _220VPlug {
    // 이 형태는 많이 익숙하시죠?
    CType cType;

    public ACtoDCAdapter(CType cType) {
        this.cType = cType;
    }

	// 교류 -> 직류
    @Override
    public String getACElectric() {
        return cType.getDCElectric();
    }
	// 직류 -> 충전기
    @Override
    public String putACElectric() {
        return "Put Direct Current;
    }
}


메인 함수입니다.

// Client
public static void main(String[] args) {
	
    // 플러그 객체와 충전기 객체 생성
    _220VPlug _220Vplug = new Plug();
    CType cTypeCharger = new CTypeCharger();

	// 어댑터 객체 생성
	ACtoDCAdapter Adapter = new ACtoDCAdapter(cTypeCharger);

	// 플러그 
	System.out.println(_220VPlug.getACElectric()); 	// "Get Alternating Current"
    System.out.println(_220VPlug.putACElectric()); 	// "Put Alternating Current"

	//어댑터
	System.out.println(Adapter.getACElectric()); 	// "Get Direct Current"
	System.out.println(Adapter.putACElectric()); 	// "Put Direct Current"

    // 충전기
    System.out.println(cTypeCharger.getDCElectric()); // "Get Direct Current"
    System.out.println(cTypeCharger.putDCElectric()); // "Put Direct Current into phone"
    }
}

(영어 실력은 묻지 마세요...)

플러그가 교류 전기를 받아서 내보내고,
어댑터가 교류 전기를 받아 직류로 변환해서 내보내고,
충전기가 직류 전기를 받아 핸드폰으로 내보냈습니다.

이처럼 서로 호환되지 않는 두 인터페이스를 호환시켜 주는 것이 '어댑터'입니다.


어댑터 패턴은 협업에서 중요하게 사용됩니다.

기존 코드가 실제 서비스와 맞지 않아, 다시 만들어야 하는데,
이 코드가 다른 사용처(부서)에서 사용되고 있다고 생각해봅시다.

코드를 수정하게 되면 다른 사용처들에게 영향을 끼치게 됩니다.
그래서 어댑터를 사용하여 기존 인터페이스를 새로운 인터페이스에 적응(Adapt) 시킵니다.




장점

  • 기존 코드를 변경하지 않아도 됩니다.
  • 코드의 재사용성이 뛰어납니다.

단점

  • 새로운 구성요소가 생길 때마다 클래스를 증가시켜야 하기 때문에 복잡도가 증가합니다.
  • 인터페이스를 상속받기 때문에 코드를 일일이 다시 작성해야 합니다.



참고 자료

https://kscory.com/dev/design-pattern/adapter

profile
Zero-Base to Solid-Base

0개의 댓글