배열 (Array)

늘보·2021년 7월 6일
0

** 이 글은 Learning JavaScript Data Structures and Algorithms 책을 기반으로 작성되었습니다.

** 이 글은 해당 책의 전체적인 내용을 정리한 것이 아닌, 새롭게 알게 된 내용 + 기억이 필요하다고 생각되는 부분 + 저의 생각만을 정리합니다.

배열의 앞 쪽에 원소를 추가하는 방식

일반적으로 JS에서는 shift() 메소드를 사용하면 간단히 배열의 앞에 요소를 추가할 수 있다. 그러나 이러한 shift()의 작동 방식은 어떻게 될까?

let numbers = [1,2,3,4,5]
  • 이러한 numbers 배열을 생성했다.
for(let i=numbers.length; i>=0; i--) numbers[i] = numbers[i-1];
  • 기존에 들어 있던 원소를 전부 우측으로 한 칸씩 이동시켜서 첫 번째 위치를 비워놓게 한다.
  • 그럼 비워놓은 첫 번째 numbers[0]에는 어떤 값이 들어가 있을까? (존재하지 않는 위치 참조)
console.log(numbers[0]); // 결과: undefined
  • console로 확인하면 numbers[0]은 undefined가 나온다.
  • 이는 변수를 선언함과 동시에 undefined를 할당하는 JS의 특성이다.
  • Java같은 언어의 경우에는 배열의 인덱스가 벗어나면 error을 반환할 것이다.
numbers[0] = 0; // numbers[0] = undefined 에서 0을 재할당
numbers = [0,1,2,3,4,5]

배열의 뒤쪽에 원소를 추가하는 경우에도 위와 같은 방식으로 동작한다.

Sort()의 작동 방식

일반적으로 배열 안의 요소를 오름차순 정렬을 하기 위해서 보통

array.sort((a,b) => a-b)

같은 방식을 사용한다. 그런데 왜 저런 식으로 비교함수를 직접 만들어줘야 하는가? 그 이유는

sort()는 모든 원소를 문자열로 취급해 사전적(lexicographically)으로 정렬한다.

  • 그렇다면 다음 코드의 실행 결과는 무엇일까?
let names = ['Ana', 'ana', 'john', 'John'];
console.log(names.sort()); // 결과: ['Ana', 'John', 'ana', 'john']
  • 왜 a가 알파벳 순서로 가장 앞섰는데도 ana가 John 뒤에 올까? JS는 문자의 아스키(ASCII)값을 비교하기 때문이다. A, J, a, j의 ASCII 값은 각각 65, 74, 97, 106이다.

정리

지금껏 크게 생각하지 않고 shift, unshift, sort 등의 메소드를 사용해 배열의 값을 변경했는데, 원리를 아는게 더 중요하다는 걸 또 배웠다 ..!

0개의 댓글