티스토리 뷰

Java

디자인 패턴의 종류 (어댑터 패턴)

hodumarustory 2024. 8. 12. 20:25

디자인 패턴이란???

 

디자인 패턴은 개발을 하면서 발생하는 반복적으로 자주 발생하는 문제들을 해결하는

방식을 규칙적으로 만든 것이라고 볼수있다

.

디자인 패턴을 요리에 비유해보면 객체지향의 4대원칙(캡슐화,상속,추상화,다형성)을

요리도구라고 보면 설계 원칙(SOLID)를 요리도구의 사용법 그리고 디자인 패턴을

요리 레시피라고 볼수있다.

어떤 메뉴의 고정적인 레시피가 있는것 처럼 개발할때에도 특정상황에서 어떻게 해결하면 좋을지 만들어놓은 레시피를

디자인 패턴이라고 볼수있다.

 

디자인 패턴은 실제 개발 현장에서 비즈니스 요구 사항들을 프로그래밍으로 처리하면서 만들어진

다양한 해결책중에 많은 사람들이 인정한 방법들을 정리한것이라고 볼수있다.

 

그렇다면 디자인 패턴중에 하나인 어댑터 패턴(Adeapter Pattern)에대해 설명해보겠습니다.

어댑터라는 단어를 번역하면 변환기(converter)라고 할수있다. 변환기의 역할은 서로다른

두 인터페이스 사이에 통신이 가능하게 해주는 것이다.

 

데이터베이스 관련 프로그램을 작성해본 사람이라면 다양한 데이터 베이스 시스템을 공통의 인터페이스를 ODBC또는 JDBC를 이용해 조작할 수 있다는 사실을 알것이다.

 

ODBC/JDBC가 어댑터 패턴을 이용해서 다양한 데이터베이스 시스템을 단일한 인터페이스로 조작할수있게

해주기 때문이다. 자바 언어의 구조를 살펴보면서 플랫폼별 JRE도 어댑터 패턴이라고 볼수있다.

 

JDBC와 JRE는 SOLID에서 공부한 개방 폐쇄 원칙(OCP)를 설명할때 예로 들었던 내용이다.

 

결국 앞서 설명했던 개방 폐쇄 원칙을 활용한 설계 패턴이 어탭터 패턴이라고 볼수있다.

 

어댑터 패턴이 적용되지 않은 예시를 코드로 보여주면

public class ServiceA {

  void runServiceA() {

         System.out.print("ServiceA")

  }

}

public class ServiceB {

  void runServiceB() {

         System.out.print("ServiceB")

  }

}

public class ClientWithNoAdapter {

 public static void main(String[] args) {

            ServiceA sa1 = new ServiceA();

            ServiceB sb1 = new ServiceB();

            sa1.runServiceA();

            sb1.runServiceB();

  }

}

위코드에서 main()메서드를 살펴보면 참조변수 sa1과 sb1이 각자의 메서드를 호출하는 비슷한 일을 하지만

메서드명이  다른것을 볼수있다.

 

이번에는 어댑터 패턴이 적용된 코드를 작성해 보겠습니다.

 

public class AdapterServiceA {

  ServiceA sa1 = new ServiceA();

  void runService() {

        sa1.runServiceA();

  }

}

public class AdapterServiceB {

  ServiceB sb1 = new ServiceB();

  void runService() {

        sb1.runServiceB();

  }

}

public class ClientWithNoAdapter {

 public static void main(String\[\] args) {

            AdapterServiceA  asa1 = new AdapterServiceA  ();

            AdapterServiceB  asb1 = new AdapterServiceB  ();

            asa1.runService();

            asb1.runService();

  }

}

 

위의 코드를 보면 처음 작성한 main()메서드와 다르게 참조변수가 같은 이름의 메서드를 호출하는것을 볼수있다.

 

어댑터 패턴은 합성, 즉 객체를 속성으로 만들어서 참조하는 디자인 패턴으로, 한 문장으로 정리하면 

다음과 같이 설명할수있다.

 

" 호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴"

 

마지막으로 인터페이스를 끼고 어댑터 패턴에대해 코드로 작성해 보여드리겠습니다.

 

Animal이라는 인터페이스에 sound라는 추상 메서드가 있습니다.

public interface Animal {
    void sound();
}

 

 Dog라는 클래스에 Animal인터페이스를 implements시켜서 sound()메서드를 오버라이딩 시켜주고

public class Dog implements Animal {


    @Override
    public void sound() {
        System.out.println("강아지는 멍멍");
    }
}

 

Cat클래스에도 똑같이 implements와 오버라이딩을 해줍니다.

public class Cat implements Animal{
    @Override
    public void sound() {
        System.out.println("고양이는 야옹");
    }
}

 

Tiger클래스는 implements를 받지않았는데 어떻게 사용해야할까요 ??

이제 새로운 Tiger라는 클래스를 만들었지만 변경이 불가능하다는 가정을해보고 어댑터 패턴을 사용해 보겠습니다.

public class Tiger {

    public void Aheng() {
        System.out.println("호랑이는 어흥");
    }
}

 

우선 AdapterTiger라는 클래스를 생성후에 implements와 오버라이딩을 해주고 AdapterTiger클래스 내부에

Tiger객체를 생성후에 오버라이딩된 sound()메서드에서  Tiger에 메서드인 roar()메서드를 호출시켜줍니다.

 

public class AdapterTiger implements Animal{

    Tiger tiger = new Tiger();


    @Override
    public void sound() {
        tiger.roar();
    }
}

 

 

그리고 사용자 클래스인 User클래스에서 다음과 같이 사용할수있는걸 볼수있습니다.

 

public class User {

    public static void main(String[] args) {


        Animal dog = new Dog();
        Animal cat = new Cat();
        Animal tiger = new AdapterTiger();


        dog.sound();
        cat.sound();
        tiger.sound();

    }
}

 

'Java' 카테고리의 다른 글

Primitive Type의 종류와 범위 기본값은?  (0) 2024.08.19
디자인 패턴 (프록시 패턴) 미완성  (0) 2024.08.13
super키워드  (0) 2024.07.17
this키워드  (0) 2024.07.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함