구조 패턴(Structural Pattern)

구조 패턴

구조 패턴 요약

구조 패턴(Structural Pattern)은 클래스나 객체들을 조합해 더 큰 구조를 만드는 데 사용하는 디자인 패턴입니다. 총 7가지 유형이 있으며, 복잡한 시스템의 구조를 쉽게 만들 수 있도록 돕습니다.

어댑터(Adapter)

서로 호환되지 않는 클래스의 인터페이스를 변환하여 기존 클래스의 기능을 새로운 인터페이스와 연결할 수 있게 해주는 패턴입니다.

브리지(Bridge)

추상화와 구현을 분리하여 독립적으로 확장할 수 있게 하며, 기능과 구현을 개별 클래스 계층으로 구성합니다.

컴포지트(Composite)

객체들을 트리 구조로 구성하여 단일 객체처럼 다룰 수 있도록 하며, 부분과 전체를 동일한 방식으로 처리할 수 있게 합니다.

데코레이터(Decorator)

기존 객체에 부가 기능을 덧붙여 기능을 확장할 수 있도록 하는 패턴입니다.

퍼사드(Facade)

복잡한 서브 시스템을 단순화된 인터페이스로 제공해 사용하기 쉽게 만들어주는 패턴입니다.

플라이웨이트(Flyweight)

공유를 통해 많은 수의 객체 생성을 줄이고 자원을 효율적으로 사용하는 데 중점을 둔 경량 패턴입니다.

프록시(Proxy)

다른 객체에 대한 접근을 제어하는 대리 객체를 사용해, 기능 수행 전후에 추가 동작이나 제어를 할 수 있도록 합니다.

구조 패턴 기출 문제

2024년 1회

10. GoF(Gangs of Four) 디자인 패턴에 대한 설명으로 틀린 것은?

① Factory Method Pattern은 상위클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위클래스에서 인스턴스를 생성하도록 하는 방식이다.

② Prototype Pattern은 Prototype을 먼저 생성하고 인스턴스를 복제하여 사용하는 구조이다.

③ Bridge Pattern은 기존에 구현되어 있는 클래스에 기능 발생 시 기존 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할을 한다.

④ Mediator Pattern은 객체간의 통제와 지시의 역할을 하는 중재자를 두어 객체지향의 목표를 달성하게 해준다.



해설 보기
정답: ③

보기 ③의 설명은 Bridge Pattern이 아닌 Adapter Pattern에 대한 설명입니다.

Bridge Pattern은 추상화와 구현을 분리하여, 독립적으로 확장할 수 있도록 돕는 구조적 패턴입니다.
Adapter Pattern은 기존의 클래스를 재사용하고 싶을 때 중간에 호환성 문제를 해결하기 위해 맞춰주는 역할을 합니다.

나머지 보기는 모두 각 디자인 패턴에 대한 정확한 설명입니다.

구조 패턴 부가 설명

구조 패턴은 클래스와 객체 사이의 관계를 정의하여, 프로그램의 유연성과 확장성을 높이는 데 초점을 둡니다. 아래에서 설명하는 각 패턴들은 현실 세계의 다양한 문제를 객체지향적으로 해결하기 위한 전략이라 할 수 있습니다.

어댑터 패턴: 호환되지 않는 인터페이스의 연결

어댑터(Adapter) 패턴은 서로 호환되지 않는 클래스의 인터페이스를 맞춰주는 데 사용됩니다. 기존의 클래스를 그대로 활용하면서도 새로운 인터페이스와 일치시키고 싶을 때 유용합니다. 마치 110V 전기코드를 220V 콘센트에 연결할 수 있도록 돕는 변환기처럼, 이 패턴은 중간에서 변환 역할을 수행하는 클래스를 만들어 기존 클래스의 인터페이스를 새 환경에 맞게 변환시킵니다.

브리지 패턴: 구현과 추상화의 분리

브리지(Bridge) 패턴은 구현과 추상화를 분리해서 독립적으로 확장할 수 있도록 구조화하는 방식입니다. 기능 계층과 구현 계층을 분리하여 서로 다른 클래스 계층 구조를 별도로 유지할 수 있도록 돕습니다. 예를 들어, 운영체제마다 다른 방식으로 기능을 처리해야 하는 UI를 생각해보면, 브리지 패턴은 같은 UI 추상화를 기반으로 서로 다른 구현을 손쉽게 연결할 수 있도록 구성합니다.

컴포지트 패턴: 계층 구조 구성에 적합한 패턴

컴포지트(Composite) 패턴은 객체들을 트리 구조로 구성하여 부분과 전체를 동일하게 다룰 수 있도록 만들어줍니다. 하나의 객체처럼 동작하지만, 내부적으로는 여러 개의 객체를 포함하고 있을 수 있습니다. 메뉴 시스템, 폴더 구조 등 계층적인 구조를 구현할 때 주로 사용되며, 복잡한 구조를 단순하게 처리할 수 있는 장점이 있습니다.

데코레이터 패턴: 기능 확장을 위한 유연한 방식

데코레이터(Decorator) 패턴은 기존 객체에 새로운 기능을 동적으로 추가할 수 있도록 합니다. 상속 없이도 기존 객체에 추가적인 기능을 붙일 수 있으며, 필요한 기능만 조합하여 사용할 수 있습니다. 예를 들어 커피에 우유나 시럽을 추가하듯, 객체에 원하는 기능을 덧붙이는 방식으로 구현됩니다. 이 패턴은 기능의 조합이 유동적일 때 특히 유용합니다.

퍼사드 패턴: 복잡한 인터페이스를 단순화

퍼사드(Facade) 패턴은 복잡하게 얽힌 서브 시스템을 단순화해주는 역할을 합니다. 여러 클래스가 복잡하게 상호작용해야 하는 상황에서, 하나의 퍼사드 클래스를 통해 간단한 인터페이스를 제공함으로써 클라이언트가 서브 시스템의 복잡성을 알지 않고도 사용할 수 있도록 돕습니다. 흔히 API에서 복잡한 로직을 숨기고 사용자는 단순한 메서드만 사용하게 하는 방식이 이에 해당합니다.

플라이웨이트 패턴: 메모리 최적화를 위한 경량 패턴

플라이웨이트(Flyweight) 패턴은 동일하거나 유사한 객체를 공유하여 메모리 사용을 줄이는 패턴입니다. 수많은 객체를 생성해야 할 때 공통된 속성은 공유하고, 개별적인 속성만 별도로 관리함으로써 시스템 자원을 효율적으로 사용할 수 있습니다. 문자 처리기에서 글자 하나하나를 객체로 만들지 않고, 공통된 글자 형식을 공유하는 방식이 대표적인 예입니다.

프록시 패턴: 객체 접근을 제어하는 대리자

프록시(Proxy) 패턴은 어떤 객체에 접근하기 전에 중간에서 그 접근을 제어할 수 있는 대리 객체를 제공하는 패턴입니다. 실제 객체 대신 프록시 객체가 먼저 응답하면서, 필요한 경우에만 실제 객체를 호출하거나, 접근 권한을 확인하거나, 요청을 로깅할 수 있도록 도와줍니다. 보안, 지연 로딩, 원격 제어 등에 자주 활용되는 구조입니다.

사용자 인터페이스(UI)

Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x