18. 똑똑한 코드 패턴 (디자인 패턴)/18.2 팩토리 패턴

18.2.1 팩토리 패턴 - 무엇이든 만들어주는 따뜻한 공방

thejavascript4kids 2025. 7. 27. 05:59

📘 18.2.1 팩토리 패턴 - 무엇이든 만들어주는 따뜻한 공방

안녕하세요, 여러분. 혹시 동네에 있는 작은 빵집을 가본 적이 있나요? 그곳에서는 "크림빵 하나 주세요", "식빵 두 개 주세요"라고 말하면 따뜻한 빵을 내어주죠. 우리는 밀가루를 반죽하는 법도, 오븐 온도를 맞추는 법도 모르지만, 그저 원하는 빵을 말하기만 하면 되거든요.

오늘 함께 배울 '팩토리 패턴'은 바로 그런 따뜻한 빵집 같은 코딩 방법이에요. 우리가 원하는 것을 말하기만 하면, 복잡한 과정은 모두 맡겨두고 완성된 결과물을 받을 수 있답니다.

자, 그럼 함께 이 특별한 프로그래밍 공방으로 들어가 볼까요?

🧠 먼저 용어를 알아볼까요?

프로그래밍에서도 우리만의 공방을 만들 수 있어요. 관련된 용어들을 차근차근 알아보겠습니다.

용어 의미
팩토리 패턴 필요한 것을 주문하면 척척 만들어주는 공방 같은 코딩 방법이에요
새로운 것 만들기 프로그램에서 새로운 정보 묶음을 만드는 과정이에요
만들기 방법 숨기기 만드는 방법과 사용하는 방법을 나누어 두는 것이에요
팩토리 함수 공방에서 물건을 만들어주는 숙련된 장인의 손길 같은 것이에요

이런 용어들이 처음에는 낯설 수 있어요. 하지만 차근차근 함께 알아가다 보면 분명 친숙해질 거예요.

✨ 팩토리 패턴의 핵심 개념

팩토리 패턴은 정말 멋진 도구예요! 무엇이든 만들어주는 따뜻한 공방을 코드로 만드는 것이거든요.

좀 더 자세히 말씀드릴게요. 보통 우리가 뭔가 필요할 때는 직접 만들어야 하죠. 하지만 팩토리 패턴을 사용하면 숙련된 장인에게 주문만 하면 되어요! "로봇 하나 부탁해요", "자동차 하나 만들어주세요"라고 말하면 공방에서 정성스럽게 만들어준답니다.

가장 좋은 점은 우리가 만드는 방법을 일일이 알 필요가 없다는 거예요. 로봇을 만들 때 어떤 부품이 필요한지, 어떤 순서로 조립해야 하는지 몰라도 괜찮아요. 그냥 "로봇 부탁해요!"라고 하면 끝!

또한 공방에서 새로운 제작 기법을 익혀도 우리가 주문하는 방법은 바뀌지 않아요. 공방 주인이 로봇을 더 잘 만드는 방법을 배워도, 우리는 여전히 "로봇 부탁해요!"라고 말하기만 하면 더 훌륭한 로봇을 받을 수 있어요.

그리고 비슷한 종류의 여러 가지 물건을 만들 때 특히 유용해요. 예를 들어, 동물 공방에서는 "강아지", "고양이", "새" 등 다양한 동물을 만들 수 있지만, 모두 "동물을 만들어주세요"라는 같은 방식으로 주문할 수 있답니다.

비유로 이해하기: 할머니의 밑반찬가게

팩토리 패턴을 '할머니의 밑반찬가게'에 비유해볼게요.

이 특별한 밑반찬가게에는 할머니가 계세요. 손님들이 "김치 주세요!", "콩나물무침 주세요!", "시금치나물 주세요!"라고 주문하면, 할머니가 뒤편에서 정성스럽게 만들어 주세요.

손님들은 배추를 소금에 절이는 방법도, 고춧가루를 언제 넣는지도, 얼마나 숙성시켜야 하는지도 알 필요 없어요. 그냥 "김치 주세요!"라고 말하면 맛있는 김치가 나와요.

더 놀라운 건, 할머니가 새로운 요리법을 배우셔도 손님들이 주문하는 방법은 바뀌지 않는다는 거예요. 할머니가 김치를 더 맛있게 담그는 비법을 알게 되셔도, 손님들은 여전히 "김치 주세요!"라고만 하면 더 맛있는 김치를 받을 수 있어요.

그리고 모든 밑반찬은 "집에서 만든 반찬"이라는 공통점을 가지고 있어서, 손님들은 어떤 반찬을 주문하든 비슷한 방식으로 드실 수 있어요. 이것이 바로 팩토리 패턴의 장점이에요!

🎯 팩토리 패턴을 사용하는 이유

그렇다면 왜 이런 공방을 만들까요? 정말 좋은 이유들이 많아요!

첫 번째, 복잡한 만들기 과정을 감춰줄 수 있어요. 로봇을 만들려면 정말 많은 부품과 복잡한 조립 과정이 필요해요. 하지만 공방이 이 모든 것을 처리해주니까 우리는 간단하게 "로봇 부탁해요!"라고만 하면 되어요. 마치 복잡한 요리 과정을 모르고도 맛있는 음식을 주문할 수 있는 것처럼요.

두 번째, 같은 종류의 것을 여러 번 만들 때 편해요. 게임에서 몬스터를 100마리 만들어야 한다면, 100번 복잡한 과정을 반복하는 대신 공방에 "몬스터 100마리 부탁해요!"라고 주문하면 되어요. 마치 사진관에서 사진을 여러 장 인쇄하는 것처럼 간단해요.

세 번째, 코드를 바꾸기가 쉬워져요. 로봇의 모양이 바뀌어도 공방 안의 제작 방법만 바꾸면 되고, 로봇을 주문하는 모든 곳의 코드는 그대로 둘 수 있어요. 마치 요리 레시피가 바뀌어도 손님이 주문하는 방법은 그대로인 것처럼요.

네 번째, 실수를 줄일 수 있어요. 복잡한 만들기 과정을 여러 곳에서 반복하면 실수할 가능성이 높아져요. 하지만 공방에서 한 번만 올바르게 만들어두면 모든 곳에서 완벽한 제품을 받을 수 있어요. 마치 검증된 레시피로 요리하면 항상 맛있는 음식이 나오는 것처럼요.

다섯 번째, 새로운 종류를 쉽게 추가할 수 있어요. 동물 공방에 새로운 동물을 추가하고 싶으면 공방에만 새로운 제작법을 추가하면 되고, 동물을 주문하는 코드는 바꿀 필요가 없어요. 마치 메뉴판에 새로운 요리를 추가해도 주문하는 방법은 그대로인 것처럼요.

