자바스크립트의 배열 정렬 메서드 sort()는 매우 강력한 도구입니다. 하지만 기본 sort()와 sort((a, b) => a - b) 사이에는 중요한 차이점이 있습니다. 이 글에서는 두 방식의 동작 원리와 차이점을 상세히 설명하겠습니다.
1. 기본 sort()의 동작 방식
sort() 메서드는 배열을 정렬하지만, 기본적으로 문자열로 변환하여 정렬을 수행합니다. 즉, 배열의 요소가 숫자든 문자열이든 상관없이 모두 문자열로 취급하여 유니코드 순서에 따라 정렬합니다.
예제:
const arr = [10, 2, 30, 21];
arr.sort();
console.log(arr); // [10, 2, 21, 30]
위 결과를 보면 숫자 값이 제대로 정렬되지 않았음을 알 수 있습니다. 이는 10, 2, 30, 21이 문자열로 변환된 후 유니코드 순서에 따라 정렬되기 때문입니다. 문자열로 비교하면:
- 10이 2보다 앞에 옴
- 2 다음에 21
- 마지막으로 30
2. sort((a, b) => a - b)의 동작 방식
sort() 메서드에 비교 함수를 전달하면 원하는 방식으로 정렬 기준을 지정할 수 있습니다.
비교 함수는 두 개의 요소 a와 b를 입력으로 받아 다음을 반환합니다:
- 음수 값: a가 b보다 앞에 와야 함
- 0: a와 b의 순서를 바꾸지 않음
- 양수 값: b가 a보다 앞에 와야 함
예제:
const arr = [10, 2, 30, 21];
arr.sort((a, b) => a - b);
console.log(arr); // [2, 10, 21, 30]
비교 함수 (a, b) => a - b는 숫자 정렬을 위해 다음과 같이 동작합니다:
- a - b가 음수면 a가 더 작으므로 앞에 배치
- a - b가 양수면 b가 더 작으므로 앞에 배치
결과적으로 숫자가 오름차순으로 정렬됩니다.
3. 두 방식의 주요 차이점
특징 | 기본 sort() | sort((a, b) => a - b) |
비교 방식 | 유니코드 순서 | 숫자 값 기준 |
정렬 대상의 데이터 타입 | 문자열 중심 | 사용자 정의 가능 |
숫자 정렬 | 제대로 동작하지 않음 | 올바르게 동작 |
유연성 | 낮음 | 높음 |
비교 예제:
const arr = [10, 2, 30, 21];
// 기본 sort()
const sortedDefault = [...arr].sort();
console.log(sortedDefault); // [10, 2, 21, 30]
// 비교 함수 사용
const sortedNumeric = [...arr].sort((a, b) => a - b);
console.log(sortedNumeric); // [2, 10, 21, 30]
4. 정렬 순서를 변경하는 방법
만약 내림차순으로 정렬하고 싶다면 비교 함수의 반환값을 반대로 만들어주면 됩니다.
내림차순 예제:
const arr = [10, 2, 30, 21];
arr.sort((a, b) => b - a);
console.log(arr); // [30, 21, 10, 2]
5. 문자열 배열에서의 활용
문자열 배열에서도 비교 함수를 사용하면 더욱 정교한 정렬이 가능합니다.
const names = ['John', 'Alice', 'bob', 'Charlie'];
// 기본 sort()
names.sort();
console.log(names); // ['Alice', 'Charlie', 'John', 'bob']
// 대소문자 구분 없이 정렬
names.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
console.log(names); // ['Alice', 'bob', 'Charlie', 'John']
6. 성능 차이
기본 sort()는 간단한 문자열 정렬에 적합하지만, 숫자나 복잡한 데이터 구조를 정렬할 때는 비교 함수를 사용하는 것이 더 적합합니다. 특히 대규모 데이터셋을 다룰 때는 올바른 비교 함수 설정이 성능 최적화에 중요한 역할을 합니다.
마무리
- sort(): 문자열 정렬에 적합하지만 숫자 정렬에는 부적함.
- sort((a, b) => a - b): 숫자 배열을 정확히 정렬하려면 반드시 비교 함수를 사용해야 함.
'프론트엔드 > JavaScript' 카테고리의 다른 글
[ JavaScript ] findIndex와 indexOf의 차이점 알아보기 (0) | 2024.10.17 |
---|---|
[ javascript ] HTML, CSS, JS로 음악 플레이어 만들기 (4) | 2024.09.09 |
[ Javascript ] Drop Down(드롭다운) 메뉴 만들기 (0) | 2024.04.23 |
[ JavaScript ] Class 초기값 설정해주기, 상속 하기 (0) | 2022.12.05 |
[ JavaScript ] currentTarget vs target 차이점 (0) | 2022.11.17 |
댓글