본문 바로가기
javascript/자바스크립트는 왜 그 모양일까

배열의 순수 함수, 비순수 함수

by yongfront 2024. 3. 5.
반응형
SMALL

배열이 0부터 시작하는 관습은 프로그래밍 언어와 컴퓨터 과학의 역사에서 깊은 뿌리를 가지고 있습니다. 이 관습은 여러 이유와 장점을 기반으로 합니다:

역사적 배경

  1. C 언어의 영향: 배열이 0부터 시작하는 관습은 주로 C 언어의 설계에서 비롯되었습니다. C 언어는 현대 프로그래밍 언어에 지대한 영향을 미쳤으며, C에서 배열의 인덱스는 배열의 시작 주소로부터의 상대적 위치를 나타냅니다. 첫 번째 요소가 시작 주소에 있기 때문에 0으로 인덱싱하는 것이 자연스럽습니다.

기술적 이유

  1. 포인터 산술과의 호환성: C 언어와 같이 포인터를 사용하는 언어에서는, 포인터 산술을 사용해 배열을 다룹니다. 배열 이름은 배열의 첫 번째 요소를 가리키는 포인터로 해석될 수 있으며, 배열의 첫 번째 요소에 접근하기 위해 포인터에 0을 더하는 것이 직관적입니다. 이는 포인터 산술과 배열 인덱싱을 일관되게 만듭니다.
  2. 메모리 접근의 효율성: 0 기반 인덱싱은 메모리 주소를 계산할 때 추가적인 계산 없이 바로 인덱스를 사용할 수 있게 합니다. 예를 들어, array[0]는 시작 주소에 바로 접근할 수 있고, array[i]는 시작 주소에서 i 만큼 떨어진 위치에 접근하는 것을 의미합니다. 1 기반 인덱싱을 사용할 경우, 항상 1을 빼는 계산이 필요합니다.

프로그래밍 및 알고리즘에서의 장점

  1. 루프와 알고리즘의 단순화: 0부터 인덱싱을 시작하면 프로그래밍에서 반복문을 사용할 때 더 단순한 형태로 작성할 수 있습니다. 예를 들어, 0부터 시작하면 for 반복문에서 초기 조건을 0으로 설정하고, 배열의 길이 미만까지 반복하는 것이 일반적인 패턴이 됩니다. 이는 코드를 더 읽기 쉽고 이해하기 쉽게 만듭니다.
  2. 수학적 표현과의 일관성: 일부 수학적 표현에서는 집합의 첫 번째 요소를 0으로 나타내기도 합니다. 이는 프로그래밍에서 0 기반 인덱싱을 사용할 때, 수학적 모델과의 일관성을 유지하는 데 도움이 될 수 있습니다.
  3. 언어 간의 일관성: 많은 현대 프로그래밍 언어가 C 언어의 영향을 받았기 때문에, 0부터 시작하는 배열 인덱싱은 다양한 언어 간의 일관된 접근 방식을 제공합니다. 이는 프로그래머가 새로운 언어를 배울 때 직관적으로 이해할 수 있는 부분입니다.

 

자바스크립트에서 배열을 다룰 때 사용되는 메서드들은 그 효과에 따라 순수 함수(pure functions)와 비순수 함수(impure functions)로 구분될 수 있습니다. 순수 함수는 주어진 입력에 대해 항상 같은 출력을 반환하고, 부작용(side effects)이 없습니다. 즉, 순수 함수는 입력 값을 변경하지 않고, 외부 상태에 영향을 주지 않습니다. 반면, 비순수 함수는 외부 상태를 변경할 수 있으며(예: 입력으로 받은 배열을 수정), 같은 입력에 대해 다른 결과를 반환할 수 있습니다.

 

배열의 순수 함수 예시

map(): 배열의 각 요소에 주어진 함수를 적용한 결과를 모아 새 배열을 반환합니다.

const numbers = [1, 2, 3];
const doubled = numbers.map(x => x * 2);
// numbers 배열은 변경되지 않음

filter(): 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새 배열을 반환합니다.

const numbers = [1, 2, 3, 4, 5];
const evens = numbers.filter(x => x % 2 === 0);
// numbers 배열은 변경되지 않음

reduce(): 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, cur) => acc + cur, 0);
// numbers 배열은 변경되지 않음

concat(): 하나 이상의 배열을 합쳐 새 배열을 반환합니다.

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combined = arr1.concat(arr2);
// arr1과 arr2는 변경되지 않음

slice(): 배열의 일부분을 얕은 복사하여 새 배열로 반환합니다.

const numbers = [1, 2, 3, 4, 5];
const sliced = numbers.slice(1, 3);
// numbers 배열은 변경되지 않음

 

배열의 비순수 함수 예시

push(): 배열의 끝에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환합니다.

const numbers = [1, 2, 3];
numbers.push(4);
// numbers 배열이 변경됨

pop(): 배열에서 마지막 요소를 제거하고 그 요소를 반환합니다.

const numbers = [1, 2, 3, 4];
numbers.pop();
// numbers 배열이 변경됨

shift(): 배열에서 첫 번째 요소를 제거하고 그 요소를 반환합니다.

const numbers = [1, 2, 3, 4];
numbers.shift();
// numbers 배열이 변경됨

unshift(): 배열의 시작에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환합니다.

const numbers = [2, 3, 4];
numbers.unshift(1);
// numbers 배열이 변경됨

splice(): 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다.

const numbers = [1, 2, 4, 5];
numbers.splice(2, 0, 3);
// numbers 배열이 변경됨

순수 함수를 사용하는 것은 함수형 프로그래밍 패러다임에서 중요한 개념으로, 프로그램의 예측 가능성과 유지 보수성을 높일 수 있습니다. 반면, 비순수 함수는 특정 상황에서 불가피하게 사용될 수 있으나, 부작용을 관리하는 추가적인 주의가 필요합니다.

 

 

 

728x90
반응형
LIST

'javascript > 자바스크립트는 왜 그 모양일까' 카테고리의 다른 글

객체  (0) 2024.03.09
불(boolean) 타입  (1) 2024.03.05
자바스크립트에서의 큰 유리수  (1) 2024.03.05
큰 부동소수점  (0) 2024.03.05
자바스크립트에서의 큰 정수  (0) 2024.03.05