⚙️ 팩토리 패턴의 기본 구조

이제 공방이 어떻게 만들어지는지 살펴볼까요? 기본적인 구조는 이렇게 되어 있어요.

// 간단한 장난감 공방 함수
function 장난감만들기(종류) {
  // 주문받은 종류에 따라 다른 장난감을 만들어요
  if (종류 === "로봇") {
    return {
      이름: "멋진 로봇",       // 로봇의 이름
      색깔: "파란색",         // 로봇의 색깔
      소리내기: function() {
        console.log("삐삐! 로봇이에요!");  // 로봇이 내는 소리
      }
    };
  } 
  else if (종류 === "인형") {
    return {
      이름: "예쁜 인형",       // 인형의 이름
      색깔: "분홍색",         // 인형의 색깔
      소리내기: function() {
        console.log("안녕하세요! 인형이에요!");  // 인형이 내는 소리
      }
    };
  }
  else if (종류 === "자동차") {
    return {
      이름: "빠른 자동차",     // 자동차의 이름
      색깔: "빨간색",         // 자동차의 색깔
      소리내기: function() {
        console.log("부릉부릉! 자동차예요!");  // 자동차가 내는 소리
      }
    };
  }

  // 모르는 종류면 기본 장난감을 만들어줘요
  return {
    이름: "기본 장난감",      // 기본 장난감의 이름
    색깔: "흰색",           // 기본 장난감의 색깔
    소리내기: function() {
      console.log("안녕하세요!");  // 기본 장난감이 내는 소리
    }
  };
}

이 공방 함수를 보면, 우리가 "로봇", "인형", "자동차" 중 하나를 주문하면 그에 맞는 장난감을 만들어줘요. 각 장난감은 이름, 색깔, 소리내기라는 공통된 특징을 가지고 있지만, 종류에 따라 다른 값을 가져요.

🧪 따뜻한 예제로 익혀보기

이제 실제로 여러 가지 사랑스러운 공방들을 만들어보겠어요!

🔹 예제 1: 애완동물 공방 만들기

우리만의 사랑스러운 애완동물을 만들어주는 공방을 만들어보겠어요!

// Ex1) 사랑스러운 애완동물을 만들어주는 공방을 만들어보자
function 애완동물만들기(종류, 이름) {
  // 모든 애완동물이 가지는 따뜻한 특징들
  const 애완동물 = {
    이름: 이름,           // 애완동물의 이름
    배고픔: 50,           // 배고픔 정도 (0-100)
    행복도: 80,           // 행복한 정도 (0-100)

    // 모든 애완동물이 할 수 있는 다정한 행동들
    밥먹기: function() {
      this.배고픔 = Math.max(0, this.배고픔 - 20);      // 배고픔을 20 줄여요 (최소 0)
      this.행복도 = Math.min(100, this.행복도 + 10);    // 행복도를 10 늘려요 (최대 100)
      console.log(`${this.이름}이(가) 맛있게 밥을 먹었어요! 🍽️`);
    },

    놀기: function() {
      this.행복도 = Math.min(100, this.행복도 + 15);    // 행복도를 15 늘려요 (최대 100)
      this.배고픔 = Math.min(100, this.배고픔 + 10);    // 배고픔을 10 늘려요 (최대 100)
      console.log(`${this.이름}이(가) 즐겁게 놀았어요! 🎾`);
    },

    상태확인: function() {
      console.log(`🐾 ${this.이름}의 상태:`);
      console.log(`   배고픔: ${this.배고픔}/100`);       // 현재 배고픔 상태
      console.log(`   행복도: ${this.행복도}/100`);       // 현재 행복 상태
    }
  };

  // 종류에 따라 특별한 특징과 행동 추가하기
  if (종류 === "강아지") {
    애완동물.울음소리 = "멍멍";                         // 강아지만의 울음소리
    애완동물.품종 = "골든 리트리버";                    // 강아지 품종

    애완동물.짖기 = function() {
      console.log(`${this.이름}: ${this.울음소리}! 🐕`);  // 강아지가 짖는 행동
    };

    애완동물.공가져오기 = function() {
      console.log(`${this.이름}이(가) 공을 물고 돌아왔어요! 🎾`);
      this.행복도 = Math.min(100, this.행복도 + 20);    // 행복도를 20 늘려요
    };
  } 
  else if (종류 === "고양이") {
    애완동물.울음소리 = "야옹";                         // 고양이만의 울음소리
    애완동물.품종 = "페르시안";                         // 고양이 품종

    애완동물.울기 = function() {
      console.log(`${this.이름}: ${this.울음소리}~ 🐱`); // 고양이가 우는 행동
    };

    애완동물.나무타기 = function() {
      console.log(`${this.이름}이(가) 나무를 쑥쑥 올라가요! 🌳`);
      this.행복도 = Math.min(100, this.행복도 + 15);    // 행복도를 15 늘려요
    };
  }
  else if (종류 === "새") {
    애완동물.울음소리 = "짹짹";                         // 새만의 울음소리
    애완동물.품종 = "카나리아";                         // 새의 품종

    애완동물.노래하기 = function() {
      console.log(`${this.이름}: ${this.울음소리}♪ 아름다운 노래를 불러요! 🎵`);
    };

    애완동물.날기 = function() {
      console.log(`${this.이름}이(가) 하늘 높이 날아올라요! 🕊️`);
      this.행복도 = Math.min(100, this.행복도 + 25);    // 행복도를 25 늘려요
    };
  }

  return 애완동물;  // 완성된 애완동물을 돌려줘요
}

// 애완동물 공방 사용해보기
console.log("=== 🏭 애완동물 공방에 오신 것을 환영합니다! ===");

const 내강아지 = 애완동물만들기("강아지", "바둑이");     // 강아지 바둑이 만들기
const 내고양이 = 애완동물만들기("고양이", "나비");       // 고양이 나비 만들기
const 내새 = 애완동물만들기("새", "피요");              // 새 피요 만들기

console.log("\n🐕 강아지 바둑이:");
내강아지.상태확인();       // 바둑이의 현재 상태 확인
내강아지.짖기();          // 바둑이가 짖기
내강아지.공가져오기();     // 바둑이가 공 가져오기
내강아지.밥먹기();        // 바둑이가 밥 먹기

console.log("\n🐱 고양이 나비:");
내고양이.상태확인();       // 나비의 현재 상태 확인
내고양이.울기();          // 나비가 울기
내고양이.나무타기();       // 나비가 나무 타기
내고양이.놀기();          // 나비가 놀기

