#1_GoF 의 Java Design Pattern / 자바 디자인패턴

Young·2021년 8월 8일
0

Java

목록 보기
1/1

디자인패턴


오늘은 자바의 디자인 패턴에 대해 다뤄보고자 한다.
디자인 패턴이란 무엇일까? 지식백과에서는 이렇게 설명하고 있다.

에릭 감마(Erich Gamma), 리처드 헬름(Richard Helm), 랄프 존슨(Ralph Johnson), 존 블리시데스(John Vlissides)가 제안한 GoF(Gang of Four)의 디자인 패턴이다. 객체지향 개념에 따른 설계 중 재사용할 경우 유용한 설계를 디자인 패턴으로 정립한 것이다. 여기서 디자인 패턴이란 여러 가지 문제에 대한 설계 사례를 분석하여 서로 비슷한 문제를 해결하기 위한 설계들을 분류하고, 각 문제 유형별로 가장 적합한 설계를 일반화해 패턴으로 정립한 것을 의미한다.
[네이버 지식백과] Gof 디자인 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 김치수)

즉, 디자인 패턴은 자주 사용하는 설계 형태를 정형화해서 이를 유형별로 설계 템플릿을 만들어둔 것을 말한다. 객체지향 언어를 이용해 프로그래밍 할 때 디자인 패턴을 사용한다면 보다 효율적이고 재사용성이 높은 설계를 할 수 있다. 이에따른 유지보수가 용이해지고 객체의 생성과 참조 과정을 추상화하여 개발 시 부담을 줄여줄 수 있다.

디자인 패턴의 종류

디자인 패턴의 종류에는 어떤 것이 있을까?
Gang of Four(이하 GoF)가 정의하는 디자인 패턴에는 총 23가지가 있다.
(*숫자는 순서와 상관 없음)

  • 생성 패턴
    • 객체를 생성하는 것과 관련된 패턴으로 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화 하도록 만들어준다.

    • 그 결과 유연성을 높일 수 있고 코드를 유지하기 쉬운 편, 객체의 생성과 참조 과정을 추상화하여 시스템 개발 시 부담을 덜어준다.

      1. Factory Method : 생성할 객체의 클래스를 국한하지 않고 객체를 생성한다.
       2. Singleton : 한 클래스에 한 객체만 존재하도록 제한한다.
       3. Prototype : 기존 객체를 복제함으로써 객체를 생성한다.
       4. Builder : 생성(Construction)과 표기(Representation)를 분리해 복잡한 객체를 생성한다.
       5. Abstraction Factory : 동일한 주제의 다른 팩토리를 묶어준다.



  • 구조 패턴
    • 프로그램 내의 자료구저나 인터페이스 구조 등 프로그램의 구조를 설계하는데 많이 활용 클래스나 객체들의 구성을 통해 더 큰 구조로 만들 수 있게 해준다.

    • 규모가 크고 복잡한 시스템을 개발하기 쉽게 만들어주는 패턴이 구조 패턴이다.

    • 따라서 구조 패턴을 이용하면 새로운 기능을 가진 복합 객체를 효과적으로 작성 할 수 있다.

      6. Adapter : 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.
       7. Composite : 0개, 1개 혹은 그 이상의 객체를 묶어 하나의 객체로 이용할 수 있다.
       8. Bridge : 추상화와 구현을 분리해 둘을 각자 독립적으로 변형할 수 있게 하는 패턴이다.
       9. Decorator : 기존 객체의 메서드에 새로운 행동을 추가하거나 Override 할 수 있다.
       10. Facade : 많은 분량의 코드에 접근할 수 있는 단순한 인터페이스를 제공한다.
       11. Flyweight : 다수의 유사한 객체를 생성, 조작하는 비용을 절감할 수 있다.
       12. Proxy : 접근 조절, 비용 절감, 복잡도 감소를 위해 접근이 힘든 객체에 대한 대역을 제공한다.



  • 행위 패턴

    • 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 정의

    • 여러 가지 행위 관련 패턴을 사용하여 독립적으로 일을 처리하게 해준다.

    • 행위 패턴은 메세지 교환과 관련된 것으로, 객체들 간의 행위나 알고리즘 등과 관련된 패턴을 말한다.

      13. Template Method : 상위 클래스에서는 추상적으로 표현하고 그 구체적인 내용은 하위 클래스에서 결정되는 패턴.
       14. Interpreter : 문법 규칙을 클래스화하여 언어를 해석하고 정의하는 패턴.
       15. Iterator : 반복이 필요한 자료구조를 모두 동일한 인터페이스를 통해 접근 할 수 있도록하여 컨테이너의 요소들에 접근한다.
       16. Observer : 어떤 클래스에 변화가 일어났을 때, 이를 감지하여 다른 클래스에 통보해준다.
       17. Strategy : 알고리즘 군을 정의하고 각각 캡슐화하여 서로 교환하여 사용할 수 있게 해준다.
       18. Visitor : 각 클래스의 데이터 구조로부터 처리 기능을 분리하여 별도의 클래스로 만들고 이 클래스의 메소드가 각 클래스를 다니며 특정 작업을 수행한다.
       19. Chain of Responsibility : 책임들이 연결되어 있어 해당 부분에서 처리가 불가능하면 다음으로 넘어가는 구조.
       20. Command : 명령어를 각각 구현하는 것이 아닌 하나의 추상 클래스에 메소드를 하나 만들고 각 명령이 들어오면 그에 맞는 서브 클랙스가 선택되어 실행하는 구조.
       21. Mediator : 클래스간의 복잡한 상호작용을 캡술화하여 한 클래스에 위임해서 처리하는 디자인 패턴.
       22. State : 동일한 동작을 객체의 상태에 따라 다르게 처리해야 할 때 사용
       23. Memento : undo 기능과 같은 기능을 개발할 때 사용하며, 클래스 설계 관점에서 객체의 정보를 저장할 필요가 있을 때 사용.

