
정보처리기사를 공부할 때 디자인패턴이라는 개념을 접하게 되었습니다. 소프트웨어를 만들 때 여러 개발자가 협업하고 코드를 효율적으로 관리하기 위한 하나의 방법입니다.
디자인 패턴이 왜 중요하고 GoF(Gang of Four)의 23가지 디자인 패턴을 간단한 설명과 함께 알아보려고 합니다.
왜 디자인패턴이 필요할까?
여러 사람이 함께 하나의 소프트웨어를 개발할 때 큰 어려움 중 하나는 다른 사람의 코드를 이해하는 것입니다. 다른 사람이 작성한 코드를 파악하고 수정하거나 기능을 추가하는 과정은 자칫하면 예상치 못한 버그를 발생시키거나 성능을 저하할 수도 있습니다. 디자인 패턴은 소프트웨어 설계 문제에 대한 검증된 해결 방법 모음이자 개발자 간의 효율적인 의사소통 방법입니다. 특정 패턴을 적용했다는 것만으로도 코드의 구조와 의도를 쉽게 파악할 수 있게 해줍니다.
GoF 디자인 패턴 23가지
디자인 패턴 분야에서 핵심적인 내용은 Design Patterns: Elements of Reusable Object-Oriented Software에서 소개된 23가지 패턴입니다. 이 패턴은 크게 세 가지로 나누어집니다.
- 생성 패턴 : 객체 생성 방식을 다룹니다. 객체를 생성하는 과정을 추상화하여 시스템이 특정 클래스에 직접적으로 의존하지 않도록 유연성을 제공합니다. (5가지)
- 구조 패턴 : 클래스나 객체를 조합하여 더 큰 구조를 만듭니다. 여러 객체나 클래스 사이의 관계를 어떻게 구성할지에 대한 문제를 다룹니다. (7가지)
- 행위 패턴 : 객체간의 알고리즘이나 상호작용 방식을 다룹니다. 객체들이 서로 어떻게 상호작용 하는지에 대한 방법을 다룹니다. (11가지)
1. 생성 패턴 (Creational Patterns)
객체 생성하는 방식에 대한 패턴들입니다.
| 패턴 이름 | 설명 | 예시 |
| Singleton | 오직 하나의 인스턴스만 존재하도록 보장 | 게임 설정창은 한 개밖에 없도록 합니다. (전역에서 하나의 인스턴스만 유지) |
| Factory Method | 객체 생성을 서브클래스에 위임 | 스타크래프트에서 배럭에는 마린, 파이어벳, 메딕, 고스트만 나옵니다. (어떤 유닛이 생성될지는 건물(서브클래스)이 결정) |
| Abstract Factory | 관련된 객체들을 하나의 팩토리에서 생성 | 게임 시작 시 테란을 선택하면 테란의 테크트리 전체(건물, 유닛 등)가 고정됩니다. (마인드 컨트롤 제외) (관련된 객체 세트를 일괄 생성) |
| Builder | 복잡한 객체 생성을 단계별로 분리 | 햄버거를 만들 때 번 + 패티 + 치즈 + 소스 등 부품을 조립해서 완성합니다. (객체를 단계별로 구성) |
| Prototype | 객체를 복제(clone)하여 생성 | 캐릭터 커스터마이징 후 프리셋으로 저장하고, 나중에 복제해서 새 캐릭터로 생성합니다. (기존 객체 복사로 새 객체 생성) |
2. 구조 패턴 (Structural Patterns)
클래스와 객체를 조합하여 더 큰 구조를 만드는 데 도움을 줍니다.
| 패턴 이름 | 설명 | 예시 |
| Adapter | 호환되지 않는 인터페이스를 맞춤 | 닌텐도 스위치2에서 스위치1 하위 버전의 게임을 지원합니다. (호환되지 않는 인터페이스 연결) |
| Bridge | 구현과 추상화를 분리 | 스킬 + 무기 조합 (기능과 구현을 분리해서 독립적으로 확장) |
| Composite | 트리 구조로 구성된 객체를 동일하게 다룸 | 캡처를 위해 UI 버튼, 미니맵, 체력바를 'UI 그룹'으로 묶고 한 번에 활성화/비활성화할 수 있습니다. (객체를 동일하게 다룸) |
| Decorator | 객체에 기능을 동적으로 추가 | 인챈트를 하여 아이템에 속성을 부여합니다. (기존 객체에 기능을 덧붙임) |
| Facade | 복잡한 시스템을 단순화하는 인터페이스 제공 | 자동 전투 버튼 (복잡한 시스템을 간단한 인터페이스로 제공) |
| Flyweight | 동일한 객체를 공유하여 메모리 절약 | 슈퍼마리오 게임이 40kb인 이유 중 하나는 타일을 공유해서 넣습니다. (메모리를 절약하며 반복 객체 관리) |
| Proxy | 객체 접근 제어 (대리인 역할) | 유료 아이템 미리보기에서는 실제 아이템이 아닌 미리보기 전용 화면을 보여줍니다. (객체에 대한 접근 제어 또는 대리 역할 수행) |
3. 행위 패턴 (Behavioral Patterns)
객체 간의 상호작용, 알고리즘을 다루는 패턴들입니다.
| 패턴 이름 | 설명 | 예시 |
| Observer | 상태 변화 시 자동으로 알림 전파 | 레이드 보스 등장 시 공지창을 통해 모두에게 알립니다. (상태 변화 알림 전파) |
| Strategy | 알고리즘을 객체로 캡슐화하여 교체 능하게 함 |
전투 시 원거리에서는 활, 가까운 거리에서는 검을 이용하여 공격합니다. (상황에 따라 알고리즘을 교체) |
| Command | 요청을 객체로 캡슐화 | 메이플스토리 스킬 매크로를 선입력하여 여러 스킬을 한 번의 버튼으로 부를 수 있습니다. (명령을 객체로 저장 및 실행) |
| Iterator | 컬렉션을 순차적으로 접근 | 퀘스트 의뢰를 받은 순서대로 화면에 나옵니다. (컬렉션을 순차적으로 접근) |
| Mediator | 객체 간 상호작용을 중재자에게 위임 | 채팅창에 욕설이 있는 경우 *로 가공되어 보내집니다. (객체 간 직접 통신 대신 중재자 사용) |
| Memento | 객체 상태를 저장하고 복원 | 세이브 로드 기능 (객체의 상태를 저장하고 복원) |
| State | 상태에 따라 객체의 행동 변경 | 동물철권에서 캐릭터 변신 전후 공격 패턴이 달라집니다. (상태에 따라 행동 변경) |
| Template Method | 알고리즘의 구조를 정의하고 일부 단계를 서브클래스에 위임 |
인스턴트 던전의 경우 보스는 같으나 맵 구조는 랜덤으로 나옵니다. (알고리즘의 틀 고정, 일부만 구현) |
| Chain of Responsibility | 요청을 처리할 객체를 연결된 체인으로 구성 | 길드 가입 신청을 부길마가 먼저 확인하고, 처리가 어려우면 길드장에게 넘깁니다. (책임에 따라 요청 처리) |
| Interpreter | 문법 표현을 위한 구조 정의 | 마인크래프트에서 레드스톤을 이용한 회로를 통해 다양한 기능을 구성할 수 있습니다. (언어/명령어 해석기처럼 구조 정의) |
| Visitor | 객체 구조를 변경하지 않고 기능 추가 | 캐릭터의 모든 행위에 로그를 남깁니다. (구조 변경 없이 새로운 연산(기능) 추가) |
마지막으로
잘 알려진 디자인 패턴을 사용하면 협업 과정에서 코드의 의도와 구조를 빠르게 파악할 수 있어, 유지보수성이 크게 향상됩니다.
'컴퓨터 > 컴퓨터 관련 지식' 카테고리의 다른 글
| 보안 - SQL 인젝션 원리와 예방방법, DB를 지키는 방법 (1) | 2025.09.04 |
|---|---|
| 네트워크 - OSI 7 Layer에 대해 알아보자 (0) | 2025.04.18 |
| 포트포워딩 - 로컬 서버를 외부에 공개해보자 (0) | 2025.04.09 |
| 무선통신 - 2.4GHz / 5GHz 대역이 면허 없이 사용 가능한 이유 (0) | 2024.12.09 |
| 알고리즘 - 빅오 표기법 (Big-O notation) (0) | 2024.09.21 |