console.log("\n🐦 새 피요:");
내새.상태확인();          // 피요의 현재 상태 확인
내새.노래하기();          // 피요가 노래하기
내새.날기();             // 피요가 날기

🔹 예제 2: 게임 캐릭터 공방 만들기

이번에는 게임 캐릭터를 만들어주는 공방을 만들어보겠어요!

// Ex2) 멋진 게임 캐릭터를 만들어주는 공방을 만들어보자
class 캐릭터공방 {
  캐릭터만들기(직업, 이름) {
    // 모든 캐릭터의 기본 능력치와 기능
    const 캐릭터 = {
      이름: 이름,           // 캐릭터의 이름
      직업: 직업,           // 캐릭터의 직업
      레벨: 1,             // 시작 레벨
      체력: 100,           // 기본 체력
      경험치: 0,           // 시작 경험치

      // 모든 캐릭터가 할 수 있는 기본 행동들
      레벨업: function() {
        this.레벨++;                                      // 레벨을 1 올려요
        this.체력 += 20;                                  // 체력을 20 늘려요
        console.log(`🎉 ${this.이름}이(가) 레벨 ${this.레벨}이 되었어요!`);
        console.log(`   체력이 ${this.체력}로 증가했어요!`);
      },

      휴식하기: function() {
        this.체력 = 100;                                  // 체력을 완전히 회복해요
        console.log(`😴 ${this.이름}이(가) 휴식을 취해서 체력이 완전히 회복되었어요!`);
      },

      정보보기: function() {
        console.log(`⚔️ ${this.이름} (${this.직업})`);      // 캐릭터 기본 정보
        console.log(`   레벨: ${this.레벨}`);               // 현재 레벨
        console.log(`   체력: ${this.체력}`);               // 현재 체력
        console.log(`   경험치: ${this.경험치}`);            // 현재 경험치
      }
    };

    // 직업에 따른 특별한 능력과 기술 추가
    if (직업 === "전사") {
      캐릭터.체력 = 150;                                   // 전사는 체력이 더 많아요
      캐릭터.공격력 = 30;                                  // 전사의 공격력

      캐릭터.칼공격 = function(대상) {
        console.log(`⚔️ ${this.이름}이(가) 칼로 ${대상}을(를) 공격해요! 데미지: ${this.공격력}`);
        this.경험치 += 10;                                // 경험치를 10 얻어요
      };

      캐릭터.방어하기 = function() {
        console.log(`🛡️ ${this.이름}이(가) 방패로 공격을 막아내요!`);
      };

    } else if (직업 === "마법사") {
      캐릭터.체력 = 80;                                    // 마법사는 체력이 적어요
      캐릭터.마나 = 100;                                   // 마법사의 마나
      캐릭터.마법력 = 40;                                  // 마법사의 마법력

      캐릭터.마법공격 = function(마법이름, 대상) {
        if (this.마나 >= 10) {                            // 마나가 10 이상이어야 해요
          console.log(`✨ ${this.이름}이(가) ${마법이름} 마법으로 ${대상}을(를) 공격해요!`);
          console.log(`   마법 데미지: ${this.마법력}`);
          this.마나 -= 10;                                // 마나를 10 소모해요
          this.경험치 += 15;                              // 경험치를 15 얻어요
        } else {
          console.log(`😓 ${this.이름}의 마나가 부족해요!`);  // 마나 부족 메시지
        }
      };

      캐릭터.명상하기 = function() {
        this.마나 = Math.min(100, this.마나 + 30);         // 마나를 30 회복해요 (최대 100)
        console.log(`🧘 ${this.이름}이(가) 명상을 통해 마나를 회복해요! 현재 마나: ${this.마나}`);
      };

    } else if (직업 === "궁수") {
      캐릭터.체력 = 100;                                   // 궁수의 기본 체력
      캐릭터.화살 = 20;                                    // 궁수의 화살 개수
      캐릭터.정확도 = 85;                                  // 궁수의 명중률

      캐릭터.활쏘기 = function(대상) {
        if (this.화살 > 0) {                             // 화살이 있어야 해요
          console.log(`🏹 ${this.이름}이(가) 화살로 ${대상}을(를) 공격해요!`);
          console.log(`   명중률: ${this.정확도}%`);
          this.화살--;                                    // 화살을 1개 소모해요
          this.경험치 += 12;                              // 경험치를 12 얻어요
          console.log(`   남은 화살: ${this.화살}개`);
        } else {
          console.log(`😅 ${this.이름}의 화살이 다 떨어졌어요!`);  // 화살 부족 메시지
        }
      };

      캐릭터.화살모으기 = function() {
        this.화살 += 5;                                   // 화살을 5개 추가해요
        console.log(`🎯 ${this.이름}이(가) 화살을 주워 모았어요! 현재 화살: ${this.화살}개`);
      };
    }

    return 캐릭터;  // 완성된 캐릭터를 돌려줘요
  }
}

// 캐릭터 공방 사용해보기
console.log("=== ⚔️ 게임 캐릭터 공방에 오신 것을 환영합니다! ===");

const 공방 = new 캐릭터공방();                        // 새로운 공방 만들기

const 용감한전사 = 공방.캐릭터만들기("전사", "아서");       // 전사 아서 만들기
const 현명한마법사 = 공방.캐릭터만들기("마법사", "머린");   // 마법사 머린 만들기
const 정확한궁수 = 공방.캐릭터만들기("궁수", "로빈");       // 궁수 로빈 만들기

console.log("\n⚔️ 전사 아서의 모험:");
용감한전사.정보보기();                                    // 아서의 정보 확인
용감한전사.칼공격("고블린");                              // 고블린 공격
용감한전사.방어하기();                                    // 방어 자세
용감한전사.레벨업();                                      // 레벨업

console.log("\n✨ 마법사 머린의 모험:");
현명한마법사.정보보기();                                  // 머린의 정보 확인
현명한마법사.마법공격("파이어볼", "오크");                // 오크에게 파이어볼
현명한마법사.마법공격("아이스볼", "트롤");                // 트롤에게 아이스볼
현명한마법사.명상하기();                                  // 마나 회복

console.log("\n🏹 궁수 로빈의 모험:");
정확한궁수.정보보기();                                    // 로빈의 정보 확인
정확한궁수.활쏘기("늑대");                                // 늑대 공격
정확한궁수.활쏘기("곰");                                  // 곰 공격
정확한궁수.화살모으기();                                  // 화살 모으기

🔹 예제 3: 학용품 공방 만들기

학교에서 사용할 여러 가지 학용품을 만들어주는 공방을 만들어보겠어요!

