객체지향 소프트웨어를 잘 설계 한다는것은 쉬운 일이 아니다
게다가, 재사용 할 수 있는 객체지향 소프트 웨어를 만드는것이 더 힘들다
이를 위해 설계할 때 고려할 사항으로 SOLID 원칙 등 객체 지향적 소프트 웨어 설계 방법론이 있다.
디자인 패턴은 설계자로 하여금 재사용이 가능한 설계는 선택하고, 재사용을 방해하는 설계는 배제하도록 도와줍니다. 또한 패턴을 쓰면 이미 만든 시스템의 유지보수나 문서화도 개선할 수 있고, 클래스의 명세도 정확하게 할 수 있으며, 객체 간의 상호작용 또는 설계 의도까지 명확하게 정의할 수 있습니다.
소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제에 대해 자주 쓰이는 설계 방법을 정리한 패턴
간단하게 말해서 디자인 패턴은 올바른 설계를 빨리 만들 수 있도록 도와준다.
1. 서로 같은 패턴을 알고 있을 때의 효율이 좋다.
다른 개발자나 같은 팀에 있는 사람과 패턴으로 의사소통하면 패턴 이름과 그 패턴에 담겨있는 모든 내용, 특성, 제약 조건 등을 함께 바로 이야기 할 수 있습니다.
2. 패턴을 사용하면 간단한 언어로 많은 얘기를 할 수 있습니다.
뭔가를 설명할 때 패턴을 사용하면 내가 생각하고 있는 디자인을 다른 개발자가 빠르고 정확하게 파악할 수 있습니다.
1 ~ 2번 장점의 예를 들면, "오리들의 다양한 행동을 전략 패턴으로 구현하고 있습니다"라고 얘기한다면 이는 오리의 행동들을 쉽게 확장하거나 변경할 수 있는 클래스들의 집합으로 캡슐화되어 있다 라는 사실을 간단하게 한 문장으로 설명할 수 있는 것이죠.
3. 패턴 수준에서 이야기하면 '디자인'에 더 오랫동안 집중할 수 있습니다.
디자인 회의 중에 구현과 관련된 자질구레한 내용 때문에 논점이 빗나가 본 경험이 있으신가요? 소프트웨어 시스템을 이야기할 때 패턴을 사용하면 객체와 클래스를 구현하는 것과 자질구레한 내용에 시간을 버릴 필요가 없어서 디자인 수준에서 초점을 맞출 수 있습니다.
4. 전문용어를 사용하면 개발팀의 능력을 극대화할 수 있습니다.
디자인 패턴 용어를 모든 팀원이 잘 알고 있다면 오해의 소지가 줄어 작업을 빠르게 진행할 수 있습니다.
디자인 패턴계의 교과서로 불리는 [GoF의 디자인 패턴]에서는 객체지향적 디자인 패턴의 카테고리를 "생성 패턴(Creational Pattern)", "구조 패턴(Structural Pattern)", "행동 패턴(Behavioral Pattern)"3가지로 구분한다.
생성(Creational) 패턴
객체 생성에 관련된 패턴
객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.
구조(Structural) 패턴
클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
행위(Behavioral)
객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.
생성(Creational), 구조(Structural), 행동(Behavioral) 패턴이 각각 어떤 문제들을 해결하는지 파악합니다.
패턴들 간의 관련성을 파악합니다.
비슷한 목적의 패턴들을 모아서 함께 공부합니다.
예를 들어, 추상 팩토리 패턴을 공부했다면 이어서 팩토리 메소드 패턴을 학습해보고 각각 어떤 공통점과 차이점이 있는지 비교하여 헷갈리지 않게 정리해둡니다.
디자인 패턴이 익숙치 않은 초보 분들은 패턴을 공부할 때에는 반드시 예제 코드를 직접 작성해봅니다.
눈으로만 공부하는 것은 뒤돌아서면 까먹습니다. 다소 귀찮더라도 프로젝트에 적용한다는 생각으로 예제를 확실하게 이해하는 것이 중장기적으로 무조건 이롭습니다.