Developing Myself Everyday

어댑터 패턴이란?


 어댑터 패턴(Adapter pattern)은 소프트웨어 공학에서 사용되는 디자인 패턴 중 하나로, 기존의 클래스를 새로운 인터페이스에 맞게 변환하여 재사용할 수 있도록 해주는 패턴이다.

 

 어떤 클래스나 객체를 다른 클래스나 객체에서 사용하려면, 그것들이 호환되는 인터페이스를 가져야 한다. 하지만 기존에 존재하는 클래스나 객체가 원하는 인터페이스를 갖추고 있지 않을 경우에는, 새로운 클래스나 객체를 만들거나, 기존 클래스나 객체를 수정해야 하는 경우가 있다. 이때 어댑터 패턴을 사용하면, 기존 클래스나 객체를 수정하지 않고도 새로운 인터페이스를 제공할 수 있다.

 

 어댑터 패턴은 크게 두 가지 종류가 있다. 클래스 어댑터 패턴과 객체 어댑터 패턴이다. 클래스 어댑터 패턴은 기존 클래스를 상속받아서 새로운 인터페이스를 구현하는 방식이다. 객체 어댑터 패턴은 기존 클래스를 객체로 감싸서 새로운 인터페이스를 제공하는 방식이다.

 

어댑터 패턴은 다음과 같은 장점이 있다.

  • 기존 코드의 수정이 최소화된다.
  • 새로운 인터페이스를 구현하는 것이 쉽고 빠르다.
  • 기존 코드를 재사용할 수 있다.

어댑터 패턴은 다음과 같은 경우에 사용될 수 있다.

  • 이미 존재하는 클래스나 객체를 다른 인터페이스에서 사용하려고 할 때
  • 다양한 인터페이스를 지원하려는 경우
  • 호환성 문제를 해결하려는 경우

 

어댑터 패턴 구현


 간단하게 직사각형을 그리는 예제를 한번 구현해보도록 하겠다.

JAVA

// Adaptee (기존의 클래스)
class LegacyRectangle {
    public void display(int x1, int y1, int x2, int y2) {
        System.out.println("LegacyRectangle: " + x1 + "," + y1 + " to " + x2 + "," + y2);
    }
}

// Target (인터페이스)
interface Shape {
    void display(int x, int y, int width, int height);
}

 

 위의 코드는 기존 클래스와 새로운 기능을 제공하기 위한 대상 인터페이스이다. 이 두 요소를 이용하면 우리는 어댑터 클래스를 만들 수 있다. 이렇게 되면 기존 코드를 수정하지 않고도, 새로운 인터페이스를 이용해 기능을 확장할 수 있다.

 

// Adapter (어댑터 클래스)
class RectangleAdapter implements Shape {
    private LegacyRectangle legacyRectangle;

    public RectangleAdapter(LegacyRectangle legacyRectangle) {
        this.legacyRectangle = legacyRectangle;
    }

    public void display(int x, int y, int width, int height) {
        int x2 = x + width;
        int y2 = y + height;
        legacyRectangle.display(x, y, x2, y2);
    }
}

 

 그렇게해서 만든게 바로 위의 어댑터 클래스이다. 이젠 기존의 클래스의 객체를 생성하고 어댑터를 이용하는것만 남았다. 

 

// Client (클라이언트 코드)
public class Client {
    public static void main(String[] args) {
        // 기존의 LegacyRectangle 객체를 생성한다.
        LegacyRectangle legacyRectangle = new LegacyRectangle();

        // Adapter를 이용해 Shape 인터페이스를 사용할 수 있도록 한다.
        Shape shape = new RectangleAdapter(legacyRectangle);

        // 클라이언트는 Shape 인터페이스를 통해 기존의 LegacyRectangle 클래스를 사용할 수 있다.
        shape.display(10, 20, 100, 200);
    }
}

 

 

 

 

 

 

Kotlin

// Adaptee (기존의 클래스)
class LegacyRectangle {
    fun display(x1: Int, y1: Int, x2: Int, y2: Int) {
        println("LegacyRectangle: $x1,$y1 to $x2,$y2")
    }
}

// Target (인터페이스)
interface Shape {
    fun display(x: Int, y: Int, width: Int, height: Int)
}

 

// Adapter (어댑터 클래스)
class RectangleAdapter(private val legacyRectangle: LegacyRectangle) : Shape {
    override fun display(x: Int, y: Int, width: Int, height: Int) {
        val x2 = x + width
        val y2 = y + height
        legacyRectangle.display(x, y, x2, y2)
    }
}

 

// Client (클라이언트 코드)
fun main() {
    // 기존의 LegacyRectangle 객체를 생성한다.
    val legacyRectangle = LegacyRectangle()

    // Adapter를 이용해 Shape 인터페이스를 사용할 수 있도록 한다.
    val shape: Shape = RectangleAdapter(legacyRectangle)

    // 클라이언트는 Shape 인터페이스를 통해 기존의 LegacyRectangle 클래스를 사용할 수 있다.
    shape.display(10, 20, 100, 200)
}
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!