javascript 함수과정, 그 중에서도 콜백함수를 이용한 변수처리와 argument를 이용한 함수 내에 활용을 익히는 중이었다.
사용된 문장은 다음과 같다
const add = (a, b) => a + b;
const sub = (a, b) => a - b;
const mul = (a, b) => a * b;
const div = (a, b) => a / b;
function doMultiArms (x, y, ...arms) {
let result = x;
for (const arm of arms) {
if (typeof arm !== 'function') continue;
result = arm(result, y);
}
return result;
}
console.log(
doMultiArms(8, 3, add, mul, 1, true), // 33
doMultiArms(8, 3, add, mul, sub), // 30
doMultiArms(8, 3, add, mul, sub, div), // 10
doMultiArms(8, 3, add, mul, sub, div, (x, y) => x ** y) // 1000
);
이 함수를 처리하는 과정에서 가장 중요한 것은 초기 x, y 값은 정해져 있으며 ...arms라는 rest parameters를 가지고 이것은 배열로 취급 된다. (실제 argument는 배열은 아니지만 배열과 같은 동작을 한다고 한다.)
다만 doMultiArms 내부의 콜백함수로 x값이 계속 변하며, y값만이 고정된다.
result = arm(result, y) 을 반환하기때문이다.
그리고 가변인수를 순회할 때는 반드시 왼쪽에서 오른쪽으로 진행한다.
즉, arms를 순회하며 각 arm값이 함수의 형태가 아니면 건너뛰고(continue;) 다음 인자를 받아오며
이에 따라 console.log(doMultiArms(8, 3, add, mul, 1, true)); 의 값을 순차적으로 전개하자면 다음과 같다.
x는 8, y는 3
그리고 함수와 숫자형 1, boolean인 true 을 가지고 있다.
따라서 함수인 doMultiArms(add); 와 그 값을 x로 가진 doMultiArms(mul); 즉
doMultiArms(add); * 3 을 전개한 값이 된다.
가장 먼저 doMultiArms(add); 값을 전개하면 (8+3)의 값인 11을 가지게 된다.
doMultiArms(mul); 값을 전개하면 단독으로 쓰였다면 (8x3)인 24 의 값을 가졌겠지만
doMultiArms(8, 3, add, mul, 1, true); 의 값으로 쓰였으므로
doMultiArms(add); 를 진행 한 뒤 11로 변한 x을 받아 (11x3)인 33이 된다.
그런데 이 부분에서 검토하는 과정을 거칠 때 gpt는 다른 해석을 내놓게 되었고, 그냥 지나칠 수 있는 부분을 깊게 파게 되었다.
설명이 부실해서 그런가 이후 수차례 다른 식으로 질문을 넣어봤으나 결과는 같았다.
나는 y의 변수가 1이되는 부분을 이해 할 수 없었다.
왜냐면, 해당 식은 x에만 계속해서 변수값이 늘어나는 형식이고 y값은 초기의 값인 3을 그대로 따르는 값으로 이해를 했기 때문이다.
결과론적으로 구글 Bard에 교차검증을 했을 때, gpt에서 무언가 다른 답을 출력하고 있는 것을 확인했다.
약 1시간 30분 어떻게하면 gpt에서 올바른 답을 출력시킬 수 있을까 고민한 끝에 찾아낸 문장은 다음과 같았다.
y값이 변하는 이유를 arms 안의 1을 두 번째 인자로 사용해서 계산했던 탓에 그랬던 것 같아 이 부분을 되물었다.
이후 아주 쉽게 정상적으로(내가 의도한 대로) 답변을 주기 시작했다.
오래걸렸지만, 덕분에 왜 이렇게 전개가 되는지 역으로 설명을 할 수 있게 되는 시간을 가질 수 있었다.
gpt를 더블체크용도로 사용함으로써 조금 더 논리적으로 공부하는 시간을 가질 수 있었다.
금일 gpt와 나눈 대화 (첫 번째 주고 받은 내용은 이전 공부 과정이었다.)
https://chat.openai.com/share/10379d31-bb29-4be5-97cd-31b3bfc56b5d
'JavaScript' 카테고리의 다른 글
2023.12.22 기록 (firebase 관련) (1) | 2023.12.22 |
---|---|
2023.12.20 기록 (객체와 prototype, 그리고 includes) (0) | 2023.12.20 |
2023.12.15 기록 (javascript 연산자) (1) | 2023.12.15 |
2023.12.11 기록 (javascript 객체 기초) (1) | 2023.12.11 |
2023.12.8 기록 (String.prototype.includes) (0) | 2023.12.11 |