3 minute read

배열

객체는 태생부터 순서를 고려하지 않고 만들어진 자료구조 이기 떄문에 순서와 관련된 메서드 없음

순서가 있는 컬렉션 저장 시 자료구조인 배열 사용가능

대괄호 안에 순서 나타내는 숫자인 인덱스 넣어서 배열 내 특정 요소 접근

내부에 자료구조 할당 시 참조값을 더하는게 아닌 새로운 메모리를 할당해서 저장함

새로운 배열 추가 가능

length 사용해 배열 답긴 요소 몇 개인지 알 수 있음

배열 요소의 자료형엔 제약 없음

  • 배열 선언

    1. new Array()

    2. []

      선호되는 방식.

      초기 요소 넣을 수 있음

  • trailing 쉼표

    모든 줄의 생김새 유사해지므로 요소 넣거나 빼기 쉬워짐

    배열 마지막 요소는 쉼표로 끝낼 수 있음

  • pop/push 와 shifh/unshift

    • 가장 먼저 넣은 요소가 먼저 나옴 (선입선출)

      배열 사용해 만들 수 있는 대표적인 자료구조

      순서가 있는 컬렉션 저장해 사용

      • 주요 연산

        1. push : 맨 끝에 요소 추가

        2. shift : 제일 앞 요소 깨너 제거 후 남아있는 요소들 앞으로 밀어줌

    • 스택

      가장 나중에 집어넣은 요소가 먼저 나옴 (후입선출)

      ‘한쪽 끝’ 에 요소 더하거나 뺄 수 있게 해주는 자료구조

      카드 한 벌과 비교됨.

      • 주요 연산

        1. push : 요소를 스택 끝에 집어 넣음

        2. pop : 스택 끝 요소 추출

    JS에서는 큐/스택 둘 다 구현 가능

    처음이나 끝에 요소 더하거나 빼주는 연산을 제공하는 자료구조를 CS 에선 데큐 라고 부름

    • 배열 끝에 무언가 해주는 메서드

      1. pop

        배열 끝 요소 제거 후 제거한 요소 반환

      2. push

        배열 끝에 요소 추가

        array[array.length] = … 와 같은 효과

    • 배열 앞에 무언가 해주는 메서드

      1. shift

        배열 앞 요소 제거하고, 제거한 요소 반환

      2. unshift

        배열 앞 요소 추가

      둘 다 요소 여려 개 한 번에 더할 수 있음

  • 배열의 내부 동작 원리

    배열은 특별한 종류의 객체

    배열은 키가 숫자라는 점에서 일반 객체와 다름

    컬렉션을 제어하게 해주는 특별한 메서드 제공

    • 객체형에 속하기 때문에 객체처럼 동작

      1. 객체와 마찬가지로 참조를 통해 복사

      2. 특수 내부 표현 방식

      JS 엔진은 배열의 요소를 인접한 메모리 공간에 차례로 저장해 연산 속도 높임

      • 배열을 객체처럼 다룰 경우

        배열에만 적용되는 최적화 기법 동작안 해 배열 이점 사라짐

        1. 숫자가 아닌 값을 프로퍼티 키로 사용

        2. arr[0] 과 arr[1000] 만 추가하고 그 사이에 아무런 요소 없는 경우

        3. 요소 역순으로 채우는 경우

        배열 내장 메서드는 순서가 있는 자료에 특성화 되므로 JS 특성 고려하여 배열 신중하게 조정하고 처리해야 이점 누림.

  • 성능

    배열 앞 처리 메소드보다 배열 뒤 처리 메소드가 빠름

    1. 배열 앞에 무언가 할 경우

      실행 흐름

      1. 인덱스 0인 요소 처리

      2. 모든 요소 좌/우로 이동시킴

      3. length 프로퍼티 갱신

      위와 같은 처리로 배열 요소 많을 시 메모리 관련 연산 많아지고 느려짐

    2. 배열 뒤에 무언가를 할 경우

      실행 흐름

      1. 인덱스가 마지막인 요소 처리

      2. length 프로퍼티 갱신

  • 반복문

    1. for 문 인덱스로 순회

      가장 기본적

    2. for…of

      현재 요소의 값을 얻을 수 있음

    3. for..in

      배열도 객체형이므로 사용 가능

      특징 때문에 배열에 문제 생김

      1. 모든 프로퍼티 대상으로 순회.

        유사 배열 객체의 경우 키가 숫자가 아닌 프로퍼티가 메서드 있을 수 있음

        모든 대상으로 순회 이어지기 때문에 ‘필요없는’ 프로퍼티가 문제 일으킬 수 있음

      2. 객체와 함께 사용할 때 최적화

        속도 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 은 호출 시 요소 쉼표로 구분한 문자열 반환

Categories: ,

Updated: