[TIL/JavaScript] 2023/01/19

원민관·2023년 1월 19일
0

[TIL]

목록 보기
16/159

Array.prototype.reduce()

오늘도 역시 array의 method에 관해 공부했다. 'reduce'라는 method인데, 본래 뜻에 맞게 "배열에 있는 데이터의 값을 감소시키거나 제거하는 method가 아닐까?" 하는 예상을 했으나 보기 좋게 빗나갔다.

퇴고하면서 다시 생각해봤는데 감소시키는게 줄이는 것이고, 결국 '축약' 아닌가?

'reduce'는 배열의 요소들을 누적 계산하여 하나의 값으로 축약하는 method이다. reduce의 기본적인 구조는 다음과 같다.

콘솔로 찍었을 때 15가 나오는 것을 보니, 배열 내부의 모든 데이터를 누적하여 더해서 '15'라는 하나의 값으로 축약했다는 것은 알았다. 그런데 도대체 'accumulator'와 'currentValue'가 각각 무슨 역할을 하기에 값이 '15'로 축약되는 것일까? 답은 정해져있다. 콘솔로 찍어보면 된다.

다른 콘솔은 차치하고, 오직 'accumulator'만을 콘솔로 찍었을 때 어떤 값이 추출되는지를 확인해봤다. '1, 3, 6, 10'이 입력되었음을 확인할 수 있다. ??? 이게 뭐지? 잠시 숨을 고르고 상황을 정리했다.

"'accumulator'는 <다음으로 예정된> <누적을 대기중인>, '이전의 값'이구나"라고 생각했다. 총합이 15인데 15가 터미널에 입력되지 않았다는 사실에 초점을 맞추고 정리한 한 줄이다. 실제로 구글링을 해보니 다양한 예제에서 accumulator로 표기하기 보다는 previousValue로 해당 값을 나타내고 있다는 점을 확인할 수 있었다.

'currentValue'의 값도 바로 확인해봤다.

'2, 3, 4, 5'가 출력되었다.

accumulator(=preiviousValue)의 값이 '1, 3, 6, 10'이고, currentValue의 값이 '2, 3, 4, 5'이다. 1에서 2를 더하니 대기값이 3이 되고, 3에서 3을 더하니 대기값이 6이 되고...

결론은 'currentValue'는 실제로 누적되는 값이라는 사실을 확인할 수 있다.

'누적을 대기중인 값'과 '실제로 누적되는 값'의 합은 최종적으로 '하나의 누적된 값'이 되는 것이다. 비로소 왜 'MDN'에서 reduce를 'call-back function'이라고 명명하는지 이해했다.

전체적인 흐름을 이해한 뒤에는, reduce method를 다양한 방식으로 표현하는 법을 손으로 직접 익혔다.

상단의 코드와 동일한 결과값을 output하지만 arrow function을 사용함으로써 코드가 더욱 간결해졌음을 알 수 있다.

추가적으로, array 내부에 'object'가 있을 때는 reduce를 메소드로서 어떻게 사용하는지 살펴보았다.

array에 object가 있어도 reduce method를 사용하는 방식에는 변화가 없다. 다만 터미널에 오류가 입력되었다. 초깃값을 입력해야 한다.

초깃값으로 0을 주면, 원하던 결과를 얻을 수 있다.

아니 근데 앞에서 많은 예제를 입력할 때에는 초깃값을 따로 요구하지 않았는데, 왜 이번에만 초깃값을 주지 않았다고 오류를 내뱉는 것인가... 이건 모르겠다.

꼭 더하기로만 하나의 값으로 축약할 이유는 없지 않은가. 곱하기도 해봤다.

당연하게도 120이 현출되었다.

회고

요즘 array의 method를 공부하며, 필요한 내용을 구글링을 하든 유튜브를 보든 다양한 방법으로 소위 '자기주도적 학습'을 하고 있는데 꽤나 뿌듯하고 재밌다.

최근에 인상깊은 영상을 봤다. 영상의 요지는 다음과 같다. 많은 사람들이 보편적으로 '국밥'을 맛있는 음식이라고 인식하는데, 결정적인 이유가 '본인이 직접 간을 하기 때문'이라고 한다. 생각해보니 국밥집을 가면 보통 다대기, 새우젓 등을 통해 본인이 먹을 국밥의 간을 '커스터마이징'하게 된다.

'자기주도적 학습'과 '국밥의 간'에서 도출할 수 있는 귀납적인 통찰은 '선택과 책임'이다. 내가 선택한 삶의 요소들을 오롯이 내가 책임지겠다는 태도는, '책임'이라는 단어의 뜻이 무색하게도 도리어 마음의 무게를 낮춰준다.

사람들은 해야 하는 일은 아무 생각 없이 하면서도, 유독 하고 싶은 일에 대해서는 '가능성'을 점친다. 하고 싶은 일이 있다면 하기로 선택하고(=해야 하는 일로 치환하고) 그 선택에 오롯이 책임지는 태도가 필요하다. 이것이 곧 '결과'보다는 '과정'에 집중하는 것이고, '과정'을 소중히 여길 수 있어야 우리의 삶이 조금 더 행복하지 않을까? 인생은 결국 과정의 연속이니까.

내일은 '호이스팅'의 개념을 한번 잡고 공부를 시작하자, 화이팅!

profile
Write a little every day, without hope, without despair ✍️

0개의 댓글