관리 메뉴

IT.FARMER

어텝터(adapter) 본문

소프트웨어공학/Design Pattern

어텝터(adapter)

아이티.파머 2023. 1. 11. 18:54
반응형

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

 

반응형