정보처리기사 실시 - 구조패턴(디자인패턴)
정보처리기사 실기 디자인 패턴 중 구조패턴에 대해 알아볼게요.
2. 구조패턴
클래스 or 객체 조합으로 대규모 구조를 만드는 패턴
(1) 어댑터(Adapter) : 인터페이스 연결하여 함께 동작
어댑터 패턴은 호환되지 않는 두 개의 인터페이스를 연결하여 함께 동작할 수 있도록 해주는 디자인 패턴입니다.
예시
휴대전화 충전기는 원래 자국의 콘센트에 맞게 디자인되어 있으며, 이를 다른 나라의 콘센트에 직접 연결할 수 없습니다. 이때, 어댑터를 사용하여 휴대전화 충전기와 다른 나라의 콘센트를 호환시킬 수 있습니다.
즉, 자국의 휴대전화 충전기를 어댑터에 연결하고, 어댑터를 다른 나라의 콘센트에 연결함으로써 휴대전화 충전기와 콘센트를 맞추어줍니다. 이와 비슷하게 어댑터 패턴은 기존에 사용되던 클래스의 인터페이스와 다른 인터페이스를 가진 클래스를 함께 동작시킬 수 있도록 해줍니다.
(2) 브리지(Bridge) : 기능, 구현 분리하여 클래스 연결, 확장성 강화
브리지 패턴은 기능과 구현을 분리하여 클래스들을 연결하여 유연성과 확장성을 강화하는 디자인 패턴입니다.
예시
일반적으로 TV는 여러 기능을 가지고 있습니다. 채널을 변경하고 음량을 조절하며 전원을 켜고 끄는 등의 기능이 있습니다. 또한, TV를 원격으로 제어하기 위해 원격 제어기를 사용합니다.
이때, 브리지 패턴을 사용하여 TV와 원격 제어기의 기능을 분리할 수 있습니다. 즉, TV와 원격 제어기는 각각 다른 클래스로 구현되어 있으며, 브리지 패턴을 통해 이 두 개의 클래스를 연결하여 TV를 원격으로 제어할 수 있게 됩니다.
(3) 컴포지트(Composite) : 부분-전체 계층 구조 객체를 트리 구조로 표현, 동일한 인터페이스로 다룸
컴포지트 패턴은 객체들의 계층 구조를 트리 구조로 표현하고, 이들을 동일한 인터페이스로 다루어 유연성과 확장성을 강화하는 디자인 패턴입니다.
예시
조직도는 회사의 조직 구조를 트리 구조로 표현합니다. 회사는 부서(Department)와 개인(Employee)로 이루어져 있습니다. 부서는 다른 부서를 포함할 수 있으며, 개인은 부서에 속해있습니다.
이때, 컴포지트 패턴을 사용하여 부서와 개인을 동일한 인터페이스로 다루고, 부서는 다른 부서를, 개인은 부서에 속한 개인들을 가질 수 있습니다. 이렇게 하면 모든 부서와 개인을 하나의 트리 구조로 표현할 수 있습니다.
컴포지트 패턴은 이와 같이 객체들의 계층 구조를 표현할 때 유용합니다. 부분-전체 계층 구조를 갖는 객체들을 트리 구조로 표현하고, 이들을 동일한 인터페이스로 다룰 수 있게 합니다.
(4) 데코레이터(Decorator) : 객체에 동적으로 기능을 추가하고 조합
데코레이터 패턴은 객체에 동적으로 기능을 추가하고 조합하는 디자인 패턴으로, 코드의 유연성과 확장성을 높이는데에 유용합니다.
예시
커피숍에는 다양한 종류의 음료가 있습니다. 예를 들면, 아메리카노, 카페 라떼, 모카 등이 있습니다. 각 음료에는 기본적인 가격과 재료가 있습니다. 이때, 데코레이터 패턴을 사용하여 음료에 추가 옵션을 추가할 수 있습니다. 예를 들어, 설탕 추가, 휘핑 크림 추가와 같이 음료에 원하는 옵션을 더해 자유롭게 조합할 수 있습니다.
예를 들어, 아메리카노에 설탕 추가와 휘핑 크림 추가를 함께 선택할 수 있습니다. 이렇게 하면 기본적인 아메리카노에 원하는 옵션을 더해 커스텀 음료를 만들 수 있게 됩니다.
(5) 퍼사드(Facade) : 복잡한 서브시스템에 대해 단순화된 인터페이스 제공
파사드 패턴은 복잡한 서브시스템에 대해 단순화된 인터페이스를 제공하여 사용자에게 간편한 접근을 제공하는 디자인 패턴입니다.
예시
컴퓨터를 시작하려면 여러 단계가 필요합니다. 전원을 켜고, 부팅 프로세스를 진행하고, 운영체제가 로드되는 등의 작업이 필요합니다. 이때, 사용자는 이러한 모든 복잡한 과정을 알 필요 없이 컴퓨터를 간단한 명령으로 쉽게 시작하고 싶을 것입니다.
파사드 패턴을 사용하면 컴퓨터를 시작하는 복잡한 과정을 하나의 간단한 인터페이스로 제공할 수 있습니다. 이렇게 하면 사용자는 복잡한 내부 구현을 알 필요 없이, 간단한 컴퓨터 시작 명령으로 모든 과정을 처리할 수 있습니다.
(6)플라이웨이트(Flyweight) : 중복데이터 공유, 효율적 메모리 관리
플라이웨이트 패턴은 객체의 중복된 데이터를 공유하여 메모리를 효율적으로 관리하는 디자인 패턴입니다.
예시
일반적으로 자전거 대여소에는 여러 대의 자전거가 있을 것입니다. 이 자전거들은 각각 모양, 크기, 색상 등이 조금씩 다를 수 있습니다. 그러나 대부분의 자전거는 비슷한 특징들을 공유하고 있습니다.
플라이웨이트 패턴을 적용하면, 자전거의 공통된 특징들(모양, 크기, 색상 등)은 외부에서 하나의 객체로 저장됩니다. 그리고 각 개별 자전거는 이러한 공통 객체를 참조하여 자신만의 개별적인 특징(예: 대여된 시간, 위치 등)을 가질 수 있게 됩니다.
이렇게 플라이웨이트 패턴을 적용하면 자전거 대여소에서 관리해야 할 정보 양이 줄어들어서 메모리를 효율적으로 사용할 수 있습니다.
(7) 프록시(Proxy) : 다른 객체에 대한 대리자, 접근을 제어하거나 보조함
프록시 디자인 패턴은 다른 객체에 대한 대리자로서, 해당 객체에 대한 접근을 제어하거나 보조하는 디자인 패턴입니다.
예시
일반적인 상황에서는 보안 관리자가 출입문 앞에 직접 서서 출입을 허용하거나 거부합니다. 이렇게 하면 보안 관리자는 매번 출입문 앞에서 일해야 하고, 다른 업무에 집중하기 어려울 수 있습니다.
프록시 디자인 패턴을 적용하면 보안 관리자의 역할을 프록시로 위임합니다. 프록시는 보안 관리자와 같은 역할을 수행하지만, 출입문 앞에 항상 서 있을 필요 없이 보안 관리자가 필요한 경우에만 출입문으로 가서 출입을 허용하거나 거부할 수 있습니다. 이렇게 하면 보안 관리자는 다른 업무에 집중할 수 있으며, 출입문의 통제 역할은 프록시가 대신 수행하게 됩니다.