본문 바로가기
정보처리기사

[정보처리기사] 구조패턴 암기하기 - 디자인 패턴

by 공불러 2024. 2. 27.
728x90
반응형

GoF 패턴은 시험문제에 출제하기 매우 좋은 구조입니다. UML과 암호화알고리즘과 같이 얼마나 암기했나를 물어보기 딱 좋기 때문입니다.

문장형태로는 암기하기 어렵습니다. 인간이 암기 하기 위해선 주의를 가지고 정보를 묶어서 기억할 수 있도록 키워드를 추출하는 것이 중요합니다.

 

생성패턴과 같이 구조 패턴도 암기 하기 쉽도록 만들었습니다. 

 

함께보면 좋은 글

2024.02.22 - [정보처리기사] - [정보처리기사] Gof 디자인 패턴 생성패턴 암기하기 (feat. 스타크래프트)

 

구조 패턴이란?

구조 패턴은 소프트웨어의 구조를 개선하고 유지보수를 용이하게 만드는 데 도움을 주는 디자인 패턴입니다.

이러한 패턴은 프로그램의 다양한 구성 요소들 간의 관계를 조직화하고, 코드의 재사용성을 높이며, 유연성을 확보하는 데 중요한 역할을 합니다.

 

구조 패턴은 주로 다음과 같은 상황에서 사용됩니다

  1. 복잡한 시스템의 관리: 큰 규모의 시스템에서는 각 부분이 복잡하게 얽혀있을 수 있습니다.
  2. 유연한 설계 요구: 변경 가능성이 높은 시스템에서는 구조적으로 유연한 설계가 필요합니다.
  3. 코드의 재사용: 비슷한 기능이 여러 곳에서 필요할 때, 코드를 재사용하여 중복을 줄일 수 있습니다.
  4. 모듈화: 각 부분을 독립적으로 개발하고 테스트할 수 있도록 모듈화하는 것이 중요할 때 구조 패턴이 사용됩니다.

주요 구조 패턴에는 다음과 같습니다.

  • 브릿지(Bridge): 추상화된 부분과 구현부분을 분리하여 독립적으로 확장할 수 있도록 합니다.
  • 데코레이터(Decorator): 객체에 추가적인 기능동적으로 부여하고자 할 때 사용됩니다.
  • 퍼사이드(Facade): 복잡한 시스템에 단순한 인터페이스를 제공하여 사용자가 쉽게 상호작용할 수 있도록 돕습니다.
  • 플라이트(Flyweight): 메모리 사용을 최적화하기 위해 객체를 공유하여 생성합니다.
  • 프록시(Proxy): 실제 객체에 대한 접근을 제어하고, 필요한 경우에만 실제 객체를 생성합니다.
  • 컴포사이트(Composite): 객체들을 트리 구조로 구성하여 부분과 전체를 동일하게 취급합니다.
  • 어답터(Adapter): 인터페이스를 변환하여 호환되지 않는 인터페이스 간의 연결을 도와줍니다.

구조 패턴 암기표

반드시 영문명과 함께 암기해주세요. 한글로 나올 확률은 매우매우 적습니다.

패턴명 설명 핵심키워드
브릿지(Bridge)
빈출 문제

추상층 분리층
추상화와 구현을 분리하여 두 계층이 독립적으로 변화할 수 있게 함.
두 개의 클래스 계층을 분리해 두면 각각의 클래스 계층을 독립적으로 확장할 수 있음

*구현부 클래스와 기능 클래스가 나눠져있다는 것을 가정

구현부 클래스와 기능 클래스를 연결함.

구현부에서 추상 계층을 분리
추상화된 부분과 구현부분을 각각 독립적으로 확장할 수 있음

추상화된 부분도 변경해야하는 경우에 활용
구현부, 연결, 확장
데코레이터
(Decorator)

동적으로 새로운 기능
객체에 동적으로 새로운 기능을 추가
코드의 수정 없이 객체의 기능을 확장 할 수 있는 방법을 제공

상속을 사용하지 않고도 기능을 동적으로 확장

*이미 구현되어 있는 클래스가 있음을 가정

이미 구현된 클래스에 필요한 기능을 추가

기능확장이 필요할 때 객체간의 결합을 통해
동적으로 확장

상속의 대안으로 사용함
기능 추가, 동적 확장, 상속의 대안
퍼사이드(facade)
명사 : 무관심
표면, 허울

[본 패턴에서는 "겉보기"와 같은 뜻으로 이해하는 것이 좋음]

복잡한 시스템
단순한 시스템
복잡한 시스템을 단순화하는 디자인 패턴

클라이언트는 단일 인터페이스만 사용하고 내부 구현은 숨김

서브시스템 사이의 의사소통 및 종속성을 최소화하기 위하여 단순화된 하나의 인터페이스를 제공