// Ex3) 유용한 학용품을 만들어주는 공방을 만들어보자
function 학용품만들기(종류, 색깔 = "파란색") {
  // 모든 학용품의 기본 특징
  const 학용품 = {
    종류: 종류,           // 학용품의 종류
    색깔: 색깔,           // 학용품의 색깔
    새것: true,           // 새 상품인지 여부

    // 공통 기능들
    사용하기: function() {
      this.새것 = false;                                  // 사용했으므로 새 것이 아니에요
      console.log(`${this.색깔} ${this.종류}을(를) 사용했어요!`);
    },

    정보보기: function() {
      const 상태 = this.새것 ? "새것" : "사용된 것";      // 상태 확인
      console.log(`📝 ${this.색깔} ${this.종류} (${상태})`);
    }
  };

  // 학용품 종류에 따른 특별한 기능들 추가
  if (종류 === "연필") {
    학용품.심길이 = 100;                                  // 연필심 길이 (0-100)
    학용품.지우개있음 = true;                             // 지우개 유무

    학용품.글쓰기 = function(내용) {
      if (this.심길이 > 0) {                             // 연필심이 있어야 해요
        console.log(`✏️ "${내용}"을(를) 연필로 썼어요!`);
        this.심길이 -= 5;                                // 연필심을 5만큼 소모해요
        this.사용하기();                                  // 사용했다고 표시해요
      } else {
        console.log(`😅 연필심이 다 닳아서 글을 쓸 수 없어요!`);
      }
    };

    학용품.깎기 = function() {
      this.심길이 = Math.min(100, this.심길이 + 20);      // 연필을 깎아서 심을 20만큼 늘려요
      console.log(`✂️ 연필을 깎았어요! 심 길이: ${this.심길이}%`);
    };

  } else if (종류 === "크레용") {
    학용품.색깔들 = ["빨강", "파랑", "노랑", "초록", "보라"];  // 사용 가능한 색깔들

    학용품.그림그리기 = function(그림) {
      const 사용색깔 = this.색깔들[Math.floor(Math.random() * this.색깔들.length)];  // 랜덤으로 색깔 선택
      console.log(`🎨 ${사용색깔} 크레용으로 ${그림}을(를) 그렸어요!`);
      this.사용하기();                                    // 사용했다고 표시해요
    };

    학용품.색깔보기 = function() {
      console.log(`🌈 사용 가능한 색깔: ${this.색깔들.join(", ")}`);  // 모든 색깔을 보여줘요
    };

  } else if (종류 === "지우개") {
    학용품.크기 = "보통";                                  // 지우개 크기
    학용품.남은량 = 100;                                  // 지우개 남은 양 (0-100)

    학용품.지우기 = function(대상) {
      if (this.남은량 > 0) {                             // 지우개가 남아있어야 해요
        console.log(`🧽 ${대상}을(를) 깨끗하게 지웠어요!`);
        this.남은량 -= 10;                                // 지우개를 10만큼 소모해요
        this.사용하기();                                  // 사용했다고 표시해요
      } else {
        console.log(`😓 지우개가 다 닳아서 더 이상 사용할 수 없어요!`);
      }
    };

  } else if (종류 === "자") {
    학용품.길이 = "30cm";                                 // 자의 길이
    학용품.눈금있음 = true;                               // 눈금 유무

    학용품.길이재기 = function(물건) {
      const 측정길이 = Math.floor(Math.random() * 25) + 1;   // 1-25cm 랜덤 측정
      console.log(`📏 ${물건}의 길이를 재었어요: ${측정길이}cm`);
      this.사용하기();                                    // 사용했다고 표시해요
    };

    학용품.선긋기 = function() {
      console.log(`📐 자를 이용해서 곧은 선을 그었어요!`);
      this.사용하기();                                    // 사용했다고 표시해요
    };
  }

  return 학용품;  // 완성된 학용품을 돌려줘요
}

// 학용품 공방 사용해보기
console.log("=== 📚 학용품 공방에 오신 것을 환영합니다! ===");

const 내연필 = 학용품만들기("연필", "노란색");            // 노란색 연필 만들기
const 내크레용 = 학용품만들기("크레용", "무지개색");      // 무지개색 크레용 만들기
const 내지우개 = 학용품만들기("지우개", "흰색");         // 흰색 지우개 만들기
const 내자 = 학용품만들기("자", "투명");                // 투명 자 만들기

console.log("\n✏️ 연필 사용해보기:");
내연필.정보보기();                                      // 연필 정보 확인
내연필.글쓰기("안녕하세요");                            // 연필로 글쓰기
내연필.글쓰기("오늘은 즐거운 하루예요");                 // 연필로 더 글쓰기
내연필.깎기();                                         // 연필 깎기

console.log("\n🎨 크레용 사용해보기:");
내크레용.정보보기();                                    // 크레용 정보 확인
내크레용.색깔보기();                                    // 사용 가능한 색깔 보기
내크레용.그림그리기("무지개");                          // 무지개 그리기
내크레용.그림그리기("꽃");                              // 꽃 그리기

console.log("\n🧽 지우개 사용해보기:");
내지우개.정보보기();                                    // 지우개 정보 확인
내지우개.지우기("틀린 글자");                           // 틀린 글자 지우기

console.log("\n📏 자 사용해보기:");
내자.정보보기();                                        // 자 정보 확인
내자.길이재기("책상");                                  // 책상 길이 재기
내자.선긋기();                                          // 선 긋기

🔄 팩토리 패턴 사용 과정 정리

지금까지 배운 팩토리 패턴 사용 과정을 차근차근 정리해보겠습니다.

첫 번째 단계는 무엇을 만들지 정하기입니다. "어떤 종류의 물건들을 만들 공방인가요?"를 생각해보세요. 동물 공방인지, 장난감 공방인지, 학용품 공방인지 정해야 해요. 마치 요리를 시작하기 전에 무엇을 만들지 메뉴를 정하는 것처럼요.

두 번째는 공방 설계하기입니다. 팩토리 함수나 클래스를 만들어서 "이런 주문이 들어오면 이런 걸 만들어줘야지"를 정의해요. 마치 공방의 설계도를 그리는 것처럼, 어떤 도구가 어떤 일을 할지 미리 계획하는 거예요.

세 번째는 만들기 조건 정하기입니다. "로봇 부탁해요", "인형 부탁해요" 같은 주문에 따라 어떤 물건을 만들지 결정하는 규칙을 만들어요. 마치 요리 레시피에서 재료에 따라 다른 요리를 만드는 것처럼요.

네 번째는 물건 만들고 포장하기입니다. 주문에 맞는 물건을 만들고, 필요한 기능들을 추가한 다음 완성된 제품을 돌려줘요. 마치 선물을 만들고 예쁘게 포장해서 주는 것처럼요.

