디자인 패턴 소개
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)입니다.
이 챌린지는 학습 내용의 핵심 통찰력을 강화합니다: 디자인 패턴은 해결하려는 문제에 따라 카테고리로 구성됩니다. 인터페이스를 사용함으로써 "구현이 아닌 인터페이스에 맞춰 프로그래밍하라"는 원칙을 연습하게 됩니다. 이는 디자인 패턴을 강력하게 만드는 핵심 개념입니다!
직접 해보기
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 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조