서브시스템의 가장 앞쪽에 위치하면서 서브 시스템에 있는 객체들을 사용할 수 있고록 인터페이스 역할

*이미 복잡한 시스템이 있음 복잡한 시스템에 대하여
단순한 인터페이스

제공 사용자와 시스템(혹은 다른 시스템) 간의 결합도를 낮추는 역할

결합도가 낮아져서 시스템 구조에 대한 파악을 쉽게 하는 패턴

시스템 구조 파악이 쉬워져서 오류를 쉽게 찾음

사용자의 접근성이 높아짐
통합된 인터페이스 제공
단순 인터페이스, 낮은 결합도, 구조 파악
플라이트
(Flyweight)

객체 공유
메모리 절약
객체를 공유하여 메모리 절약.

객체 생성이 오래걸리거나 많을 것 같을 때 활용

*하나의 클래스에 다수의 객체가 있다는 가정

다수의 객체를 생성한다면, 각 객체를 각 클래스로 생성하도록 클래스화
목적은 경량화(Flyweight)

메모리 절약 -> 경량화

여러개의 가상 인스턴스를 제공
경량화, 메모리 절약, 가상 인스턴스
프록시(Proxy)
빈출 문제

대리, 중개
다른 객체에 대한 접근 제어/중개하는 디자인 패턴

특정 객체의 대리자나 대변인 역할을 하는 프로시 객체

*미리해도 상관없는 일을 미리 해주는 거, 알바처럼 나를 대리해주는 패턴

실제 객체를 대리하는 객체 생성

실제 객체를 접근하기 전에 미리 생성해도 상관없는 객체를 생성함.

이로써 메모리를 아끼게됨

실체 객체를 드러내지 않으므로 정보 은닉화가 가능함. 

특정 객체로의 접근을 제어하기 위한 용도
대리 객체, 메모리 절약, 정보 은닉
컴포사이트
(Composite)

트리구조
객체들을 어떠한 구조가 좋을까 생각하다 합성(composite)하는 방법을 선택

객체 관계를 Tree 구조로 구성함.

그럼 부분(Part)-전체(whole) 부분으로 구분됨

Tree이므로 계층 구조

단일객체와 복합 객체 모두 동일하게 다룰 수 있음

복합 객체와 단일 객체를 동일하게 취급함
합성, 트리 구조, 동일 취급
어답터
(Adapter)
호환되지 않는 인터페이스를 가진 클래스들이 함께 작동할 수 있음

클라이런트에서 요구하는 다른 인터페이스로 변환

한 클래스에서 요구하는 다른 인터페이스로 변환

두 인터페이스 간의 호환성 문제를 해결하여,
코드 변경없이 기존 클래스를 사용

이미 만들어져 있는 클래스를 사용하고 싶지만 인터페이스가 원하는 방식과 일치하지 않을 때.
혹은 관련성이 없거나 예측하지 못한 클래스들과 협동하는 재사용가능한 클래스를 생성하기를 원할 때

어댑터, 말그대로 무언가를 중간에서 바꿔주거나 맞춰주는 역할

중간에서 맞춰주기 위해서 인터페이스를 제공함.

클래스패턴(상속)과 인터페이스(위임)  두 가지 형태로 사용되는 패턴

인터페이스가 호환되지 않을 때, 타 클래스의 인터페이스를 기존 인터페이스에 덧씌우는 방법

5핀 충전 포트에 C 타입 충전 어댑터를 씌워서 C타입으로 충전
호환성, 중간 맞춤, 인터페이스

 

구조 패턴 암기를 위한 스토리

스타크래프트 전투에서, 테란 종족 마린 (조)대(브대)를 모아 출전했습니다.

 

이들은 적에 대한 정보 부족으로 전략을 짜는 데 어려움을 겪었고, 지휘관은 이를 극복하기 위해 "퍼플프어" 전략을 시도했습니다.

 

"퍼플프어" 전략은 퍼사이드, 프록시, 컴포지트, 어답터 네 가지 전략의 결합을 의미합니다. 퍼사이드는 적의 주시를 피하기 위해 부대를 9개의 부대를 단순화할 수 있도록 9개 단축키에 저장하는것을 의미하고, 프록시는 적의 주변에 실전에 병력이 투입되기 전에 대리 병력을 만들어 전투를 대리해서 시뮬레이션을 하는 것을  의미합니다. 

그리고, 컴포지트는 모든 병력은 Tree 구조로 상위 부대가 있어 하위 부대들이 상위 부대의 명령을 따르게 하는 것입니다.

마지막으로, 어답터 전략은 마린에게도 화염방사기를 쓸 수 있도록 장비를 만드는 것을 의미합니다.

728x90
반응형

댓글