공부해봅시당

[디자인패턴] 디자인 패턴이란? 본문

STUDY/디자인 패턴

[디자인패턴] 디자인 패턴이란?

tngus 2023. 6. 5. 02:11

디자인 패턴이란?

디자인 패턴이란 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 일반적인 해결책들을 말한다.

이는 코드에서 반복적으로 되풀이되는 디자인 문제들을 해결하기 위해 맞춤화할 수 있는 청사진들을 미리 만들어 놓은 것과 같다.

 

디자인 패턴의 특징

  • 표준화된 라이브러리들이나 함수들을 코드에 복사해 사용하는 것처럼 패턴들을 붙여넣기식으로 사용할 수 없음
  • 패턴은 재사용할 수 있는 코드 조각이 아니라 특정 문제를 해결하는 방식을 알려주는 일반적인 개념
    • 패턴의 세부 개념들을 적용하여 프로그램에 맞는 해결책을 구현할 수 있음

 

디자인 패턴과 알고리즘의 차이

패턴은 알고리즘과 자주 혼동된다. 하지만 둘 사이의 명확한 차이가 존재한다.

 

공통점

두 개념 모두 알려진 문제에 대한 일반적인 해결책을 설명

 

차이점

알고리즘

  • 어떤 목표를 달성하기 위해 따라야 할 명확한 일련의 절차를 정의
  • 요리법에 비유 > 목표를 달성하기 위한 명확한 단계 제시

패턴

  • 해결책에 대한 더 상위 수준의 설명
    • 예를 들어 같은 패턴을 두 개의 다른 프로그램에 적용하면 두 프로그램의 코드는 다를 것
  • 청사진에 비유 > 결과와 기능들은 제시하나 구현 단계 및 순서는 사용자가 결정

 

디자인 패턴을 배워야 하는 이유

  • 디자인 패턴은 소프트웨어 디자인의 일반적인 문제들에 대해 시도되고 검증된 해결책들을 모은 것
    • 이러한 문제들을 다루지 않더라도 패턴을 알고 있으면 여전히 쓸모가 있는데, 그 이유는 패턴을 배우게 되면 객체 지향 디자인의 원칙들을 사용해 많은 종류의 문제를 해결하는 방법들을 배울 수 있기 때문
  • 디자인 패턴은 당신과 당신의 팀원들이 더 효율적으로 의사소통하는 데 사용할 수 있는 공통 언어를 정의
    • 예를 들어, 팀이 디자인 패턴을 이해하면 업무 처리 중 '그 문제를 위해서는 그냥 싱글턴을 사용하세요'라고 말하면 모두가 무엇을 뜻했는지 이해할 수 있을 것이며 싱글턴 패턴에 포함된 개념들은 설명할 필요도 없을 것

 

디자인 패턴에 대한 비판

하지만 디자인 패턴에 대한 비판도 존재한다. 아래는 디자인 패턴에 대한 비판이다.

  • 약한 프로그래밍 언어를 위한 클루지로 작동 
    • 일반적으로 패턴의 필요성은 개발자가 추상화 수준이 부족한 프로그래밍 언어나 기술을 선택했을 때 발생
    • 이 경우 패턴은 약한 프로그래밍 언어에 필요한 초능력을 부여하는 클루지(어떤 문제에 대한 서툴거나 세련되지 않은 -그러나 놀라울만큼 효과적인- 해결책)로 작동
    • 예를 들어 Strategy 패턴은 대부분의 최신 프로그래밍 언어에서 간단한 익명​(람다) 함수로 구현할 수 있음
  • 비효율적인 해결책
    • 패턴은 이미 널리 사용되는 문제 해결 방식의 체계화를 시도
    • 많은 사람이 이렇게 통합된 패턴들을 도그마처럼 신봉하여 패턴을 프로젝트의 맥락에 따라 적용하지 않고 '문자 그대로' 구현할 수 있음
  • 부당한 사용
    • 망치만 있으면 모든 것이 못처럼 보임
    • 많은 초보자는 패턴을 갓 배운 후, 더 간단한 코드로도 문제 해결이 되는 상황에도 모든 곳에 패턴을 적용하려고 함

 

디자인 패턴의 종류

디자인 패턴은 복잡성, 상세도, 전체 시스템에 대한 적용 범위에 따라 분류된다.

 

가장 기본적인 하위 설계 패턴을 '이디엄'이다. 일반적으로 이디엄은 단일 프로그래밍 언어에만 적용할 수 있다.

아키텍처 패턴은 상위 설계 패턴이며 가장 보편적으로 사용된다. 개발자들은 거의 모든 언어로 아키텍처 패턴들을 구현할 수 있으며 다른 패턴들과 달리 애플리케이션 전체의 구조​(아키텍처)​를 설계하는 데 사용할 수 있다.

 

또한 모든 패턴은 패턴의  또는 목적에 따라 분류할 수 있다. 여기서는 패턴의 주요 세 가지 그룹에 대해 다룰 것이다.

  • 생성 패턴
    • 기존 코드의 재활용과 유연성을 증가시키는 객체 생성 메커니즘 제공
    • 팩토리 메소드, 추상 팩토리, 빌더, 프로토타입, 싱글톤 등
  • 구조 패턴
    • 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법 설명
    • 어댑터, 브리지, 복합체, 데코레이터, 퍼사드, 플라이웨이트, 프록시 등
  • 행동 패턴
    • 객체 간의 효과적인 의사소통과 책임 할당 처리
    • 책임 연쇄, 커맨드, 반복자, 중재자, 메멘토, 옵저버, 상태, 전략, 템플릿 메소드, 비지터 등

 


참고 자료

https://refactoring.guru/ko/design-patterns

 

디자인 패턴들

 

refactoring.guru