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

디자인 패턴(Design Patterns) 정리

by Corinee 2024. 10. 10.
728x90
반응형

디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 해결책입니다. 디자인 패턴은 코드를 구조화하고 유지보수성을 높이기 위한 설계 원칙을 제시합니다. 주로 객체지향 프로그래밍에서 사용되며, 유형에 따라 생성 패턴(Creational Patterns), 구조 패턴(Structural Patterns), 행위 패턴(Behavioral Patterns) 세 가지로 분류됩니다.

1. 생성 패턴 (Creational Patterns)

생성 패턴은 객체 생성과 관련된 문제를 해결하는 패턴입니다. 객체의 생성 과정에서 객체의 생성과 관련된 복잡성을 숨기고, 객체를 효율적으로 생성할 수 있도록 도와줍니다.

1.1 Singleton 패턴

  • 목적: 클래스의 인스턴스를 하나만 생성하도록 보장하는 패턴.
  • 특징: 애플리케이션에서 하나의 전역 인스턴스를 제공하여, 자원을 일관되게 사용하고 메모리 낭비를 방지함.
  • 예시: 데이터베이스 연결, 로그 파일 관리.

1.2 Factory Method 패턴

  • 목적: 객체 생성의 로직을 서브클래스에서 정의할 수 있도록 캡슐화하는 패턴.
  • 특징: 객체 생성을 위한 인터페이스를 정의하지만, 구체적인 클래스 결정은 서브클래스에서 하도록 합니다.
  • 예시: 다양한 상품을 생성하는 공장에서 구체적인 상품의 생성을 각 서브클래스에서 결정.

1.3 Abstract Factory 패턴

  • 목적: 관련된 객체들의 제품군을 생성할 수 있는 인터페이스를 제공하는 패턴.
  • 특징: 구체적인 클래스에 의존하지 않고 객체 군을 생성할 수 있음.
  • 예시: GUI 툴킷에서 윈도우, 버튼, 텍스트 필드 등의 다양한 테마와 관련된 객체들을 생성.

1.4 Builder 패턴

  • 목적: 객체의 복잡한 생성 과정을 단계별로 나누어 객체를 생성하는 패턴.
  • 특징: 다양한 조합으로 복잡한 객체를 만들 수 있으며, 생성 과정을 캡슐화함.
  • 예시: 복잡한 객체(ex: 자동차, 컴퓨터) 생성 시, 다양한 부품을 단계적으로 조립.

1.5 Prototype 패턴

  • 목적: 기존 객체를 복사하여 새로운 객체를 생성하는 패턴.
  • 특징: 복제(Cloning)를 통해 객체를 생성하며, 객체 생성 비용이 클 때 유용.
  • 예시: 객체를 새로 생성하는 대신, 기본 객체를 복제해 효율적으로 사용.

2. 구조 패턴 (Structural Patterns)

구조 패턴은 클래스와 객체의 구조를 조정하여, 객체들 간의 관계를 효율적으로 설계하는 패턴입니다. 이 패턴은 코드 재사용성을 높이고 유지보수를 용이하게 해줍니다.

2.1 Adapter 패턴

  • 목적: 호환되지 않는 인터페이스를 가진 객체들끼리도 함께 동작할 수 있도록 중간에 어댑터 객체를 삽입하는 패턴.
  • 특징: 기존 클래스를 변경하지 않고, 인터페이스 호환성을 맞출 수 있음.
  • 예시: USB-C 포트를 사용하는 기기에 USB-A를 사용할 수 있도록 변환하는 어댑터.

2.2 Bridge 패턴

  • 목적: 기능과 구현을 분리하여 각각 독립적으로 확장할 수 있게 하는 패턴.
  • 특징: 기능 계층과 구현 계층을 분리하여 변경의 독립성을 유지.
  • 예시: 그래픽 렌더링 시스템에서 API와 그래픽 구현을 독립적으로 변경 가능하게 만듦.

2.3 Composite 패턴

  • 목적: 객체들을 트리 구조로 구성하여, 단일 객체와 복합 객체를 동일하게 처리할 수 있도록 하는 패턴.
  • 특징: 개별 객체와 복합 객체를 동일한 방식으로 다룰 수 있음.
  • 예시: 파일 시스템 구조에서 폴더와 파일을 동일하게 처리하는 방식.

2.4 Decorator 패턴

  • 목적: 객체에 기능을 동적으로 추가할 수 있도록 하는 패턴.
  • 특징: 상속을 사용하지 않고 기능을 확장할 수 있음.
  • 예시: 커피에 다양한 첨가물을 추가해 가격과 기능을 확장하는 방식.

2.5 Facade 패턴

  • 목적: 복잡한 시스템의 단순한 인터페이스를 제공하는 패턴.
  • 특징: 복잡한 하위 시스템을 단순화하여 사용자가 쉽게 사용할 수 있도록 함.
  • 예시: 컴퓨터의 전원을 켜면 내부적으로 여러 시스템이 동작하지만, 사용자는 전원 버튼만 누르면 됨.

2.6 Flyweight 패턴

  • 목적: 공통된 객체를 공유하여 메모리 사용을 절감하는 패턴.
  • 특징: 동일한 객체를 공유하여 메모리를 절약함.
  • 예시: 게임에서 동일한 그래픽 객체를 여러 번 사용할 때.

2.7 Proxy 패턴

  • 목적: 대리 객체를 통해 실제 객체에 접근하는 패턴.
  • 특징: 원본 객체에 대한 접근을 통제하거나, 추가 기능을 제공할 때 사용.
  • 예시: 네트워크 상에서 원격 객체에 접근할 때 프록시를 통해 요청을 처리.