다섯 번째는 공방 사용하기입니다. 물건이 필요할 때 복잡하게 직접 만들지 말고, 공방에 주문해서 받아 사용해요. 마치 빵이 먹고 싶을 때 직접 만들지 않고 빵집에서 사는 것처럼요.

마지막은 공방 개선하기입니다. 새로운 종류의 물건이 필요하면 공방에만 새로운 제작법을 추가하면 되고, 기존에 주문하던 방법은 바꾸지 않아도 돼요. 마치 빵집에서 새로운 빵을 만들기 시작해도 손님이 주문하는 방법은 그대로인 것처럼요.

🧚‍♀️ 이야기로 다시 배우기: 작은 마을의 공예 공방

지금까지 배운 내용을 따뜻한 이야기로 다시 정리해볼까요?

어느 작은 마을에 공예 공방이라는 특별한 곳이 있었어요. 이 공방에는 여러 명의 숙련된 장인들이 있었는데, 각각 다른 종류의 물건을 만들어주었어요.

목공 장인은 "책상 만들어주세요!", "의자 만들어주세요!"라고 주문하면 정성스럽게 만들어주었고, 도자기 장인은 "찻잔 만들어주세요!", "접시 만들어주세요!"라고 하면 아름다운 도자기를 만들어주었어요.

가장 감동적인 점은 마을 사람들이 어떻게 만드는지 몰라도 된다는 거였어요. 나무를 자르는 방법도, 점토를 빚는 방법도, 굽는 온도도 알 필요 없이 그냥 "이거 만들어주세요!"라고 말하기만 하면 완벽한 작품을 받을 수 있었거든요.

또 다른 놀라운 점은 장인들이 새로운 기법을 배워도 마을 사람들은 여전히 같은 방식으로 주문할 수 있다는 거였어요. 목공 장인이 더 좋은 나무 다루는 방법을 배워도, 마을 사람들은 여전히 "책상 만들어주세요!"라고만 하면 더 좋은 책상을 받을 수 있었어요.

새로운 작품이 필요할 때도 마찬가지였어요. 목공 장인이 새로운 종류의 가구를 만들기 시작해도, 마을 사람들이 주문하는 방법은 바뀌지 않았어요. 그냥 "새로운 가구 만들어주세요!"라고 하면 끝!

마을 사람들은 이 공방이 너무 고마워서 "우리 마을 최고!"라고 외쳤어요. 복잡한 제작 과정은 각 장인이 알아서 처리하고, 자신들은 필요한 것만 간단히 주문하면 되니까 정말 편했거든요.

이것이 바로 팩토리 패턴의 마음이에요! 복잡한 만들기 과정은 공방(팩토리)이 처리하고, 우리는 간단한 주문만 하면 원하는 물건을 받을 수 있는 거죠.

🧠 자주 하는 실수와 주의할 점

팩토리 패턴을 사용할 때 조심해야 할 실수들을 알아보겠어요.

❌ 실수 1: 공방에 너무 많은 일을 맡기기

// 이렇게 하면 안 돼요! 공방이 너무 복잡해져요
function 잘못된동물공방(종류, 이름) {
  const 동물 = 동물만들기(종류, 이름);            // 동물을 만들어요

  // 공방에서 동물을 만들고...
  동물훈련시키기(동물);                           // 훈련도 시키고...
  동물병원보내기(동물);                           // 병원도 보내고...
  동물보험가입하기(동물);                         // 보험도 가입시키고...
  동물집만들기(동물);                             // 집도 만들어주고...

  return 동물;  // 공방이 할 일이 너무 많아요!
}

// 올바른 방법: 공방은 만들기만!
function 올바른동물공방(종류, 이름) {
  // 공방은 동물을 만드는 것만 담당해요
  if (종류 === "강아지") {
    return {
      이름: 이름,                                   // 강아지의 이름
      울음소리: "멍멍",                             // 강아지의 울음소리
      짖기: function() {
        console.log(`${this.이름}: ${this.울음소리}!`);  // 짖는 행동
      }
    };
  }
  // ... 다른 동물들
}

// 다른 일들은 따로 처리해요
const 내강아지 = 올바른동물공방("강아지", "바둑이");   // 공방에서 강아지만 만들어요
훈련센터.훈련시키기(내강아지);                      // 훈련은 훈련센터에서
병원.검진받기(내강아지);                           // 병원 일은 병원에서

왜 문제가 될까요? 공방에 너무 많은 책임을 주면 공방이 복잡해지고 유지보수가 어려워져요. 공방은 만들기만 담당하고, 다른 일들은 다른 곳에서 처리하는 것이 좋아요.

❌ 실수 2: 문자열로 종류 구분하기 (오타 위험)

// 이렇게 하면 오타가 생기기 쉬워요!
const 로봇1 = 장난감만들기("로봇");                 // 정확함
const 로봇2 = 장난감만들기("로보트");               // 오타! 이상한 결과
const 로봇3 = 장난감만들기("Robot");               // 영어로 써서 문제

// 더 안전한 방법: 상수 사용하기
const 장난감종류 = {
  로봇: "로봇",           // 로봇 타입 정의
  인형: "인형",           // 인형 타입 정의
  자동차: "자동차"        // 자동차 타입 정의
};

function 안전한장난감공방(종류) {
  if (종류 === 장난감종류.로봇) {                   // 상수를 사용해서 비교
    return { 이름: "로봇", 타입: "기계" };          // 로봇 객체 반환
  }
  // ... 다른 장난감들
}

// 사용할 때 오타가 안 나요!
const 로봇 = 안전한장난감공방(장난감종류.로봇);      // 안전하게 로봇 만들기

왜 문제가 될까요? 문자열을 직접 사용하면 오타가 생기기 쉽고, 나중에 이름을 바꾸고 싶을 때 모든 곳을 찾아서 바꿔야 해요. 상수를 사용하면 오타도 방지하고 관리도 쉬워져요.

❌ 실수 3: 항상 다른 타입의 정보 묶음 반환하기

// 이렇게 하면 일관성이 없어서 사용하기 어려워요!
function 일관성없는공방(종류) {
  if (종류 === "숫자") {
    return 42;                              // 숫자 반환
  } else if (종류 === "문자열") {
    return "안녕하세요";                     // 문자열 반환
  } else if (종류 === "정보묶음") {
    return { 이름: "정보묶음" };             // 정보 묶음 반환
  } else if (종류 === "목록") {
    return [1, 2, 3];                       // 목록 반환
  }
}

