100%를 한번에 바꾸는건 어려워도 1%를 100번 바꾸는건 쉽다.

생각정리 자세히보기

컴퓨터공학/디자인패턴

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

dc-choi 2023. 1. 3. 16:31
반응형

개요

디자인 패턴이란?

소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 해결책이며 미리 만들어진 청사진입니다. 즉, 디자인 패턴은 모호하고 복잡한 개념이 아닌 일반적인 문제들에 대한 해결책입니다.

 

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

 

알고리즘과 다른점?

알고리즘과 자주 혼동되는데 두 개념 모두 알려진 문제에 대한 일반적인 해결책을 설명하기 때문인데요. 차이점이 있다면 알고리즘어떤 목표를 달성하기 위해 따라야하는 일련의 절차를 정의하고 디자인 패턴해결책에 대한 더 상위 수준입니다. 같은 패턴을 두 개의 프로젝트에 적용하면 두 프로젝트안에서의 코드는 다릅니다.

쉽게 말하면 알고리즘요리법이고, 디자인 패턴청사진입니다.

다만 두개의 차이점에 대해서 말을 하자면, 알고리즘의 경우 목표를 달성하기 위한 명확한 단계들이 제시된 것이고, 디자인 패턴의 경우 결과와 기능들은 제시하나 구현 단계 및 순서는 사용자가 결정하게 된다는 것이 차이점입니다.

 

디자인 패턴은 GOF에서 시작을 해서 객체 지향 프로그래밍을 지향하는 패턴이 많았으나, 이러한 패턴 접근법이 다른 프로그래밍 분야에서도 인기를 얻으면서 이제는 다른 디자인 패턴도 존재하게 되었습니다.

 

왜 배워야하나?

디자인 패턴은 일반적인 문제들에 대해 시도되고 검증된 해결책들을 모은 것입니다. 현실의 문제를 다루게 될 때 검증된 해결책을 이용해 문제를 해결할 수 있습니다. 또한 패턴을 배우게 되면 객체 지향 디자인의 원칙들을 사용해 많은 종류의 문제를 해결하는 방법들을 배울 수 있습니다.

더 효율적으로 의사소통하는 데 사용할 수 있는 용어를 정의합니다. 예를 들어 팀 동료가 디자인 패턴을 이해하면 업무 처리 중 "싱글턴을 사용하면 될 거 같아요"라고 말하면 모두 당신이 무엇을 뜻했는지 이해할 수 있을 것이며 싱글턴 패턴에 포함된 개념들은 설명할 필요가 없어집니다.

 

비판의 목소리

그러나 많은 사람들이 디자인 패턴에 대해 비판하고 있습니다. 이들이 주장하는 패턴을 사용하지 말아야 할 이유를 서술합니다.

 

1. 클루지로 작동함

일반적으로 패턴의 필요성은 개발자가 추상화 수준이 부족한 프로그래밍 언어나 기술을 선택했을 때 발생합니다. 이 경우 패턴은 프로그래밍 언어에 필요한 클루지로 작동합니다. 예를 들어 전략 패턴은 대부분의 최신 프로그래밍 언어에서 간단한 람다 함수로 구현할 수 있습니다.

 

클루지란? 어떤 문제에 대한 서툴거나 세련되지 않은 해결책.

 

2.비효율적인 해결책

디자인 패턴은 이미 널리 사용되는 문제 해결 방식의 체계화를 시도하였습니다. 많은 사람이 이렇게 통합된 패턴들을 도그마처럼 신봉하여 디자인 패턴을 프로젝트의 맥락에 따라 적용하지 않고 문자 그대로 "구현"하게 됩니다.

 

3. 부당한 사용

많은 초보자는 패턴을 익힌 후, 더 간단한 코드로도 문제 해결이 되는 상황에도 모든 곳에 패턴을 적용하려고 합니다. 이것은 최근에 패턴에 익숙해진 많은 초보자들을 괴롭히는 문제입니다.

 

패턴의 분류

보통 복잡성, 상세도 및 설계 중인 전체 시스템에 대한 적용 범위에 따라 분류됩니다.

 

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

 

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

 

또한 모든 패턴은 패턴의 의도 또는 목적에 따라 구분할 수 있습니다.

 

생성 패턴

기존 코드의 재활용과 유연성을 증가시키는 객체 생성 메커니즘들을 제공합니다.

EX) Factory, Builder

 

구조 패턴

구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합합니다.

EX) Adapter, Decorator, Proxy

 

행동 패턴

객체 간의 효과적인 의사소통과 책임 할당을 처리합니다.

EX) Observer, Strategy, State, Template, Iterator

반응형