diff --git "a/jihyeon/08.\355\205\234\355\224\214\353\246\277_\353\251\224\354\204\234\353\223\234_\355\214\250\355\204\264.md" "b/jihyeon/08.\355\205\234\355\224\214\353\246\277_\353\251\224\354\204\234\353\223\234_\355\214\250\355\204\264.md" new file mode 100644 index 0000000..60c237e --- /dev/null +++ "b/jihyeon/08.\355\205\234\355\224\214\353\246\277_\353\251\224\354\204\234\353\223\234_\355\214\250\355\204\264.md" @@ -0,0 +1,189 @@ +# **템플릿 메서드 패턴 (Template Method Pattern)** + +알고리즘의 전체 흐름은 부모 클래스가 정의하고, 일부 단계의 구현만 자식 클래스에 맡기는 패턴 +**순서는 부모가 정하고, 세부 동작은 자식이 구현하는 구조** + +### **문제 상황** + +여러 클래스가 비슷한 처리 흐름을 가지지만, 일부 단계만 다를 때가 존재 + +예를 들어 차와 커피는 모두: + +1. 물을 끓이고 +2. 재료를 우려내고 +3. 컵에 따르고 +4. 첨가물을 넣습니다 + +전체 흐름은 비슷하지만, 실제로 우리는 방식과 첨가물은 다르다. + +이걸 각 클래스가 전부 직접 구현하면: + +- 공통 코드가 중복 +- 알고리즘 흐름이 흩어짐 +- 수정할 때 여러 클래스를 함께 고쳐야 함 + +### **해결책** + +공통된 절차는 부모 클래스에 두고, 달라지는 단계만 추상 메서드로 분리 + +```ts +abstract class CaffeineBeverage { + prepareRecipe(): void { + this.boilWater(); + this.brew(); + this.pourInCup(); + this.addCondiments(); + } + + protected abstract brew(): void; + protected abstract addCondiments(): void; + + protected boilWater(): void { + console.log("Boiling water"); + } + + protected pourInCup(): void { + console.log("Pouring into cup"); + } +} +``` + +자식 클래스는 필요한 부분만 구현 + +```ts +class Tea extends CaffeineBeverage { + protected brew(): void { + console.log("Steeping the tea"); + } + + protected addCondiments(): void { + console.log("Adding Lemon"); + } +} + +class Coffee extends CaffeineBeverage { + protected brew(): void { + console.log("Dripping Coffee through filter"); + } + + protected addCondiments(): void { + console.log("Adding Sugar and Milk"); + } +} +``` + +## **핵심 구조** + +- **Template Method**: 전체 순서를 정의하는 메서드 +- **Primitive Operation**: 자식이 구현해야 하는 단계 +- **Hook**: 필요할 때만 선택적으로 오버라이드하는 확장 포인트 + +### **Hook** + +훅은 자식 클래스가 **선택적으로 개입할 수 있는 지점** + +```ts +protected customerWantsCondiments(): boolean { + return true; +} +``` + +자식 클래스는 필요하면 이 메서드를 오버라이드해서 특정 단계를 건너뛸 수 있다. + +## **프론트엔드 개발에서의 사례** + +전통적인 클래스 상속 코드보다, **프레임워크가 전체 흐름을 잡고 개발자가 일부 단계만 구현하는 구조**에서 템플릿 메서드 패턴과 비슷한 개념을 자주 볼 수 있다. + +#### **1. React 컴포넌트 생명주기** + +클래스형 컴포넌트에서는 React가 전체 렌더링 흐름을 관리하고, 개발자는 특정 생명주기 메서드만 구현했습니다. + +```ts +class MyComponent extends React.Component { + componentDidMount() { + console.log("데이터 요청"); + } + + componentWillUnmount() { + console.log("정리 작업"); + } + + render() { + return