프로그램 아키텍쳐/디자인패턴

디자인 패턴(Design Patterns)이란

본클라쓰 2009. 8. 27. 09:51

 

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

 

 

체를 작성하는 코드에 관심을 두는 것이 아니라 객체 자체의 구조에 관심을 가지고 복잡한 객체간의 관계를 쉽게 정의하기 위한 방법론이고 코드의 재사용성을 추구한 개념이다.

 

어떻게 보면 디자인 패턴은 주어진 문제를 해결하는 방법을 나타낸 알고리즘과 비슷한 것 같지만 해결하고자 하는 문제가 다르다. 알고리즘은 어떤 문제에 대한 가장 효율적인 해결 절차를 찾는 것이지만, 디자인 패턴은 상황에 따른 객체들 간의 관계를 정의하는 방법을 찾는 것이다.

 

 

디자인 패턴은 Erich Gamma, Richard Helm,, John Wissides, Ralph Johnson 네 명의 저자들이 쓴 "Design patterns: Elements of Reusable Object-Oriented Software" 란 책에서 '생성, 구조, 행위'로 구분하고 각 상황에 따른 객체 설계 방법을 설명하고 있다. 위 네명의 저자들은 GoF(Gang of Four)라 불리며 C# 언어를 사용한 디자인 패턴을 설명하고 있다.

 

디자인 패턴에서 설명하는 것은 객체 지향 프로그래밍에서 객체들 간의 관계이다. 따라서 객체 내부의 메소드들이 어떻게 구현되어 있는가 보다 메서드는 이런 일을 하게 된다는 성격만 규정하고 객체들 간의 관계에 초점을 맞춘 방법론이다. 즉, 전체적인 관점에서 상황에 따른 객체 설계 방법을 설명한다.

 

디자인 패턴을 배우면 좋은 점은 객체지향 프로그래밍에서 GUI 프로그램을 만드는 유연한 방법과 코드의 재사용성에 대해 논하고 있기 때문이다. Java 언어를 사용하여 웹 어플리케이션을 제작한다면 생성 패턴과 행위 패턴 두 종류만 알아도 충분하고 생각되지만 일반적인 어플리케이션을 제작하기 위해서는 모든 패턴의 종류와 특성을 알고 있는 것이 좋다.

 

디자인 패턴에서 이야기하는 가장 큰 설계 원칙은 유연성이다.

 

객체들간의 의존성을 최소화시켜 객체들간의 변화에 서로 영향을 덜 받게 하는 것이다. 이 때 사용되는 객체 설계 방법은 객체 특성을 인터페이스를 사용하여 정의하고, 세부 사항은 구현을 통해 객체를 설계하는 방법을 사용한다. 즉, 변하지 않는 부분은 인터페이스에 정의한 후 인터페이스를 구현하는 객체는 세부적으로 변화하는 부분을 정의하여 전체적으로 변화하지 않는 부분과 변화는 부분을 나누어 객체를 구현한다.

 

이와 함께 다음과 같은 원칙을 가지고 있다.

 

'바뀌는 부분을 캡슐화한다.'

'상속보다는 구성을 활용한다.'

'구현이 아닌 인터페이스에 맞춰 프로그래밍한다.'

'서로 상호 작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.'

'클래스 확장에 대해서는 열려 있지만 변경에 대해서는 닫혀 있어야 한다.'

'OCP(open closed principle)는 가장 중요한 원칙이다.'

'추상화 된 것에 의존하라.'

'친한 친구들하고 이야기 하라.'

'어떤 클래스가 바귀게 되는 이유는 한 가지 뿐이어야 한다.'

 

 

디자인 패턴에서는 어플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분에서 분리시킨다. 상속은 코드의 재사용성을 좋아지게 할 수 있지만 상속은 원하지 않는 부분까지 상속되는 단점도 있다. 따라서 상속보다는 객체를 정의한 인터페이스를 구현하는 방법에 초점을 맞춘다.

 

도한, 느슨한 결합이라 한 클래스가 변해도 결합된 클래스에 미치는 작용이 최소화되는 것을 말하며, 클래스 확장에 대해서는 열려 있지만 변경에 대해서는 닫혀 있어야 한다. OCP는 클래스 확장에는 열려 있지만 코드 변경에 대해서는 닫혀 있는 것을 말한다.

 

"원칙은 원칙일 뿐 목적이나 법칙이 아닙니다."

  

디자인 패턴 관련 사이트 : http://www.patterndepot.com/put/8/JavaPatterns.htm