문제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 값을 유지할 수 있음
📌 이런 방식으로 동적으로 함수를 만들면 코드 재사용성이 증가
'JavaScript' 카테고리의 다른 글
[JS] 코딩테스트 037 * 꼭 복습하기~! (0) | 2025.02.17 |
---|---|
[JS] 코딩테스트 036 - 구구단 for문 응용 (0) | 2025.02.17 |
[JS] 코딩테스트 032~034 - 배열의 split() 활용 및 sort() 정렬 메서드 (2) | 2025.02.17 |
[JS] 코딩테스트 031 - 내장함수의 시간 복잡도 (0) | 2025.02.17 |
[JS] 코딩테스트 030 - indexOf... 문자열 속 문자 찾기 메서드 (0) | 2025.02.17 |