상세 컨텐츠

본문 제목

생성자 함수, 팩토리 함수, constructor function, factory fanction

JavaScript

by 폴리프레임 2024. 8. 16. 08:18

본문

반응형

생성자 함수(Constructor Function)와 팩토리 함수(Factory Function)는 모두 객체를 생성하는 데 사용되지만, 각각의 방식에는 고유한 특징과 장단점이 있습니다. 이들 방법을 구분하여 사용하는 이유는 코드의 유연성과 목적에 따라 다릅니다.

 

1. 생성자 함수 (Constructor Function)

 

  • new 키워드 필요: 생성자 함수는 new 키워드를 사용하여 호출됩니다. new를 사용하면 함수가 암묵적으로 객체를 반환하고, 함수 내부의 this는 새로 생성된 객체를 가리킵니다.
  • 프로토타입 체인: 생성자 함수로 생성된 객체는 해당 함수의 프로토타입 객체에 연결됩니다. 이로 인해 생성된 모든 객체가 프로토타입에 정의된 메서드와 속성에 접근할 수 있습니다.
  • 메모리 효율성: 생성자 함수에서 프로토타입에 메서드를 정의하면, 생성된 모든 객체가 이 메서드를 공유합니다. 이는 메모리 효율성을 높여줍니다.
  • 객체가 프로토타입을 공유해야 할 때: 동일한 타입의 객체를 여러 개 생성하고, 이들이 공통된 메서드를 공유해야 하는 경우 생성자 함수를 사용하는 것이 적합합니다.
  • 클래스와 유사한 객체 지향 패턴: ES6 이전에는 생성자 함수가 클래스와 유사한 객체 지향 패턴을 구현하는 표준 방식이었습니다.
function Car(model, year) {
  this.model = model;
  this.year = year;
}

Car.prototype.start = function() {
  console.log(`${this.model} is starting.`);
};

const car1 = new Car('Toyota', 2020);
const car2 = new Car('Honda', 2021);

car1.start(); // "Toyota is starting."
car2.start(); // "Honda is starting."

 

 

2. 팩토리 함수 (Factory Function)

 

  • new 키워드 불필요: 팩토리 함수는 단순히 객체를 반환하는 함수입니다. new 키워드를 사용하지 않습니다.
  • 프로토타입 체인 없음: 팩토리 함수는 일반적으로 프로토타입 체인을 활용하지 않습니다. 객체의 메서드는 객체 내에 직접 정의되며, 각 객체가 고유한 메서드 인스턴스를 가질 수 있습니다.
  • 유연성: 팩토리 함수는 더 큰 유연성을 제공합니다. 조건부 로직을 추가하거나, 객체 반환 전에 추가 작업을 수행하기가 용이합니다.
  • 상속이 필요하지 않은 경우: 프로토타입을 통한 상속이 필요 없거나, 객체 간의 연결이 불필요할 때 팩토리 함수를 사용하는 것이 적합합니다.
  • 코드의 가독성과 유연성: 팩토리 함수는 조건부 객체 생성이나 추가적인 설정이 필요한 경우 더 읽기 쉽고 관리하기 쉽습니다.
  • 메모리 최적화가 덜 중요한 경우: 모든 객체가 자체적으로 메서드를 가질 필요가 있을 때, 팩토리 함수가 더 적합할 수 있습니다.
function createCar(model, year) {
  return {
    model: model,
    year: year,
    start() {
      console.log(`${this.model} is starting.`);
    }
  };
}

const car1 = createCar('Toyota', 2020);
const car2 = createCar('Honda', 2021);

car1.start(); // "Toyota is starting."
car2.start(); // "Honda is starting."

 

 

3. 구분하여 사용하는 이유

 

  • 프로토타입 기반 상속: 객체 간에 메서드를 공유하거나, 상속을 통해 메서드를 확장하려는 경우 생성자 함수가 더 적합합니다. 생성자 함수로 생성된 객체는 공통된 프로토타입을 공유하며, 이는 메모리 사용을 최적화하고 코드의 일관성을 유지하는 데 유리합니다.
  • 유연성과 간결성: 팩토리 함수는 더 큰 유연성을 제공하며, 단순히 새로운 객체를 반환하는 함수로, 코드가 간결하고 명확합니다. 특히 상속이나 프로토타입 체인을 활용할 필요가 없는 경우 팩토리 함수가 더 쉽게 이해되고 관리할 수 있습니다.
  • ES6 이후의 클래스 문법 사용: ES6 이후에는 class 문법이 도입되었으며, 이는 생성자 함수와 매우 유사한 구조를 가집니다. 복잡한 객체 지향 설계를 필요로 하는 경우 class를 사용하는 것이 좋으며, 팩토리 함수는 여전히 간단한 객체 생성에 유용합니다.

결론적으로, 생성자 함수는 객체 지향적 설계와 메모리 효율성이 중요한 경우 사용하고, 팩토리 함수는 유연성과 간결성이 필요한 경우 사용합니다.

 

관련글 더보기