본문 바로가기
소프트웨어공학/Design Pattern

어텝터(adapter)

by 아이티.파머 2023. 1. 11.
반응형

어텝터(adapter)

어뎁터패턴이란?

어뎁터페턴은 우리가 일상생활에서 사용하는 어뎁터와 비슷하다. 호환이 되지 않는 부분을 어뎁터를 통해 호환가능하게 만들어 주는것이다. 헤더퍼스트에서는 어댑터패턴을 이렇게 정의하고 있다. 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어뎁터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 사용할 수 있다.

말이 조금 어려운데 조금 쉽게 설명하자면 이럴 것 같다. 원래 사용 중인 인터페이스와 라이브러리가 있는데, 새로운 곳에서 사용하기 위해서는 지금의 라이브러리로는 사용하기 어렵다. 이때 어뎁터패턴을 이용하여 기존 기능을 최대한 살리면서 기능을 제공하는 것이다. 즉 코드의 재사용성을 높이는 의도로 볼 수 있다.

Adapter pattern UML

예시

Adapter pattern - Animal

Animal inferface를 상속받은 Tiger와 Lion은  걷기 / 소리를 낼 수 있는 기능이 있다.

기존 레거시코드에도 Cat/Dog 도  움직일 수 있고 소리를 내는 기능이 있는데  이를 하나의 인터페이스 즉 Animal을 이용해서 사용하려 한다.  이때 레거시인 Adaptee Class(Cat, Dog)에 Adapter 클래스를 랩핑 하여 하나의 인터페이스를 사용하여 코드의 재사용성을 높일 수 있다.

 

 

기존 레거시코드

public class Cat {

    private String name;

    public Cat(String name) {
        this.name = name;
    }

    public void move() {
        System.out.println(name + " : 고양이가 사뿐사분 이동합니다.");
    }

    public void bark(){
        System.out.println(name + " : 냐용 웁니다.");
    }
}

신규 인터페이스

public interface Animal {

    void walk();
    void sound();
}

신규인터페이스를 구현한 기능

public class Lion implements Animal{

    private String name;

    public Lion(String name) {
        this.name = name;
    }

    @Override
    public void walk() {
        System.out.println(name + " : 사자가 성큼성큼 걷습니다.");
    }

    @Override
    public void sound() {
        System.out.println(name + " : 사자가 포효합니다.");
    }
}

public class Tiger implements Animal{
    private String name;

    public Tiger(String name) {
        this.name = name;
    }

    @Override
    public void walk() {
        System.out.println(name + " : 호랑이가 어슬렁 어슬렁");
    }

    @Override
    public void sound() {
        System.out.println(name + " : 호랑이가 어흥하고 소리를 냅니다.");
    }
}

클라이언트

public class AdapterClientMain {

    public static void main(String[] args) {

        List <Animal> animalList =
                List.of(
                        new Lion("포세이돈"),
                        new Tiger("산이"),
                        new CatAdapter(new Cat("뾰뿅"))
                );

        animalList.forEach(animal -> {
            animal.walk();
            animal.sound();

        });
    }
}

결과

포세이돈 : 사자가 성큼성큼 걷습니다.
포세이돈 : 사자가 포효합니다.
산이 : 호랑이가 어슬렁 어슬렁
산이 : 호랑이가 어흥하고 소리를 냅니다.
뾰뿅 : 고양이가 사뿐사분 이동합니다.
뾰뿅 : 냐용 웁니다.

기존 레거시 코드인 Cat 클레에 대해 Adapter를 붙여 인터페이스 하나로 사용 가능하게 하였다. 이처럼 기존 레거시코드를 새로운 인터페이스 맞춰서 기능을 제공해야 하거나, 코드의 재사용성을 높이고자 할 때 기존 라이브러리에 대한 기능을 인터페이스가 맞지 않는 곳에 제공해야 할때 어뎁터 패턴을 응용하면 좋을 것 같다.

 

반응형