짹뚜 스튜디오

[Javascript] Factory Functions 본문

개발 공부/javascript

[Javascript] Factory Functions

짹뚜 2022. 1. 23. 21:13

해당 글은 모든 자바스크립트 개발자가 알아야 하는 33가지 개념에서 열네 번째인 Factories and Classes 항목을 공부하면서 간단하게 작성한 글이다.

 

기본적으로 객체를 만들려면 다음과 같이 작성하면 된다.

const dog = {
    name: 'Max',
    eat: function(){
        return `Max eats`;
    }
}

그리고 만약 dog와 동일한 property를 가지고 있지만 value만 다른 객체를 만들고 싶다면 동일한 코드를 여러 번 작성해주면 된다.

const dogMax = {
    name: 'Max',
    eat: function(){
        return `Max eats`;
    }
}

const dogBaduki = {
    name: 'Baduki',
    eat: function(){
        return `Baduki eats`;
    }
}

const dogBaekgu = {
    name: 'Baekgu',
    eat: function(){
        return `Baekgu eats`;
    }
}

하지만 이런식으로 코드를 작성하면 코드가 길어지고 반복되는 코드가 많아져서 나중에 수정하기가 힘들다. 그래서 나온 개념이 Factory 함수이다. Factory 함수를 간단히 표현하면 객체를 만들고 반환하는 함수이다.

function dogFactoryFunction(name){
    return {
        name: name,
        eat: function() {
            return `${this.name} eats`
        }
    }
}

// 위에 코드를 줄이면 아래와 같다.
function dogFactoryFunction(name){
    return {
        name,
        eat() {
            return `${this.name} eats`
        }
    }
}

const Baekgu = dogFactoryFunction('Baekgu');
const Baduki = dogFactoryFunction('Baduki');
Baekgu.eat(); // 'Baekgu eats'
Baduki.eat(); // 'Baduki eats'

이렇게 작성하면 동일한 로직을 한 번만 작성하고 여러 개의 객체를 쉽게 만들어낼 수 있다.

 

Factory 함수의 또 다른 장점으로는 Closure를 활용한 Data privacy를 보장한다. 반환되는 객체에 포함되지 않고 Factory 함수 내에서 선언된 변수들은 외부에서 접근이 불가능하다. 위 예제에서는 Baekgu.name에 접근해서 해당 값을 변경을 할 수가 있다. 그래서 아래와 같이 작성을 하면 외부에서 name에 접근을 할 수가 없다.

function dogFactoryFunction(name){
    const legs = 4;
    return {
        eat() {
            return `${name} eats`
        }
    }
}

const Tom = dogFactoryFunction('Baekgu');
Baekgu.name; // undefined
Baekgu.legs; // undefined
Baekgu.eat(); // 'Baekgu eats'

 

'개발 공부 > javascript' 카테고리의 다른 글

[Javascript] Constructor (생성자 함수)  (0) 2022.02.07
[Javascript] this  (0) 2022.01.27
[Javascript] DOM  (0) 2022.01.21
[Javascript] Short-circuiting (단축평가)  (0) 2022.01.09
[Javascript] arguments  (0) 2022.01.09
Comments