inblog logo
|
eunmouse
    디자인패턴

    [디자인 패턴] 어댑터 패턴(Adapter Pattern)

    Aug 13, 2024
    [디자인 패턴] 어댑터 패턴(Adapter Pattern)
    Contents
    1. 어댑터 패턴 2. 정리
     

    1. 어댑터 패턴

     
    어댑터 패턴(Adapter Pattern)은 객체지향 디자인 패턴 중 하나로, 호환되지 않는 인터페이스를 가진 클래스들이 서로 상호작용할 수 있도록 도와주는 패턴이다.
    마치 어댑터(전자기기에서 사용하는 변환기)가 서로 다른 규격을 맞춰주는 것처럼, 어댑터 패턴은 기존 클래스를 수정하지 않고도 다른 인터페이스를 사용할 수 있게 해준다.
     

    1-1. 어댑터 패턴을 사용하는 경우

     
    어댑터 패턴을 사용하는 두 가지 경우가 있다.
     
    💡
    1. 이미 만들어진 무언가가 우리 시스템에 호환이 안될 때, 어댑터를 사용한다. 2. 아직 안만들었는데, 어댑터 틀을 만들어놓고 여기 규격에 맞게 만들어~ 라고도 할 수 있다.
     
    순서가 얘가 먼저 만들어져야 그 다음 것을 만들 수 있는 경우,
    내가 마냥 기다리고 있을 순 없잖아
    내가 어댑터 만들어 놨으니까 이렇게 만들어~ 라고 할 수도 있는 것.
     
    어댑터 패턴을 사용 할 때에는 첫번째 경우가 더 많다.
    다른 사람이 만든 라이브러리를 내가 끌어다 쓸 건데, 호환이 안될 때. 그 때 어댑터를 만든다.
    notion image
     
    외부에서 만든 OuterRabbit 이 존재 할 경우,
    내가 만든 것이 아니니, 기존에 있는 Mouse 나 Tiger 처럼 Animal 로 추상화 해서 연결 할 수가 없다.
     
    package ex03; // 쥐 public class Mouse extends Animal { private String name = "쥐"; // 재정의됨 public String getName() { return name; } }
     
    외부에서 만든다면 위와 같은 getName() 이 없을 것이다. 협업의 관계면 규칙에 맞게 만들라 할 수 있지만, 먼 나라의 누군가가 가져다 쓴다면 그렇지 않을 것.
     
    package ex03.lib; public class OuterRabbit { private String fullname = "토끼"; public String getFullname() { return fullname; } }
     
    이럴 때, 사용하는 것이 어댑터(Adapter).
    RabbitAdapter (어댑터)를 사용하여, OuterRabbit 을 감싸서 호환이 가능하도록 한다. 어댑터라고 이름 붙인거지, 사실 Rabbit 인 셈.
     
    package ex03; import ex03.lib.OuterRabbit; // 컴퍼지션(Composition) : has-a public class RabbitAdapter extends Animal { private OuterRabbit rabbit; // 컴퍼지션 public RabbitAdapter(OuterRabbit rabbit) { this.rabbit = rabbit; } @Override String getName() { // 호환시키는 코드 return rabbit.getFullname(); // 그 안에다 호환안되는 코드를 넣어주면 됨 } }
     
    이미 만들어진 무언가를 호환 시킬 때, 위와 같은 방법을 이용한다.
     
    외부에서 만든 new OuterRabbit() 를 어댑터가 감싸주는 방법으로, 호환이 가능케 한다.
     
    package ex03; import ex03.lib.OuterRabbit; /* Animal 생성(abstract) 타입 일치(다형성) = 쥐(동물), 호랑이(동물) 문지기한테 DIP 만 지켜주면 됨 */ public class App { public static void main(String[] args) { Animal mouse = new Mouse(); Animal tiger = new Tiger(); Doorman d1 = new Doorman(); d1.쫒아내(tiger); RabbitAdapter rabbit = new RabbitAdapter(new OuterRabbit()); // 외부에서 만든 new OuterRabbit() 를 넣어서 어댑터가 감싸주는 것 // 호환이 안되는 것을 얘가 해결해줌. d1.쫒아내(rabbit); } }
     
    출력 되는 내용은 아래와 같다.
    notion image

    1-2. 그 외의 역할도 해주는 어댑터

     
    메서드 이름이 동일해야 동적 바인딩이 되는데,
    어떤 경우에는 강제성을 다 부여할 필요 없이 1개만 부여해도 되는 경우가 있단 말이지?
    이 때, Adapter 를 만들어서 안쓰일것들을 걸러내는 역할도 해준다.
     
    자바 8 부터는 default 메서드를 사용하여,
     

    2. 정리

    외부 라이브러리 당겨와서 쓰고 싶어, 근데 우리랑 맞지 않아.
    그러면 어댑터 패턴을 이용하여 끼워 맞춰 주는 것.
     
     
    Share article
    Contents
    1. 어댑터 패턴 2. 정리

    eunmouse

    RSS·Powered by Inblog