// 올바른 방법: 비슷한 구조의 정보 묶음들 반환하기
function 일관성있는동물공방(종류) {
  // 모든 동물은 이름, 소리내기 기능을 가져요
  if (종류 === "강아지") {
    return {
      이름: "강아지",                        // 동물의 이름
      소리내기: function() {                 // 공통 기능
        console.log("멍멍!");               // 강아지 소리
      }
    };
  } else if (종류 === "고양이") {
    return {
      이름: "고양이",                        // 동물의 이름
      소리내기: function() {                 // 공통 기능
        console.log("야옹!");               // 고양이 소리
      }
    };
  }
  // 모든 반환값이 비슷한 구조를 가져요
}

왜 문제가 될까요? 공방에서 만든 제품들이 너무 다르면 사용하는 사람이 헷갈려요. 같은 공방에서 나온 제품들은 비슷한 방식으로 사용할 수 있어야 해요.

✏️ 연습문제로 개념 다지기

궁금한 것들이 있을 때, 함께 풀어보며 더 깊이 이해해봐요.

연습을 시작하기 전에 잠시 생각해보세요. 지금까지 어떤 프로그램들을 만들어봤는지, 그 과정에서 어떤 것들이 반복되었는지 말이에요. 그런 경험들이 있다면, 팩토리 패턴이 얼마나 도움이 될지 느껴보실 수 있을 거예요.

Q1. 간단한 음료수 공방을 만들어보세요!

// Ex1) 시원한 음료수를 만들어주는 공방을 만들어보자
function 음료수만들기(종류) {
  // 모든 음료수의 기본 특징
  const 음료수 = {
    종류: 종류,           // 음료수의 종류
    온도: "차가운",       // 음료수의 온도
    용량: "500ml",        // 음료수의 용량

    마시기: function() {
      console.log(`${this.종류}를 시원하게 마셨어요! 🥤`);
    },

    정보보기: function() {
      console.log(`🧃 ${this.종류} (${this.용량}, ${this.온도})`);
    }
  };

  // 음료수 종류에 따른 특별한 특징들
  if (종류 === "콜라") {
    음료수.색깔 = "검은색";           // 콜라의 색깔
    음료수.탄산 = true;              // 탄산 유무
    음료수.단맛 = "강함";            // 단맛 정도

    음료수.탄산소리 = function() {
      console.log("쉬이익~ 탄산이 톡톡! ✨");  // 탄산 소리 내기
    };

  } else if (종류 === "오렌지주스") {
    음료수.색깔 = "주황색";          // 오렌지주스의 색깔
    음료수.탄산 = false;            // 탄산 없음
    음료수.비타민 = "비타민C";       // 포함된 비타민

    음료수.건강효과 = function() {
      console.log(`${this.비타민}이 풍부해서 건강에 좋아요! 🍊`);
    };

  } else if (종류 === "물") {
    음료수.색깔 = "투명";            // 물의 색깔
    음료수.탄산 = false;            // 탄산 없음
    음료수.칼로리 = 0;              // 칼로리 없음

    음료수.갈증해소 = function() {
      console.log("깔끔하게 갈증이 해소되었어요! 💧");
    };
  }

  return 음료수;  // 완성된 음료수 반환
}

// 음료수 공방 사용해보기
const 콜라 = 음료수만들기("콜라");                     // 콜라 만들기
const 오렌지주스 = 음료수만들기("오렌지주스");          // 오렌지주스 만들기
const 물 = 음료수만들기("물");                        // 물 만들기

콜라.정보보기();          // 콜라 정보 확인
콜라.마시기();           // 콜라 마시기
콜라.탄산소리();         // 탄산 소리 내기

오렌지주스.정보보기();    // 오렌지주스 정보 확인
오렌지주스.마시기();     // 오렌지주스 마시기
오렌지주스.건강효과();   // 건강 효과 확인

물.정보보기();          // 물 정보 확인
물.마시기();           // 물 마시기
물.갈증해소();         // 갈증 해소 효과

Q2. 클래스를 사용해서 교통수단 공방을 만들어보세요!

// Ex2) 다양한 교통수단을 만들어주는 공방을 만들어보자
class 교통수단공방 {
  만들기(종류, 이름) {
    // 모든 교통수단의 기본 속성과 기능
    const 교통수단 = {
      이름: 이름,           // 교통수단의 이름
      종류: 종류,           // 교통수단의 종류
      속도: 0,             // 현재 속도
      연료: 100,           // 현재 연료량

      출발하기: function() {
        console.log(`🚗 ${this.이름}이(가) 출발해요!`);
      },

      정지하기: function() {
        this.속도 = 0;      // 속도를 0으로 설정
        console.log(`🛑 ${this.이름}이(가) 멈췄어요!`);
      },

      상태확인: function() {
        console.log(`🚙 ${this.이름} (${this.종류})`);
        console.log(`   속도: ${this.속도}km/h`);    // 현재 속도
        console.log(`   연료: ${this.연료}%`);       // 현재 연료량
      }
    };

    // 교통수단 종류별 특별한 기능들
    if (종류 === "자동차") {
      교통수단.최대속도 = 120;         // 자동차의 최대 속도
      교통수단.바퀴 = 4;              // 자동차의 바퀴 개수

      교통수단.가속하기 = function() {
        this.속도 = Math.min(this.최대속도, this.속도 + 20);  // 속도 증가 (최대속도 제한)
        this.연료 -= 5;                                       // 연료 소모
        console.log(`🏎️ 부릉부릉! 속도: ${this.속도}km/h`);
      };

      교통수단.경적울리기 = function() {
        console.log("빵빵! 🚗");      // 자동차 경적 소리
      };

    } else if (종류 === "자전거") {
      교통수단.최대속도 = 30;          // 자전거의 최대 속도
      교통수단.바퀴 = 2;              // 자전거의 바퀴 개수
      교통수단.연료 = "체력";         // 자전거는 연료 대신 체력

      교통수단.페달밟기 = function() {
        this.속도 = Math.min(this.최대속도, this.속도 + 10);  // 속도 증가
        console.log(`🚴 열심히 페달을 밟아요! 속도: ${this.속도}km/h`);
      };

      교통수단.벨울리기 = function() {
        console.log("딸랑딸랑! 🔔");   // 자전거 벨 소리
      };

    } else if (종류 === "비행기") {
      교통수단.최대속도 = 800;         // 비행기의 최대 속도
      교통수단.고도 = 0;              // 현재 비행 고도

      교통수단.이륙하기 = function() {
        this.속도 = 200;              // 이륙 속도 설정
        this.고도 = 10000;            // 비행 고도 설정
        this.연료 -= 20;              // 연료 소모
        console.log(`✈️ 이륙했어요! 고도: ${this.고도}m`);
      };

      교통수단.착륙하기 = function() {
        this.속도 = 0;               // 속도를 0으로 설정
        this.고도 = 0;               // 고도를 0으로 설정
        console.log(`🛬 안전하게 착륙했어요!`);
      };
    }

    return 교통수단;  // 완성된 교통수단 반환
  }
}

