본문 바로가기

개발세발/Design pattern

디자인 패턴


소프트웨어 개발 방법에서 사용되는 디자인 패턴은, 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다. -위키피디아

말이 어렵다.
여러 백과사전 위키중에 위키피디아(위키백과)가 가장 말을 어렵고 정확하게 써놓는다.

소프트웨어를 개발하다보면 자연히 규모가 커질 것이고, 그 큰 소스코드들을 지속적으로 관리하고 효율적으로 개발하려면 코드 구조를 잘 설계해야된다. 스스로 코드 구조를 설계해도 좋지만 이미 세상에는 여러 사람들이 개발하면서 쌓은 설계 노하우를 정리하여 모아놓은 패턴이 있다. 이거를 디자인 패턴이라고 한다. 디자인 패턴은 소프트웨어의 '설계'에 들어가기 때문에 어떤 언어에 적용되는 그런 것이 아니다(언어마다 구현 방식이 다를 수는 있다).

좀 더 간단하게 말하자면, 예를 들어 C언어에서 두 변수의 값을 교체(swap)하는 방법 중 가장 흔하게 아는 방법은 아래와 같다.

int a = 10;
int b = 20;
int tmp;
//a: 10, b: 20

tmp = a;
a = b;
b = tmp;
//a: 20, b: 10

그리고, C언어에서 어떤 수의 1의 자리를 버리는 방법중 가장 흔한 방법은 아래와 같다.

int num = 1234;
//num: 1234

num = num / 10;
num = num * 10;
//num: 1230

이런 식으로, 어떤 복잡한 것을 구현하기 위해 통상 사용하는 규칙이나 방법같은게 있다. 이거를 소프트웨어 설계에 적용한 것이 디자인 패턴이다. (위에 두 코드는 디자인 패턴은 아니고 그냥 흔히 쓰는 방법)

디자인 패턴을 꼭 소프트웨어 개발에 적용할 필요는 없지만, 혼자 개발하는 것이 아닌 여럿이 개발하는 소프트웨어라면 당연히 개발 멤버들간에 정형화된 어떠한 규칙이 필요할 것이고, 가장 무난하게 쓰이는 것이 디자인 패턴이다. 뿐만 아니라 혼자 개발할 때에도 디자인패턴을 알아놓으면 소스코드의 구조를 파악하기가 쉬워지고, 특정 상황에서 문제 해결을 도와줄 것이므로 앵간하면 알아놓는 것이 좋다.

어쩌면 디자인패턴을 모르는 사람도 자신도 모르게 한두가지의 디자인패턴을 사용하고 있을 수 있다. 언어에서 문법적이나 API로 제공되는 것이 아닌 말 그대로 설계 규칙이기 때문이다.

디자인 패턴은 그 종류가 꽤 많은데, 대체적으로 24개정도를 많이 사용하는 것 같다. 위에서 언급했다시피 언어에 따라 디자인 패턴을 구현하는 방법이 다를 수 있다. (예를 들어 Observer패턴은 보통 Interface를 통해 구현하지만, Java는 util.Observable이 있고 C#엔 Events와 Delegate가 있어서 각자의 방법으로 구현할 수도 있다.)


디자인패턴은 알아놓으면 상당히 난감한 상황들을 상당히 간결하게 해결해 줄 수 있기 때문에 처음 만들 때 구조만 잘 짜서 적용하면 나중에 편해진다. 그래서 정리를 한번 해보려고 한다.

사실 인터넷에서 조금만 찾아보면 디자인패턴에 대해 정리가 아주 잘 되어있는데, 이게 원래 컴퓨터하는 사람들은 일부러 글을 어렵게 쓰는건지, 본인만의 세계가 있는건지, 아니면 내가 멍청한건지는 모르겠지만 한번에 잘 이해가 안됐다. 다들 클래스 다이어그램을 막 열심히 그리고 한두문단에 이어 코드하나 올려놓고 설명이 끝나버리는데, 사실 이런식의 설명은 매우 정확하고 이런 식의 설명을 읽고 이해하는 능력도 중요하다. 그런데 나는 아직 잘 안된다. 그래서 나도 공부할겸 나의 방식대로 내가 이해한 디자인패턴에 대해 글을 써보려고 한다. 가장 좋은 공부는 남에게 내가 아는 것을 설명하는 것이라고 하더라. 디자인 패턴이 뭔지 전혀 모르는 사람이, 디자인은 예체능 아니었나 생각이 드는 사람이 보고 이해할 수 있도록 쉽게 써보려고 한다(그래야 내가 나중에 다시 보고 이해함..)

한국식 단어를 최대한 안쓰려고 한다. 얘를 들면 'Observer패턴'은 '관찰자 패턴' 또는 '감시자 패턴'정도로 번역이 되는데, 번역해놓고 보면 뭔소린지 모르겠다. (거의 스타2가 처음 나왔을 때 드라군이 용기병이 된 느낌이다) 가급적이면 알파벳을 쓰겠지만 한글을 사용하더라도 완역이 아닌 음역으로 하려고한다.

'개발세발 > Design pattern' 카테고리의 다른 글

Observer 패턴  (2) 2017.10.09
디자인 패턴  (0) 2017.10.09