본문 바로가기
코드잇 스프린트 6기/JS Q.R 스터디

[JS Q.R 스터디] 3번째 모임 질문 QnA

by 학습하는 청년 2024. 4. 25.

최종 수정 : 2024-04-25

JS Q.R 질문 QnA

1. 배열의 고차함수의 특징을 함수형 프로그래밍 관점에서 설명해주세요.

배열의 고차 함수(Higher-Order Function, HOF)는 함수를 인수로 전달받거나 함수를 반환한다. 자바스크립트의 함수는 일급 객체이므로 함수를 값처럼 인수로 전달할 수 있으며 반환할 수도 있다. 덕분에, 불변성(immutability)을 지향하는 함수형 프로그래밍 관점을 따를 수 있다. 결국, 순수 함수를 통해 부수 효과를 최대한 억제하여 오류를 피하고 프로그램의 안정성을 높이려는 목적을 두고 있다.


2. 배열의 메소드는 mutator method와 accessor method로 분류할 수 있습니다. 둘 중 권장되는 방법과 이유는 무엇인가요?

가급적 원본 배열을 직접 변경하지 않는 메서드(accessor method)를 사용하는 것이 좋다. 원본 배열을 변경하는 과정에서 인덱스 값이 달라지며, 그에 따라 요소들이 이동하는 상황이 발생한다. 이는 필연적으로 성능을 저하시키는 원인이 된다.

 

그래서 pop(), push(), unshift(), shift(), concat() 같은 원본 배열을 조작하는 메서드보다는 스프레드 문법을 사용하여 새로운 배열 형태로 만드는 것이 좋다.


3. 배열의 고차함수 reduce에 대한 설명과 유의할 점은 무엇이며, 사용되는 용례에 대해 얘기해주세요.

자신을 호출한 배열의 모든 요소를 순회하며 인수로 전달받은 콜백 함수를 반복 호출한다. 콜백 함수의 반환값을 다음 순회 시에 콜백 함수의 첫 번째 인수로 전달하면서 콜백 함수를 호출하여 하나의 결과값을 만들어 반환한다. 모든 배열의 고차 함수는 reduce로 구현할 수 있다. 또한, 빈 배열로 reduce 메서드를 호출하면 TypeError가 발생하므로 초기값을 전달하여 에러를 방지한다.

 

평균 구하기, 최대값 구하기(Math.max()), 요소의 중복 횟수 구하기, 중첩 배열 평탄화(flat()), 중복 요소 제거(filter(), Set)


4. 자료구조의 배열과 비교했을 때, 자바스크립트의 배열이 갖는 특징은 무엇인가요?

자료구조에서 말하는 배열은 동일한 크기의 메모리 공간이 연속적으로 나열된 것을 지칭한다. 배열의 요소는 하나의 데이터 타입으로 통일되어 있으며, 서로 연속적으로 인접해 있다. 이를, 밀집 배열(dense array)이라 한다.

 

그러나 자바스크립트의 배열은 자료구조에서 말하는 배열과 다르다. 요소를 위한 각각의 메모리 공간은 동일한 크기를 갖지 않아도 되며, 연속적으로 이어져 있지 않은 희소 배열로 만들 수 있다는 점에서 차이가 있다. 무엇보다 인덱스로 배열 요소에 접근할 때 일반적인 배열보다 느릴 수밖에 없는 구조적인 단점을 보완하기 위해, 좀 더 배열처럼 동작하도록 최적화하여 구현한 것이 자바스크립트의 배열이다. 다시 말해, 일반적인 배열의 동작을 흉내 낸 특수한 객체일 뿐이다. 일반 객체의 성능을 테스트해보면 배열이 일반 객체보다 약 2배 정도 빠르다.


5. 배열을 생성하는 방법에 대해 열거하고, 희소배열이 권장되지 않는 이유를 설명해주세요.

배열은 '배열 리터럴', 'Array 생성자 함수', 'Array.of', 'Array.from'을 통해 생성할 수 있다. 이렇게 생성된 배열은 연속적인 요소를 갖고 있는 형태의 배열이다. 그러나 중간에 요소들이 비어 있는 형태로 만들 수는 있다. 이를 '희소 배열'이라고 부른다. 자바스크립트는 문법적으로는 허용하지만, 사실상 사용하지 않는 것이 좋다. 연속적인 값의 집합이라는 배열의 기본적인 개념과 맞지 않으며, 성능 측면에서도 좋지 않은 영향을 준다. 다시 말해, 배열에는 같은 타입의 요소를 연속적으로 위치시키는 것이 최선이다.


6. 배열의 요소를 삭제하는 방법으로 delete 연산자와 slice 메서드의 차이점은 무엇이며, 어떤 방법이 배열의 관점에서 적절한가요?

배열은 엄밀히 말해서 객체이므로 delete 연선자를 사용할 수 있다. 그러나 delete 연산자는 객체의 프로퍼티, 즉 인덱스와 해당 인덱스의 요소를 삭제한다. 원본 배열을 조작해 희소 배열을 만드는 것이다. 이런 면에서, 차라리 원본 배열을 잘라내는 slice 메서드를 사용하여 특정 요소를 삭제하여 연속적인 밀집 배열 형태로 만드는 것이 좋다.

댓글