// 교통수단 공방 사용해보기
const 공방 = new 교통수단공방();                      // 공방 인스턴스 생성

const 내자동차 = 공방.만들기("자동차", "빨간 승용차");   // 자동차 만들기
const 내자전거 = 공방.만들기("자전거", "파란 자전거");   // 자전거 만들기
const 비행기 = 공방.만들기("비행기", "점보 제트");      // 비행기 만들기

console.log("🚗 자동차 테스트:");
내자동차.상태확인();      // 자동차 상태 확인
내자동차.출발하기();      // 자동차 출발
내자동차.가속하기();      // 자동차 가속
내자동차.경적울리기();    // 자동차 경적

console.log("\n🚴 자전거 테스트:");
내자전거.상태확인();      // 자전거 상태 확인
내자전거.출발하기();      // 자전거 출발
내자전거.페달밟기();      // 자전거 페달 밟기
내자전거.벨울리기();      // 자전거 벨 울리기

console.log("\n✈️ 비행기 테스트:");
비행기.상태확인();        // 비행기 상태 확인
비행기.출발하기();        // 비행기 출발
비행기.이륙하기();        // 비행기 이륙
비행기.착륙하기();        // 비행기 착륙

📚 복습 문제 - 지금까지 배운 내용 되돌아보기

18단원을 배우고 있는 여러분! 그동안 정말 많은 것들을 배웠죠? 이제 이전에 배운 중요한 내용들을 복습해보면서 기억을 되살려보겠어요!

🎯 복습 문제 1: 클래스 상속 (15-16단원)

// Q: 다음 클래스 상속 코드에서 실행 결과를 예상해보세요!

class 탈것 {
  constructor(이름) {
    this.이름 = 이름;
    this.속도 = 0;
  }

  출발하기() {
    console.log(`${this.이름}이(가) 출발합니다!`);
  }

  가속하기() {
    this.속도 += 10;
    console.log(`속도: ${this.속도}km/h`);
  }
}

class 자동차 extends 탈것 {
  constructor(이름, 연료량) {
    super(이름);                    // 부모 클래스 생성자 호출
    this.연료량 = 연료량;
  }

  가속하기() {                      // 메서드 오버라이딩
    if (this.연료량 > 0) {
      this.속도 += 20;              // 자동차는 더 빠르게 가속
      this.연료량 -= 5;             // 연료 소모
      console.log(`부릉부릉! 속도: ${this.속도}km/h, 연료: ${this.연료량}L`);
    } else {
      console.log("연료가 부족해요!");
    }
  }
}

const 내차 = new 자동차("소나타", 50);
내차.출발하기();                    // ?
내차.가속하기();                    // ?
내차.가속하기();                    // ?

해답과 설명:

  • 내차.출발하기(); → "소나타이(가) 출발합니다!" (부모 클래스의 메서드 상속)
  • 내차.가속하기(); → "부릉부릉! 속도: 20km/h, 연료: 45L" (자식 클래스의 오버라이딩된 메서드)
  • 내차.가속하기(); → "부릉부릉! 속도: 40km/h, 연료: 40L" (다시 가속)

설명: extends 키워드로 상속받으면 부모의 모든 기능을 물려받아요. super()로 부모 생성자를 호출하고, 같은 이름의 메서드를 만들면 부모 메서드를 덮어쓸 수 있어요(오버라이딩).

🎯 복습 문제 2: 비동기 처리와 Promise (13단원)

// Q: 다음 코드의 실행 순서를 예상해보세요!

console.log("1. 아침에 일어나기");

setTimeout(() => {
  console.log("2. 30분 후 아침 운동하기");
}, 3000);

Promise.resolve("3. 세수하기")
  .then(결과 => {
    console.log(결과);
    return "4. 양치하기";
  })
  .then(결과 => {
    console.log(결과);
  });

console.log("5. 옷 입기");

// 실제 실행되는 순서는?

해답과 설명:
실행 순서는 다음과 같아요:

  1. "1. 아침에 일어나기" (동기 코드)
  2. "5. 옷 입기" (동기 코드)
  3. "3. 세수하기" (Promise - 마이크로태스크 큐)
  4. "4. 양치하기" (Promise - 마이크로태스크 큐)
  5. "2. 30분 후 아침 운동하기" (setTimeout - 매크로태스크 큐, 3초 후)

설명: 자바스크립트는 동기 코드를 먼저 실행하고, 그 다음 Promise(마이크로태스크), 마지막에 setTimeout(매크로태스크)을 실행해요.

🎯 복습 문제 3: 모듈 시스템 (17단원)

// Q: 다음 모듈 코드를 분석해보세요!

// 계산기.js 파일
export function 더하기(a, b) {
  return a + b;
}

export function 빼기(a, b) {
  return a - b;
}

export default function 곱하기(a, b) {
  return a * b;
}

// main.js 파일
import 곱하기, { 더하기, 빼기 } from './계산기.js';

console.log(더하기(10, 5));        // ?
console.log(빼기(10, 5));          // ?
console.log(곱하기(10, 5));        // ?

// 다음 중 올바른 import 방법은?
// A) import { 곱하기 } from './계산기.js';
// B) import 곱하기 from './계산기.js';
// C) import * as 계산기 from './계산기.js';

해답과 설명:

  • 더하기(10, 5) → 15
  • 빼기(10, 5) → 5
  • 곱하기(10, 5) → 50

올바른 import 방법: B와 C 모두 가능해요

  • B) import 곱하기 from './계산기.js'; → default export를 가져오는 방법
  • C) import * as 계산기 from './계산기.js'; → 모든 export를 객체로 가져오는 방법 (이 경우 계산기.default()로 곱하기 함수 사용)

설명: export default는 기본 내보내기로 중괄호 없이 가져올 수 있고, 일반 export는 중괄호 안에 넣어서 가져와야 해요.

🤔 심화 문제로 실력 확인하기

Q1. 다음 코드의 문제점을 찾고 팩토리 패턴을 사용해서 개선해보세요.

// 문제가 있는 코드
function 게임만들기() {
  // 항상 같은 게임만 만들어요
  return {
    이름: "퍼즐 게임",                           // 고정된 게임 이름
    난이도: "쉬움",                             // 고정된 난이도
    시작하기: function() {
      console.log("퍼즐 게임을 시작합니다!");     // 고정된 메시지
    }
  };
}

