Part 2 구조 패턴
- 어댑터 패턴
- 브리지 패턴
- 복합체 패턴
- 장식자 패턴
- 파사드 패턴
- 플라이웨이트 패턴
- 프록시 패턴
디자인 패턴은 크게 3개의 파트로 나뉘어 있습니다. 두 번째로 알아볼 패턴은 구조 패턴입니다. 구조 패턴에서는 객체를 확장하는 방법에 대해 알아봅니다.
확장
클래스는 하나의 책임(역할)으로 설계합니다. 하지만 하나의 책임만으로는 전체 기능을 구현할 수 없습니다.
단일 책임은 클래스의 행동을 분리하는 설계 원칙입니다. 여러 개로 분리된 책임과 행동은 서로 관계를 맺고 주어진 문제를 해결합니다. 객체지향 코드를 살펴보면 수많은 파일로 분리된 클래스가 있습니다. 다수의 클래스에 책임을 분산하고, 문제를 해결하기 위해 다시 분리된 책임들을 상호 결합합니다.
객체지향 개발은 클래스를 결합하여 더 큰 객체로 확장합니다. 구조 패턴(Structural Patterns)은 큰 구조의 객체를 형성하고 관리하는 방법에 대해 설명합니다. 그리고 객체를 확장하기 위해 클래스의 상속과 합성을 사용합니다.
구조 패턴은 상속의 단점을 개선하고, 합성을 통해 구조를 확장합니다. 구조 패턴은 생성 패턴과 달리 클래스 구조를 확장하기 위한 관점으로 설계된 패턴 모음입니다.
상속
상속은 객체지향 초창기 시절부터 나온 개념입니다. 초기에는 객체를 확장하기 위해 상속을 많이 이용했습니다. 상속을 이용하여 객체를 확장하면 상위 클래스에서 정의된 객체의 속성과 동작을 모두 포함하게 됩니다.
상속은 객체지향의 고유 특징으로, 정적인 결합을 통해 객체를 확장합니다. 하지만 정적인 상속 결합은 대형 프로그램을 개발하고 유연한 작업을 하는 데 한계가 있습니다.
상속은 모두 혼합된 구조입니다. 필요한 행위와 불필요한 행위도 모두 같이 존재합니다. 또한
상속의 강력한 결합력 때문에 빠르게 변화되는 현대사회에서 다양한 고객의 요청을 반영하여 코드를 유지 보수하기 힘들어졌습니다.
합성
상속 결합의 단점을 보완하기 위한 기법으로 객체 합성을 사용합니다. 합성이란 하나의 객체가 다른 객체를 포함하는 것을 말합니다.
대표적인 합성으로 복합 객체가 있습니다. 합성은 객체의 강한 의존 관계를 줄이고 유연한 객체 구조로 변경할 수 있습니다. 또한 실행 중에도 객체를 확장할 수 있습니다.
합성을 이용한 객체 확장은 자원을 보다 효율적으로 사용할 수 있게 합니다. 구조 패턴은 상속보다 합성을 통해 다양한 객체 확장 방법을 제안합니다.
패턴
구조 패턴은 크게 구조 클래스 패턴(structural class pattern)과 구조 객체 패턴(structural object pattern)으로 나눌 수 있습니다. 구조 클래스 패턴은 구조적 관계가 있는 객체들과의 작업을 정의합니다. 구조 패턴은 다음과 같이 7가지로 분류합니다.
어댑터 패턴
어댑터 패턴은 인터페이스를 추상화하여 서로 다른 인터페이스를 통일화합니다. 상속을 통한 어댑터와 합성을 통한 어댑터로 구분합니다.
브리지 패턴
개념과 추상을 구분하여 처리합니다. 또한 객체의 독립으로 확장과 변형이 가능합니다.
복합체 패턴
객체의 구조를 이용하여 객체를 확장합니다. 복합 객체는 트리 구조의 특징을 갖고 있습니다.
장식자 패턴
객체에 기능을 동적으로 추가합니다. 확장 시 객체에 새로운 책임을 부과할 수 있습니다. 재귀적 합성 방법을 응용하여 객체를 확장합니다.
파사드 패턴
파사드는 복잡한 객체의 구조와 접근을 간단하게 표현하는 방법입니다.
플라이웨이트 패턴
플라이웨이트 패턴은 객체를 공유합니다. 객체 공유를 통해 자원의 효율성과 공유된 객체의 일관성을 보장합니다.
프록시 패턴
객체의 접근을 제한할 수 있습니다. 객체를 액세스할 때 추가적인 책임을 부여하는 역할을 수행합니다.