[Data-Structure] Array

2022. 4. 12.공부/자료구조

728x90

배열(Array)이란 여러개의 데이터를 하나로 그룹핑해서 관리하는 자료구조로, 가장 기본적인 자료구조이다. 논리적 저장 순서와 물리적 저장 순서가 일치하여, 인덱스 번호 순서대로 원소가 동일한 크기의 일정한 공간에 빈틈없이 연속적으로 나열된다.

 

[출처] https://poiemaweb.com/js-array-is-not-arrray

 

인덱스를 기준으로 데이터가 저장되기 때문에, 인덱스 번호를 활용해서 자료를 조회할 수 있다.

// 배열 만들기
const fruits = ['사과','바나나','배','포도','딸기'];
console.log(fruits);

// 배열의 길이는?
console.log(fruits.length); //5

// 0번 인덱스의 자료를 콘솔에 찍기
console.log(fruits[0]); // -> '사과'

// 1번 인덱스의 자료를 콘솔에 찍기
console.log(fruits[1]); // -> '바나나'

// 5번 인덱스의 자료를 콘솔에 찍기 
console.log(fruits[5]); // 5번 인덱스는 존재하지 않으므로 undefined

// 배열의 마지막 인덱스 번호에 할당된 자료 콘솔에 찍기
console.log(fruits[fruits.length - 1]); // -> 4번 인덱스에 들어있는 '딸기'

 

Array 전체를 print하기 위한 방법은 3가지이다. 

 

1) for문으로 print

for (let i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

 

2) for of 문법으로 print 

for (let fruit of fruits) {
    console.log(fruit);
}
 

3) forEach를 이용하여 콜백 함수로 원소 하나씩 받아오기

fruits.forEach((fruit, index) => console.log(fruit));
// forEach는 배열 안에 들어있는 인자들마다 내가 전달한 함수를 적용하여 출력합니다.
const arr = [0,1,2,3,4,5,6,7,8,9,10];
arr.forEach(element => console.log(element));
 

Array는 push로 넣고, pop으로 삭제한다. 

 

fruits.push('딸기');
fruits.pop(); // 맨 나중에 넣은 인자 사라짐

 

unsift와 sift를 이용하여 삭제할 수도 있다.

 

unshift를 사용하면 배열의 맨 앞에 접근하여 자료를 적재할 수 있다. 전체 배열을 한 칸 더 만들어서 원본 배열의 마지막 칸에 있던 자료를 추가된 공간에 넣고, 마지막 칸에는 마지막 칸 전에 있던 데이터를 넣는 식으로 구현하여 맨 앞 칸을 텅텅 비게 만든 다음 빈 공간에 새로운 데이터를 집어넣는 것이다. 

 

fruits.unshift('레몬','파인애플'); // 레몬, 파인애플, 사과, 바나나, 배, 포도, 딸기 순으로 출력

 

shift를 사용하면 배열의 맨 앞에 접근하여 자료를 삭제할 수 있다. 첫번째 아이템이 지워지면 두번째 있던 아이템을 맨 앞으로 당겨오고, 세번째 있던 아이템을 두번째 공간에 넣는 식으로 작동한다. shift와 unshift는 배열의 길이가 길면 길수록 적재/삭제 시 반복적인 연산을 추가적으로 실행하기 때문에 속도가 상대적으로 느리다.  

 

fruits.shift(); // 딸기 제거

 

JS에서 배열은 사실 일반적인 자료구조의 배열이 아닌 배열의 동작을 흉내낸 특수한 개체이다. JS에서 배열의 메모리 공간은 동일한 크기를 갖지 않아도 되며, 연속적으로 이어져 있지 않을 수도 있다. (hash table로 구현)

 

let arr = []; // 어레이 생성 (길이를 정하지 않아도 생성이 됨)
arr.push('원소'); // 길이 정해지지 않은 배열에 원소를 push할 수 있음

 

 

Array는 본래 만들 때 크기를 정해서 만들고 이 크기는 나중에 변경할 수 없다. JAVA 문법으로 배열을 생성하고 조회하는 코드 블럭은 아래와 같은데, 배열 생성 시 크기를 규정하고 규정된 크기만큼만 데이터를 적재할 수 있는 모습을 관찰할 수 있다.  

 

int[] arr = new int[5]; // arr라는 변수를 "배열" 자료구조로 생성하고, 인덱스를 5개 할당
arr[0] = 1; // 0번 인덱스에 int 자료형 1 대입
arr[1] = 2; // 0번 인덱스에 int 자료형 2 대입
arr[2] = 3; // 0번 인덱스에 int 자료형 3 대입
arr[3] = 4; // 0번 인덱스에 int 자료형 4 대입
arr[4] = 5; // 0번 인덱스에 int 자료형 5 대입
System.out.println(arr); // 자료 1,2,3,4,5 조회

arr[5] = 6; // 에러 발생

 

따라서 배열의 원소 중 어느 원소를 임의로 삭제했다고 했을 때, 삭제된 element의 공간이 사라지지 않고 빈 공간으로 그대로 남아 메모리의 낭비가 생긴다.