어댑터 패턴

반응형
반응형

어댑터라고 하면 제일 먼저 생각나는 건 

 

대충 이런 이미지를 생각한다. 그럼 어댑터라는건 어떤 역할을 하는 걸까?

일상생활에서의 어댑터는 전기를 변환하는데 사용이 된다. 가령, 소켓(플러그를 꼽는 곳)은 220V를 사용되는데, 사용하는 전자기기가 사용하는 V는 110V를 사용한다고 한다. 이 두개가 호환성이 맞지않기 때문에 전력은 들어오지 않는다. 이때 필요한것이 바로 어댑터다. 어댑터를 이용하면 220V라는 전력을 110V로 바꿔준다. 어떻게 보면 컨버터랑 비슷하지만.. 뭐 이건 전기 수업이 아니므로 넘어가도록 하자. 또, 내가 전기를 잘 아는게 아니기 때문에 틀리게 말할 수 도 있다. 하지만 하나 확실한건 호환되지 않는 두 장치를 연결시켜준다는 점은 변함이 없다. 즉, 두개가 호환이 되게 해주는 역할을 한다.

 

그럼 어댑터라는 건 알겠는데, 프로그래밍에서는 어떻게 사용할 수 있을까?

어댑터 패턴은 다양한 곳에서 사용된다. 만약, 프로그래밍언어에서는 프레임워크를 교려하지 않고, 제품을 만들게 되는데, 이렇게 되버리면 프레임워크에서는 프로그래밍언어에서 만든 기능들을 재대로 사용하지 못하는 경우가 발생할 수 도 있다. 이러한 이유때문이 아니더라도 다양한 곳에서 어댑터 패턴이 사용될것 같다.

 

본격적으로 이 패턴을 실습해보자. 

간단한 예로 A클래스에서는 책에 대한 정보가 존재한다. (편의상 Book.class로 하겠다.)

public class Book {
    private String title;
    private String author;

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

}

또 B클래스는 오디오에 대한 정보가 있다. (편의상 Audio.class로 하겠다.)

public class Audio {
    private String title;
    private String Speaker;

    public String getTitle() {
        return title;
    }
    
    public String getSpeaker() {
        return Speaker;
    }
    
}

일반적으로 책과 오디오는 전혀다르다.(오디오 북이 있지만 그건 논외로 두겠다. 결론적으로는 오디오북을 만드는 거라 할 수 도 있겠다.)

물론, set을 활용해서 값을 바꾸는 방법이 있겠지만, 그건 객체를 바꾸는 게 아니라 값을 바꾸는것이기 때문에 사용하면 안된다.

이럴때 Adapter를 이용한다.

public class BookAdpater extends Audio {

    private Book book;

    public BookAdpater(Book book) {
        this.book = book;
    }

    @Override
    public String getTitle() {
        return book.getTitle();
    }

    @Override
    public String getSpeaker() {
        return book.getAuthor();
    }
}

설명하면, 생성자러 Book객체를 받고 그 값들을 Audio에 맞게 바꿔준다.

이렇게 하면 어댑터 패턴이 완성된다.  상속이 아닌 구현으로 만드는것이 더 좋다.

 

어댑터 패턴에서는 어댑터, 어댑티, 타겟이 중요한데, 위 코드와 비교해가며 설명하도록 하겠다.

 

어댑터는 누가 봐도 어댑터라고 이름이 작성되어있기 때문에 패스..

어댑티는 변환되는 객체를 뜻한다. 즉, 여기에서는 Audio객체를 말한다.

그럼 타겟은 Book객체다. 

 

이렇게 되면 Book -> Audio로 값을 변경시키는 것이 가능해졌다.

물론, 값은 아무것도 나오지 않는다. 왜냐하면 값을 설정하지 않았기 때문이다. 

 

사실 지금까지 말한거 이외에 어댑터 패턴은 한가지더 존재한다. 바로 클래스 어댑터라는 녀석인데,

클래스 어댑터에 가장 큰 특징은 다중 상속을 해서 객체를 변환시켜준다. 들리는 말로는 객체 하나만 가능하다는데....

 

내가 생각할때, 이 방법은 다양한 방법으로 문제를 해결 할 수 있을 것 같다. 위에서는 메소드 형식으로 값을 바꿔줬지만 생성자를 통해 바꿀수도 있지 않을까? 또, 어댑터 패턴은 비슷한 패턴이 굉장히 많다.

 

비슷한 역할을 하는 것 같은 브릿지 패턴, 

다중 어댑터 느낌이나는 퍼사드 패턴,  (그러니까 변환 해주는게 여러개라는 뜻)

또, 데코레이터 패턴도 비슷하다고 하는데 기억이 나지 않는다. 물론 비슷할 뿐이지, 하는 역할은 완전히 다르다. 이점 유의해서 공부하면 더 좋을 것같다. 

 

반응형

'디자인패턴' 카테고리의 다른 글

데코레이터 패턴  (0) 2020.05.02
컴포지트 패턴  (0) 2020.05.01
옵저버 패턴  (0) 2020.04.28
퍼사드 패턴  (0) 2020.04.23
브릿지 패턴  (0) 2020.04.22

댓글

Designed by JB FACTORY