배열
배열
객체는 태생부터 순서를 고려하지 않고 만들어진 자료구조 이기 떄문에 순서와 관련된 메서드 없음
순서가 있는 컬렉션 저장 시 자료구조인 배열 사용가능
대괄호 안에 순서 나타내는 숫자인 인덱스 넣어서 배열 내 특정 요소 접근
내부에 자료구조 할당 시 참조값을 더하는게 아닌 새로운 메모리를 할당해서 저장함
새로운 배열 추가 가능
length 사용해 배열 답긴 요소 몇 개인지 알 수 있음
배열 요소의 자료형엔 제약 없음
-
배열 선언
-
new Array()
-
[]
선호되는 방식.
초기 요소 넣을 수 있음
-
-
trailing 쉼표
모든 줄의 생김새 유사해지므로 요소 넣거나 빼기 쉬워짐
배열 마지막 요소는 쉼표로 끝낼 수 있음
-
pop/push 와 shifh/unshift
-
큐
가장 먼저 넣은 요소가 먼저 나옴 (선입선출)
배열 사용해 만들 수 있는 대표적인 자료구조
순서가 있는 컬렉션 저장해 사용
-
주요 연산
-
push : 맨 끝에 요소 추가
-
shift : 제일 앞 요소 깨너 제거 후 남아있는 요소들 앞으로 밀어줌
-
-
-
스택
가장 나중에 집어넣은 요소가 먼저 나옴 (후입선출)
‘한쪽 끝’ 에 요소 더하거나 뺄 수 있게 해주는 자료구조
카드 한 벌과 비교됨.
-
주요 연산
-
push : 요소를 스택 끝에 집어 넣음
-
pop : 스택 끝 요소 추출
-
-
JS에서는 큐/스택 둘 다 구현 가능
처음이나 끝에 요소 더하거나 빼주는 연산을 제공하는 자료구조를 CS 에선 데큐 라고 부름
-
배열 끝에 무언가 해주는 메서드
-
pop
배열 끝 요소 제거 후 제거한 요소 반환
-
push
배열 끝에 요소 추가
array[array.length] = … 와 같은 효과
-
-
배열 앞에 무언가 해주는 메서드
-
shift
배열 앞 요소 제거하고, 제거한 요소 반환
-
unshift
배열 앞 요소 추가
둘 다 요소 여려 개 한 번에 더할 수 있음
-
-
-
배열의 내부 동작 원리
배열은 특별한 종류의 객체
배열은 키가 숫자라는 점에서 일반 객체와 다름
컬렉션을 제어하게 해주는 특별한 메서드 제공
-
객체형에 속하기 때문에 객체처럼 동작
-
객체와 마찬가지로 참조를 통해 복사
-
특수 내부 표현 방식
JS 엔진은 배열의 요소를 인접한 메모리 공간에 차례로 저장해 연산 속도 높임
-
배열을 객체처럼 다룰 경우
배열에만 적용되는 최적화 기법 동작안 해 배열 이점 사라짐
-
숫자가 아닌 값을 프로퍼티 키로 사용
-
arr[0] 과 arr[1000] 만 추가하고 그 사이에 아무런 요소 없는 경우
-
요소 역순으로 채우는 경우
배열 내장 메서드는 순서가 있는 자료에 특성화 되므로 JS 특성 고려하여 배열 신중하게 조정하고 처리해야 이점 누림.
-
-
-
-
성능
배열 앞 처리 메소드보다 배열 뒤 처리 메소드가 빠름
-
배열 앞에 무언가 할 경우
실행 흐름
-
인덱스 0인 요소 처리
-
모든 요소 좌/우로 이동시킴
-
length 프로퍼티 갱신
위와 같은 처리로 배열 요소 많을 시 메모리 관련 연산 많아지고 느려짐
-
-
배열 뒤에 무언가를 할 경우
실행 흐름
-
인덱스가 마지막인 요소 처리
-
length 프로퍼티 갱신
-
-
-
반복문
-
for 문 인덱스로 순회
가장 기본적
-
for…of
현재 요소의 값을 얻을 수 있음
-
for..in
배열도 객체형이므로 사용 가능
특징 때문에 배열에 문제 생김
-
모든 프로퍼티 대상으로 순회.
유사 배열 객체의 경우 키가 숫자가 아닌 프로퍼티가 메서드 있을 수 있음
모든 대상으로 순회 이어지기 때문에 ‘필요없는’ 프로퍼티가 문제 일으킬 수 있음
-
객체와 함께 사용할 때 최적화
속도 10~100배 정도 느림
-
-
-
‘length’ 프로퍼티
배열 내 요소의 개수가 아님
가장 큰 인덱스에 1 더함
쓰기 가능
값 감소 시킬 시 배열 잘림 (arr.length = 0)
짧아진 배열 다시 되돌릴 수 없음
-
new Array()
다루기 까다로운 기능 있어서 잘 안 다룸
인수에 숫자형 집어 넣을 시 만들어진 배열에는 요소는 없지만 길이는 인수와 같아짐
-
다차원 배열
배열 안에 배열의 요소가 있는 경우.
행렬 저장하는 용도
-
toString
호출 시 요소를 쉼표로 구분한 문자열 반환
요약
-
배열은 순서와 관련된 메서드를 가진 객체
-
요소의 자료형엔 제약 없음
-
배열 선언은 new 연산자와 배열 리터럴 연산자로 가능
-
큐는 선입선출로 push/shift, 스택은 후입선출로 push/pop
-
pop/push 는 배열 끝 요소 삭제/추가. pop 은 그 요소 반환
-
shift/unshift 는 배열 시작 요소 삭제/추가, shift 는 그 요소 반환
-
배열은 특수한 객체이기 떄문에 객체 처럼 동작하지만 객체처럼 다룰 시 배열 이점 잃음 (for of 권장)
-
배열 앞에 무언가 하는 메소드보다 배열 뒤에 무언가 하는 메소드가 index 조작에 대한 이점 가지기 떄문에 성능상 유리
-
반복문은 for, for..of, for..in 으로 가능하지만 for..of(이터레이터) 권장
-
length 프로퍼티는 가장 큰 인덱스에 1 더한 수. 쓰기 가능하며 줄일 시 요소 잘림
-
new Array() 는 인자에 숫자 넣을 시 숫자가 length 값이 되기 때문에 다루기 까다로움
-
다차원 배열은 배열 안의 배열
-
toString 은 호출 시 요소 쉼표로 구분한 문자열 반환