3. 행위 패턴 (Behavioral Patterns)

행위 패턴객체 간의 상호작용책임 분배를 중점으로 설계되는 패턴입니다. 객체들 간의 협력메시지 전달을 통해 복잡한 행동을 효율적으로 설계할 수 있습니다.

3.1 Chain of Responsibility 패턴

  • 목적: 요청을 순차적으로 처리하는 객체들로 연결하여, 요청을 처리할 수 있는 객체가 처리하도록 하는 패턴.
  • 특징: 요청을 처리할 수 없는 경우 다음 객체로 전달.
  • 예시: 고객 문의를 상급 부서로 차례로 전달하는 방식.

3.2 Command 패턴

  • 목적: 요청을 객체로 캡슐화하여, 요청 내역을 저장하거나, 취소할 수 있도록 하는 패턴.
  • 특징: 실행 명령을 객체로 처리해, 명령을 나중에 실행하거나 취소할 수 있음.
  • 예시: 전자기기의 리모컨에서 "실행 취소" 기능.

3.3 Interpreter 패턴

  • 목적: 언어의 문법을 정의하고 해석하는 패턴.
  • 특징: 주어진 언어 문법을 해석하는 구조를 정의하고 구현.
  • 예시: 수식을 해석하거나 간단한 스크립트 언어 처리.

3.4 Iterator 패턴

  • 목적: 집합 객체 내부의 요소들을 순차적으로 접근할 수 있도록 하는 패턴.
  • 특징: 집합체에 상관없이, 동일한 방식으로 순회할 수 있는 인터페이스 제공.
  • 예시: 리스트, 배열과 같은 컬렉션을 순차적으로 처리.

3.5 Mediator 패턴

  • 목적: 객체 간의 복잡한 상호작용을 중재자 객체가 관리하여 직접적인 상호작용을 최소화하는 패턴.
  • 특징: 객체들이 중재자를 통해서만 통신하여 결합도를 낮춤.
  • 예시: 채팅방에서 사용자가 서로 통신하는 대신 채팅 서버를 통해 메시지를 주고받음.

3.6 Memento 패턴

  • 목적: 객체의 상태를 저장하여 나중에 복원할 수 있도록 하는 패턴.
  • 특징: 객체의 이전 상태를 저장하여, 특정 시점으로 되돌리기 가능.
  • 예시: 텍스트 편집기의 실행 취소 기능.

3.7 Observer 패턴

  • 목적: 일대다 관계에서 한 객체의 상태 변화가 있을 때, 다른 객체들에게 자동으로 알리는 패턴.
  • 특징: 이벤트 기반 시스템에서 주로 사용되며, 상태 변화를 구독(subscribe)하고 알림(publish)받는 구조.
  • 예시: 이메일 구독, 소셜 미디어 팔로우 시스템.

3.8 State 패턴

  • 목적: 객체의 상태에 따라 다른 동작을 실행하는 패턴.
  • 특징: 상태 변화를 객체로 캡슐화하여, 상태에 따른 행동을 쉽게 확장할 수 있음.
  • 예시: 문 상태에 따라 열거나 닫을 수 있는 동작을 다르게 처리.

3.9 Strategy 패턴

  • 목적: 행동을 캡슐화하여, 여러 알고리즘을 런타임에 교체할 수 있도록 하는 패턴.
  • 특징: 행동을 객체화하여 쉽게 교체 가능.
  • 예시: 다양한 할인 정책을 실행 시점에 교체 가능.

3.10 Template Method 패턴

  • 목적: 알고리즘의 뼈대를 정의하고, 구체적인 단계는 서브클래스에서 재정의할 수 있도록 하는 패턴.
  • 특징: 알고리즘의 기본 흐름을 템플릿으로 정의하고, 세부적인 부분은 서브클래스에서 구현.
  • 예시: 여러 단계로 이루어진 작업에서 기본 단계를 정의하고, 각 단계는 구체적으로 다르게 처리.

3.11 Visitor 패턴

  • 목적: 객체 구조의 요소에 대해 새로운 연산을 추가할 수 있도록 하는 패턴.
  • 특징: 구조를 변경하지 않고, 새로운 기능을 추가 가능.
  • 예시: 파일 시스템에서 다양한 파일 형식에 대해 서로 다른 작업을 수행.

디자인 패턴의 중요성

  1. 코드 재사용성: 재사용 가능한 설계 구조를 제공하여, 코드의 중복을 줄입니다.
  2. 유지보수성 향상: 코드를 구조화하여 변경 사항이 발생할 때 유연하게 대응할 수 있습니다.
  3. 효율적인 협업: 팀 내에서 공통된 패턴을 사용하여, 개발자들 간의 의사소통을 원활하게 할 수 있습니다.
  4. 성능 최적화: 특정 문제를 해결하기 위해 최적화된 패턴을 적용하여, 성능을 향상시킬 수 있습니다.

정리

디자인 패턴은 소프트웨어 개발에서 재사용 가능한 설계 방법론입니다. 패턴을 적절히 활용함으로써 코드의 복잡성을 줄이고, 유지보수성과 확장성을 높이며, 일관된 개발 방식을 유지할 수 있습니다.

'Category > 정보처리기사' 카테고리의 다른 글

서브넷 나누기란?  (0) 2024.10.11
하드웨어 기반의 보안 기술 TrustZone  (1) 2024.10.10
다크 데이터(Dark Data)란?  (3) 2024.10.10
형상 관리(Configuration Management)란?  (1) 2024.10.10
SSO(Single Sign-On)란?  (1) 2024.10.10