객체 지향 설계와 디자인 패턴: 핵심 정리
소프트웨어 개발에서 객체 지향 설계(OOD, Object-Oriented Design)는 단순히 현재의 문제를 해결하는 것을 넘어 재사용성과 확장성을 고려한 설계가 핵심임. 이를 실현하기 위해 숙련된 개발자들이 반복적으로 마주한 문제와 그 해법을 정리한 것이 바로 디자인 패턴(Design Pattern) 임.
어떤 상황에 대한 문제가 동일하게 발생했을 때 같은 방법으로 해결할 수 있다? -> 디자인 패턴
디자인 패턴의 정의
디자인 패턴은 특정한 상황에서 반복적으로 발생하는 문제를 해결하기 위한 설계의 핵심 아이디어를 제공함. 이는 특정 코드 구현이 아닌, 구조적 설계 템플릿으로 이해할 수 있음.
디자인 패턴의 구성 요소
- 이름(Name) : 패턴의 명칭. 설계 의사소통을 간결하게 함.
- 문제(Problem) : 패턴이 해결하고자 하는 문제 및 발생 맥락.
- 해법(Solution) : 설계를 구성하는 클래스와 객체 간 관계를 정의.
- 결과(Consequences) : 패턴 적용 시 기대되는 결과와 트레이드오프.
일단 이 책에서 뭔가 디자인 패턴에 대한 이야기를 할 때, 이 4가지 구성요소를 생각하며 보면 뭔가 다르게 보이지 않을까?
디자인 패턴의 분류
-
생성(Creational) 패턴: 객체 생성 과정을 캡슐화하여 객체 생성을 유연하게 설계함.
- 예: Factory Method, Singleton
-
구조(Structural) 패턴: 클래스와 객체를 결합해 더 큰 구조를 형성함.
- 예: Adapter, Decorator
-
행동(Behavioral) 패턴: 객체 간의 책임 분배와 상호작용 방식을 정의함.
- 예: Observer, Strategy
어쨌든 디자인 패턴은 객체 지향 관점에서의 패턴들이니까, 객체 지향적인 사고도 함께 가져가야 한다. 내가 마주한 문제가 어떤 패턴에 속하는지 판단하는 게 패턴 적용의 첫번째일듯
분류 기준
첫번째는 목적 (생성/구조/행동)
두번째는 범위 (클래스/객체)
- 클래스 : 클래스 간의 관계를 다룸. 주로 상속을 통해 클래스 간의 정적인 관계를 정의
- 객체 : 객체 간의 관계를 다룸. 주로 합성을 통해 객체 간의 동적인 관계를 정의
패턴 간 참조관계는 일단 넘어가야겠다 (언젠간 완전히 이해하겠지)
디자인 패턴을 사용하는 이유
- 재사용성 향상 : 검증된 설계 패턴을 재사용해 생산성과 품질을 높임.
- 설계 의도 명확화 : 클래스와 객체 간의 상호작용을 명확히 정의함.
- 유지보수 용이 : 변경 가능한 요소를 캡슐화해 코드 변경 비용을 감소시킴.
디자인 패턴으로 문제를 푸는 방법
-
적절한 객체와 인터페이스 설계
- 객체의 크기와 역할을 정의하고, 인터페이스를 기반으로 다형성을 설계함.
- 예: Dynamic Binding(동적 바인딩)과 Polymorphism(다형성) 활용.
-
구현과 인터페이스 분리
- 구현에 의존하지 않고 인터페이스에 의존하는 설계를 지향함.
- 예: 구체 클래스 대신 추상 클래스나 인터페이스 사용.
-
상속보다 합성 활용
- 상속 대신 객체 합성을 통해 유연성을 높이고 캡슐화를 유지함.
- 예: 위임(Delegation) 패턴.
1.6 디자인 패턴을 이용하여 문제를 푸는 방법을 쭉 읽어보니 머릿속에 하나 들었던 생각은 "결국 객체 지향적인 사고와 적절한 추상화를 통해 유연함을 가져오는 것을 설계하는 것이구나." 였다.
디자인 패턴을 고르는 방법
- 문제를 정의 : 해결하려는 문제가 무엇인지 명확히 파악함.
- 패턴의 의도 확인 : 각 패턴의 목적과 상황을 비교해 적합성을 평가함.
- 패턴 간 관계 탐구 : 서로 관련된 패턴(대체 가능, 함께 사용 가능 등)을 고려함.
- 비슷한 패턴을 모아 학습 : 패턴들 간 유사점과 참이점을 이해함.
- 재설계 원인 파악 : 재설계 원인과 해결을 위한 패턴을 이해함.
- 가변성 설계 : 변화가 예상되는 요소를 캡슐화하여 재설계 비용을 줄임.
결론
디자인 패턴은 소프트웨어 설계의 표준화된 해법으로, 복잡한 설계를 단순화하고 코드의 품질과 유지보수성을 높이는 데 필수적임. 패턴을 올바르게 적용하면 더 유연하고 확장 가능한 소프트웨어를 설계할 수 있음.
추상화가 왜 필요할까? 협업을 하고 프로젝트를 구현하는데에 추상화는 어떤 도움을 줄까?