본문 바로가기

JavaScript

2023.12.19 기록 (콜백함수와 gpt에 대한 이야기)

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