디자인 패턴 소개
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 51번째.
디자인 패턴은 개발자들이 소프트웨어를 구축할 때 반복적으로 마주하는 일반적인 문제에 대한 검증된 해결책입니다. 매번 바퀴를 다시 발명하는 대신, 패턴은 우리에게 공통된 어휘와 코드 구조화를 위한 테스트된 접근 방식을 제공합니다.
디자인 패턴을 청사진이라고 생각하세요. 디자인 패턴은 복사할 정확한 코드를 제공하지는 않지만, 특정 문제를 해결하기 위해 클래스와 객체를 구성하는 방법을 설명합니다. 누군가가 "여기에는 팩토리 패턴(Factory pattern)을 사용하세요"라고 말하면, 숙련된 개발자들은 제안된 일반적인 구조를 즉시 이해합니다.
디자인 패턴은 세 가지 주요 카테고리로 분류됩니다:
| 카테고리 | 목적 | 예시 |
|---|---|---|
| 생성(Creational) | 객체가 생성되는 방식 | Singleton, Factory |
| 구조(Structural) | 객체가 구성되는 방식 | Adapter, Decorator |
| 행위(Behavioral) | 객체가 통신하는 방식 | Observer, Strategy |
우리가 살펴볼 패턴들은 여러분이 이미 배운 OOP 개념인 인터페이스, 상속, 다형성, 합성을 직접적으로 기반으로 합니다. 각 패턴은 유연성, 유지보수성 또는 재사용성을 달성하기 위해 이러한 기본 원칙들을 특정 방식으로 활용합니다.
앞으로의 레슨에서 여러분은 Singleton, Factory, Observer, Strategy를 시작으로 몇 가지 필수적인 패턴을 구현하게 될 것입니다. 이러한 패턴을 이해하면 기존 코드베이스에서 일반적인 솔루션을 인식하고 여러분의 프로젝트에서 더 나은 아키텍처 결정을 내리는 데 도움이 될 것입니다.
챌린지
쉬움여러 파일에 걸쳐 디자인 패턴 정보를 정리하는 간단한 패턴 카탈로그 시스템을 구축해 보겠습니다. 이를 통해 좋은 코드 구조를 연습하면서 패턴이 어떻게 분류되는지 이해하는 데 도움이 될 것입니다.
서로 다른 책임을 분리하기 위해 세 개의 파일을 생성합니다:
Pattern.cs: 단일 디자인 패턴을 나타내는Patterns네임스페이스 내에Pattern클래스를 정의합니다. 각 패턴은Name,Category(Creational, Structural, 또는 Behavioral), 그리고Description을 가져야 합니다.[{Category}] {Name}: {Description}형식의 문자열을 반환하는GetSummary()메서드를 포함하세요.PatternCatalog.cs: 패턴 컬렉션을 관리하는Patterns네임스페이스 내에PatternCatalog클래스를 생성합니다. 카탈로그는 패턴을 추가할 수 있어야 하며, 해당 카테고리와 일치하는 모든 패턴 목록을 반환하는GetPatternsByCategory(string category)메서드를 가져야 합니다. 또한 카탈로그의 모든 패턴에 대한 요약 문자열 목록을 반환하는GetAllSummaries()메서드도 포함하세요.Program.cs: 카탈로그를 생성하고 입력에 따라 패턴을 채워 넣어 모든 것을 하나로 합칩니다. 그런 다음 카테고리별로 필터링된 패턴을 표시합니다.
다음 입력을 받게 됩니다:
- 추가할 패턴의 수
- 각 패턴에 대해: 이름, 카테고리, 설명을 포함하는 세 줄
- 필터링할 카테고리
카탈로그에 모든 패턴을 추가한 후, 필터 카테고리와 일치하는 패턴의 요약을 한 줄에 하나씩 출력합니다. 일치하는 패턴이 없으면 No patterns found를 출력합니다.
예를 들어, 입력이 다음과 같다면:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
Creational출력은 다음과 같아야 합니다:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact class이 챌린지는 관련 클래스를 별도의 파일로 구성하는 것이 코드베이스를 깨끗하고 유지 관리 가능하게 유지하는 방법을 보여줍니다. 이는 향후 레슨에서 실제 디자인 패턴을 구현할 때 더욱 중요해지는 원칙입니다!
치트 시트
디자인 패턴은 소프트웨어 개발에서 발생하는 일반적인 문제들에 대한 검증된 해결책입니다. 디자인 패턴은 복사할 수 있는 정확한 코드라기보다는 클래스와 객체를 구성하기 위한 청사진을 제공합니다.
디자인 패턴은 크게 세 가지 범주로 나뉩니다:
| 범주 | 목적 | 예시 |
|---|---|---|
| 생성(Creational) | 객체가 생성되는 방식 | Singleton, Factory |
| 구조(Structural) | 객체가 구성되는 방식 | Adapter, Decorator |
| 행위(Behavioral) | 객체가 통신하는 방식 | Observer, Strategy |
디자인 패턴은 유연성, 유지보수성 및 재사용성을 달성하기 위해 인터페이스, 상속, 다형성 및 합성과 같은 OOP 개념을 기반으로 구축됩니다.
직접 해보기
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// 패턴의 개수를 읽습니다
int n = Convert.ToInt32(Console.ReadLine());
// 새로운 PatternCatalog를 생성합니다
PatternCatalog catalog = new PatternCatalog();
// TODO: 각 패턴의 세부 정보(name, category, description)를 읽습니다
// 그리고 그것들을 카탈로그에 추가합니다
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Pattern을 생성하고 카탈로그에 추가합니다
}
// 필터링할 카테고리를 읽습니다
string filterCategory = Console.ReadLine();
// TODO: 필터 카테고리별로 패턴을 가져옵니다
// 그리고 그것들의 요약을 출력합니다
// 일치하는 패턴이 없으면 "No patterns found"를 출력합니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.