디자인 패턴 소개
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 64번째.
디자인 패턴은 소프트웨어를 구축할 때 개발자들이 반복적으로 직면하는 일반적인 문제들에 대한 검증된 해결책입니다. 매번 바퀴를 다시 발명하는 대신, 이러한 검증된 템플릿을 적용하여 반복되는 디자인 과제를 해결할 수 있습니다.
디자인 패턴을 청사진이라고 생각하세요. 디자인 패턴은 복사해서 붙여넣을 수 있는 완성된 코드를 제공하는 것이 아니라, 특정 유형의 문제를 해결하기 위해 클래스와 객체를 어떻게 구조화할지 설명합니다. 여러분이 배우게 될 패턴들은 이미 익힌 OOP 개념인 상속(inheritance), 인터페이스(interfaces), 다형성(polymorphism), 그리고 구성(composition)을 활용합니다.
디자인 패턴은 크게 세 가지 범주로 나뉩니다:
| 범주 | 목적 | 예시 |
|---|---|---|
| 생성(Creational) | 객체가 생성되는 방식 | Singleton, Factory, Builder |
| 구조(Structural) | 객체가 구성되는 방식 | Adapter, Decorator, Composite |
| 행위(Behavioral) | 객체가 통신하는 방식 | Observer, Strategy, Command |
왜 디자인 패턴을 배워야 할까요? 디자인 패턴은 다른 개발자들과 공유할 수 있는 어휘를 제공합니다. "여기서는 Factory를 사용하자"라고 말하는 것만으로도 복잡한 아이디어를 즉시 전달할 수 있습니다. 또한 "구현이 아닌 인터페이스에 맞춰 프로그래밍하라"와 같은 원칙을 적용함으로써 더 유연하고 유지보수가 쉬운 코드를 작성하는 데 도움이 됩니다.
앞으로의 레슨에서 여러분은 Singleton 및 Factory와 같은 생성 패턴을 시작으로, Observer 및 Strategy와 같은 행동 패턴에 이르기까지 몇 가지 필수적인 패턴을 구현하게 될 것입니다.
챌린지
쉬움세 가지 디자인 패턴 카테고리에 대한 이해를 보여주는 간단한 패턴 분류기를 만들어 봅시다! 패턴을 분류하고 그 목적을 설명하는 시스템을 만들며, 코드를 여러 파일에 걸쳐 구성하게 됩니다.
세 개의 파일을 생성해야 합니다:
Pattern.java: 모든 디자인 패턴의 계약을 정의하는Pattern이라는 인터페이스를 생성하세요. 인터페이스에는 두 개의 메서드를 선언해야 합니다: 패턴의 카테고리(Creational, Structural, 또는 Behavioral)를 반환하는String getCategory()와 해당 카테고리의 패턴이 무엇을 하는지 설명을 반환하는String getPurpose()입니다.PatternInfo.java:Pattern인터페이스를 구현하는 세 개의 클래스를 생성하세요. 각 클래스는 디자인 패턴의 한 카테고리를 나타냅니다:CreationalPattern- 카테고리로"Creational"을, 목적으로"How objects are created"를 반환해야 합니다.StructuralPattern- 카테고리로"Structural"을, 목적으로"How objects are composed"를 반환해야 합니다.BehavioralPattern- 카테고리로"Behavioral"을, 목적으로"How objects communicate"를 반환해야 합니다.Main.java: 패턴 분류기를 완성하세요! 하나의 입력을 받게 됩니다:"Singleton","Factory","Adapter","Decorator","Observer", 또는"Strategy"중 하나인 패턴 이름(String)입니다.입력에 따라 적절한 패턴 객체를 생성하세요:
"Singleton"및"Factory"는 Creational 패턴입니다."Adapter"및"Decorator"는 Structural 패턴입니다."Observer"및"Strategy"는 Behavioral 패턴입니다.
패턴 객체를
Pattern(인터페이스) 타입의 변수에 저장하여 인터페이스에 맞춰 프로그래밍하는 원칙을 보여주세요. 그런 다음 다음 세 줄을 출력하세요:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
하나의 입력을 받습니다: 디자인 패턴의 이름(String)입니다.
이 챌린지는 학습 내용의 핵심 통찰력을 강화합니다: 디자인 패턴은 해결하려는 문제에 따라 카테고리로 구성됩니다. 인터페이스를 사용함으로써 "구현이 아닌 인터페이스에 맞춰 프로그래밍하라"는 원칙을 연습하게 됩니다. 이는 디자인 패턴을 강력하게 만드는 핵심 개념입니다!
치트 시트
디자인 패턴은 소프트웨어 개발에서 흔히 발생하는 문제들에 대한 검증된 해결책입니다. 이는 특정 유형의 문제를 해결하기 위해 클래스와 객체를 어떻게 구조화할지 설명하는 청사진입니다.
디자인 패턴은 크게 세 가지 범주로 나뉩니다:
| 범주 | 목적 | 예시 |
|---|---|---|
| 생성 (Creational) | 객체가 생성되는 방식 | Singleton, Factory, Builder |
| 구조 (Structural) | 객체가 구성되는 방식 | Adapter, Decorator, Composite |
| 행위 (Behavioral) | 객체가 통신하는 방식 | Observer, Strategy, Command |
디자인 패턴은 개발자들 사이에 공통된 어휘를 제공하며, "구현이 아닌 인터페이스에 맞춰 프로그래밍하라"와 같은 원칙을 적용하여 더 유연하고 유지보수가 쉬운 코드를 작성하도록 돕습니다.
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: Pattern 타입(인터페이스)의 변수를 선언하세요.
Pattern pattern = null;
// TODO: patternName에 따라 적절한 패턴 객체를 생성하세요:
// - "Singleton"과 "Factory"는 Creational(생성) 패턴입니다.
// - "Adapter"와 "Decorator"는 Structural(구조) 패턴입니다.
// - "Observer"와 "Strategy"는 Behavioral(행위) 패턴입니다.
// TODO: 다음 형식으로 출력을 출력하세요:
// Pattern: [입력받은 패턴 이름]
// Category: [getCategory()에서 반환된 카테고리]
// Purpose: [getPurpose()에서 반환된 목적]
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조