JavaScript

[JS] 코딩테스트 035 - 팩토리함수**** 클로저 개념

Irene1988 2025. 2. 17. 20:41
문제35 : Factory 함수 사용하기
2제곱, 3제곱, 4제곱을 할 수 있는 Factory 함수를 만들려고 합니다. 
pass에 코드를 작성하여 two함수를 완성하세요.

function one(n){
    function two(){
        //pass
    }
    return two;
}

const a = one(2);
const b = one(3);
const c = one(4);

console.log(a(10));
console.log(b(10));
console.log(c(10));
function one(n){
    function two(x){
        return Math.pow(x , n);
    }
    return two;
}

const a = one(2);
const b = one(3);
const c = one(4);

console.log(a(10));
console.log(b(10));
console.log(c(10));

 

* 팩토리 함수 개념이 이해가 안가는 문제이다.

다시 차근차근 확인해 봐야 한다.

 

코드 분석

 

  • one(n) 함수는 내부에 two(x)라는 함수를 정의하고 반환한다.
  • one(n)이 호출될 때, n 값이 고정된 상태로 유지(클로저) 된다.
  • 반환된 two(x) 함수는 n을 기억하고 Math.pow(x, n)을 실행한다.
  • a, b, c에는 서로 다른 n 값을 기억하는 함수가 저장된다.

2. 실행 흐름 분석

1) one(2) 실행

const a = one(2);

 

  • one(2)을 호출하면 내부의 two(x) 함수를 반환합니다.
  • 이때 n = 2가 클로저로 저장됩니다.
  • 즉, a는 two(x) { return Math.pow(x, 2); } 와 같은 함수가 됩니다.

 

 

2) one(3), one(4) 실행

const b = one(3);
const c = one(4);

 

  • b는 n = 3을 기억하는 two(x) { return Math.pow(x, 3); }
  • c는 n = 4를 기억하는 two(x) { return Math.pow(x, 4); }

 

 

3) console.log(a(10)) 실행

console.log(a(10)); // 10^2 = 100

 

  • a(10)은 two(10)을 실행합니다.
  • Math.pow(10, 2)를 계산해서 100이 출력됩니다.

 

 

4) console.log(b(10)), console.log(c(10)) 실행

console.log(b(10)); // 10^3 = 1000
console.log(c(10)); // 10^4 = 10000

 

 

  • b(10)은 Math.pow(10, 3) → 1000
  • c(10)은 Math.pow(10, 4) → 10000

3. 클로저(Closure) 개념

여기서 핵심 개념은 클로저(Closure) 

클로저란?
내부 함수가 외부 함수의 변수(n)를 기억하고 사용하는 것.
  • one(n)이 실행되면 n은 함수가 종료되면서 일반적으로 사라져야 합니다.
  • 하지만 내부 함수 two(x)가 반환되었고, 이 함수가 n을 사용하고 있기 때문에 n이 계속 유지됩니다.
  • 즉, a, b, c는 서로 다른 n 값을 기억하는 클로저 함수가 됩니다.

4. 시각적으로 이해하기

각 변수가 어떻게 값을 기억하는지 쉽게 보면:

변수 n 값 (클로저) 동작
a 2 a(x) → Math.pow(x, 2)
b 3 b(x) → Math.pow(x, 3)
c 4 c(x) → Math.pow(x, 4)

 

 


5. 요약

✅ one(n)은 n을 기억하는 two(x) 함수를 생성하는 팩토리 함수
✅ a, b, c는 각각 다른 n 값을 기억하는 클로저(Closure)
✅ console.log(a(10)) 실행 시 Math.pow(10, 2)를 계산

 

💡 팩토리 함수의 장점

  • 같은 구조의 함수를 재사용할 수 있음
  • n 값을 고정한 함수를 쉽게 생성 가능

6. 이해를 돕는 예제

이해를 더 쉽게 하기 위해, 곱하기 함수를 만드는 예제

function makeMultiplier(n) {
    return function(x) {
        return x * n;
    };
}

const double = makeMultiplier(2); // n = 2
const triple = makeMultiplier(3); // n = 3
const quadruple = makeMultiplier(4); // n = 4

console.log(double(10)); // 10 * 2 = 20
console.log(triple(10)); // 10 * 3 = 30
console.log(quadruple(10)); // 10 * 4 = 40

✔ makeMultiplier(n)는 n을 기억하는 곱셈 함수를 만들어 반환
✔ double, triple, quadruple은 각각 다른 n 값을 기억하는 클로저


7. 결론

팩토리 함수(one)는 특정 값을 기억하는 새로운 함수를 반환하는 함수
📌 클로저 덕분에 n 값을 유지할 수 있음
📌 이런 방식으로 동적으로 함수를 만들면 코드 재사용성이 증가