// 다른 종류의 게임을 만들려면 새로운 함수를 만들어야 해요
function 액션게임만들기() {
  return {
    이름: "액션 게임",                           // 고정된 게임 이름
    난이도: "어려움",                           // 고정된 난이도
    시작하기: function() {
      console.log("액션 게임을 시작합니다!");     // 고정된 메시지
    }
  };
}

:

// 팩토리 패턴을 사용한 개선 코드
function 게임공방(종류, 난이도 = "보통") {
  // 모든 게임의 기본 특징
  const 게임 = {
    종류: 종류,           // 게임의 종류
    난이도: 난이도,       // 게임의 난이도
    점수: 0,             // 현재 점수
    플레이시간: 0,       // 플레이한 시간

    시작하기: function() {
      console.log(`🎮 ${this.종류}를 시작합니다! (난이도: ${this.난이도})`);
      this.플레이시간 = 0;  // 플레이 시간 초기화
    },

    점수올리기: function(점수) {
      this.점수 += 점수;    // 점수 추가
      console.log(`🏆 점수가 ${점수}점 올랐어요! 총점: ${this.점수}점`);
    },

    게임정보: function() {
      console.log(`📊 게임 정보:`);
      console.log(`   종류: ${this.종류}`);         // 게임 종류
      console.log(`   난이도: ${this.난이도}`);     // 게임 난이도
      console.log(`   점수: ${this.점수}점`);       // 현재 점수
      console.log(`   플레이 시간: ${this.플레이시간}분`);  // 플레이 시간
    }
  };

  // 게임 종류별 특별한 기능들
  if (종류 === "퍼즐게임") {
    게임.퍼즐개수 = 100;           // 퍼즐 조각 개수

    게임.퍼즐맞추기 = function() {
      console.log("🧩 퍼즐 조각을 맞췄어요!");
      this.점수올리기(10);         // 점수 10점 추가
      this.퍼즐개수--;             // 퍼즐 개수 감소
    };

    게임.힌트보기 = function() {
      console.log("💡 힌트: 모서리부터 맞춰보세요!");
    };

  } else if (종류 === "액션게임") {
    게임.생명력 = 3;              // 생명력
    게임.무기 = "검";             // 기본 무기

    게임.공격하기 = function(적) {
      console.log(`⚔️ ${this.무기}로 ${적}을 공격했어요!`);
      this.점수올리기(20);         // 점수 20점 추가
    };

    게임.피해받기 = function() {
      this.생명력--;              // 생명력 감소
      console.log(`💔 생명력이 줄었어요! 남은 생명력: ${this.생명력}`);
    };

  } else if (종류 === "레이싱게임") {
    게임.속도 = 0;               // 현재 속도
    게임.랩타임 = [];            // 랩 타임 기록

    게임.가속하기 = function() {
      this.속도 += 20;           // 속도 증가
      console.log(`🏎️ 가속! 현재 속도: ${this.속도}km/h`);
    };

    게임.완주하기 = function(시간) {
      this.랩타임.push(시간);     // 랩 타임 추가
      console.log(`🏁 완주! 기록: ${시간}초`);
      this.점수올리기(100);       // 점수 100점 추가
    };
  }

  return 게임;  // 완성된 게임 반환
}

// 개선된 게임 공방 사용해보기
const 퍼즐게임 = 게임공방("퍼즐게임", "쉬움");        // 쉬운 퍼즐게임
const 액션게임 = 게임공방("액션게임", "어려움");      // 어려운 액션게임
const 레이싱게임 = 게임공방("레이싱게임", "보통");     // 보통 레이싱게임

console.log("🧩 퍼즐 게임:");
퍼즐게임.시작하기();        // 퍼즐게임 시작
퍼즐게임.퍼즐맞추기();      // 퍼즐 맞추기
퍼즐게임.힌트보기();        // 힌트 보기
퍼즐게임.게임정보();        // 게임 정보 확인

console.log("\n⚔️ 액션 게임:");
액션게임.시작하기();        // 액션게임 시작
액션게임.공격하기("몬스터");  // 몬스터 공격
액션게임.피해받기();        // 피해 받기
액션게임.게임정보();        // 게임 정보 확인

해설: 원래 코드의 문제점과 개선 사항은 다음과 같습니다:

  1. 코드 중복: 각 게임마다 별도의 함수를 만들어야 해서 비슷한 코드가 반복되었습니다. 팩토리 패턴을 사용하여 하나의 함수로 여러 종류의 게임을 만들 수 있게 했습니다.

  2. 확장성 부족: 새로운 게임을 추가하려면 새로운 함수를 만들어야 했습니다. 개선된 코드에서는 팩토리 함수에 새로운 조건만 추가하면 됩니다.

  3. 일관성 부족: 각 게임이 다른 구조를 가질 수 있어서 사용하기 어려웠습니다. 개선된 코드에서는 모든 게임이 공통된 기본 기능을 가지면서도 각자의 특별한 기능을 추가로 가집니다.

  4. 기능 부족: 원래 코드는 게임의 기본적인 기능만 있었습니다. 개선된 코드에서는 점수, 플레이 시간, 게임별 특별 기능 등을 추가했습니다.

지금까지 팩토리 패턴에 대해 배우면서 복잡한 것 만들기 과정을 간단하게 만드는 방법을 알아보았어요. 마치 따뜻한 공방에 주문하는 것처럼, 우리가 원하는 것을 쉽게 만들 수 있는 정말 유용한 패턴이에요!

다음 시간에는 또 다른 흥미로운 패턴을 배워볼 거예요. 여러분도 오늘 배운 팩토리 패턴으로 나만의 공방을 만들어보세요! 🏭✨

✅ 학습 완료 체크리스트

이번 시간에 배운 내용들을 모두 이해했는지 확인해보세요!

학습 내용 이해했나요?
팩토리 패턴의 기본 개념
팩토리 패턴 사용 이유
기본 구조와 사용법
자주 하는 실수들과 주의점
실전 예제를 통한 활용법

📂 마무리 정보

오늘 배운 18.2.1 내용이 여러분의 자바스크립트 지식 상자에 잘 저장되었나요? 다음 시간에는 더 재미있는 내용으로 만나요!

기억할 점: 팩토리 패턴은 복잡한 만들기 과정을 감추고, 간단한 주문만으로 원하는 것을 만들 수 있게 해주는 정말 유용한 도구예요!


🚀 더 체계적인 JavaScript 학습을 원하신다면?
이 포스팅에서 다룬 내용을 실제로 실습해보세요!
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
📝 실시간 코드 실행 📊 학습 진도 관리 👥 체계적 커리큘럼
📚 171개 체계적 학습레슨 · 📋 855개 4지선다 연습문제 · 🆓 완전 무료 · ⚡ 즉시 시작