디자인 패턴의 장점

  • 개발자(설계자) 간의 원활한 의사소통 : 설계자들은 디자인 패턴이라는 서로간의 공통적인 기본 틀을 이해하고 있기 때문에 문제 해결을 위한 대화를 나눌 때 보다 원활한 의사소통이 가능하고 이로부터 해결책을 논의할 수 있다.

  • 소프트웨어 구조 파악 용이 : 개발자들은 디자인 패턴의 특성을 알고있기 때문에 어떤 디자인이 설계 시 사용되었는지를 안다면 전체적인 구조를 파악하는데에 용이하다

  • 재사용을 통한 개발 시간 단축 : 이미 만들어놓은 디자인 패턴을 사용하므로 처음부터 만들어야하는 수고를 덜고 설계시 의사소통 및 구조설계에 용이하기 때문에 개발 시간을 줄일 수 있다.

  • 설계 변경 요청에 대한 유연한 대처 : 사용자의 지속적인 기능 추가 요청, 환경 변화 등의 여러 가지 이유로 설계를 변경해야 할 때가 많다. 이때 디자인 패턴을 사용하여 설계하였다면 내용의 변경과 참조 등에 쉽고 빠르게 대처할 수 있으며 유지보수가 용이하게 된다.

디자인 패턴의 단점

  • 객체지향 설계/ 구현 위주 : 디자인 패턴은 객체지향 설계/ 구현에 많이 사용된다. 다른 언어에서 사용할 경우 오히려 더 복잡해질 수 있다.

  • 초기 투자 비용 부담 : 디자인 패턴을 적용하요 설계하면 패턴을 사용하지 않는 경우보다 초기에 시간과 노력이 많이 필요하다.






마치며

이렇게 디자인 패턴에 대해서 알아보았다. 디자인 패턴은 굉장히 방대하기 때문에 이제 시작하는 코린이인 내가 완벽하게 설명할 수는 없지만 핵심들을 설명하고자 하였다. 이 패턴들이 어떻게 작동하는지는 각각 테스트 코드들을 작성해서 살펴보면 보다 이해가 잘 될거 같다.
여유가 된다면 책을 정독 해보는 방법도 있으니 능력있는 개발자가 되기 위해서는 읽어봐야겠다.

profile
백엔드를 꿈꾸는 작디작은 개린이 입니다 :)

0개의 댓글