JAVA

배열

고민말고생각하는사람 2024. 7. 31. 20:49

배열

가장 기본적인 자료구조. 연속성을 띈다.

인덱스를 통해 쉽고 빠르게 데이터에 접근할 수 있는 자료 구조이다.

 

배열 생성 원리

배열 생성 요청 - 메모리 할당 - 배열 생성 - 참조주소값 반환

 

int [] arr = new int[n]; // x100 이라 했을 때

배열은 연속된 자료구조이므로,

배열이 갖는 주소값들 또한 x100과 밀접한 관계(규칙성)을 갖는다.

 

배열에 담기는 메모리 크기 * index 로 접근 가능하다는 모양.

 

따라서, 특정 위치에 접근할 때 

배열의 기본 주소값 + 배열 타입 메모리 크기 * index

 

1회의 연산으로 해당 위치의 데이터에 접근 가능함.

 

 

빅오표기법

알고리즘 성능 분석에 사용되는 수학적 표현식.

알고리즘 수행 시 발생하는 연산 수를 간략하게 표기함.

 

배열에 값을 입력할 때

arr[n] = 입력값;

이므로, 

배열의 입력 빅오표기법은  O(1);

전체 조회는 별 수 없으므로, O(n);

 

특정 위치값 조회는 인덱스를 알고 있을 경우 입려고가 마찬가지로 O(1);

 

최적 : 1회의 연산

최악 : O(n)  중첩 for문 발생시 연산 수가 기하급수적으로 증가하고 성능 저하로 이어지기 쉽다.

평균 : O(n/2) 로 적당히 중간 정도에서 찾지만 빅오표기법에선 상수 제외 O(n)으로 표기함.

 

 

배열의 데이터 추가

조회, 수정을 위해 특정 위치에 접근하는 것은 O(1)이다.

그러나, 추가, 삭제 해야 할 경우, O(n) 의 연산이 발생한다.

 

[1][2][3][4][5] 배열 가 있을 때, value 3의 위치. 즉 index[2] 에 값을 추가할 경우,

 

[1][2][N][3][4][5] 기존에 index[2,3,4] 의 값들을 +1씩 옮겨줘야 한다.

따라서 O(n)의 추가(shift) 연산이 발생한다.

삭제도 마찬가지.

 

배열의 경우 위치에 따라 연산 횟수가 크게 차이 난다.

마지막 - O(1) 

기존 값 이동 연산이 필요 없다.

중간 - O(n)

O(n/2) 지만 빅오표기법은 n 생략

처음 - O(n)

가장 많은 연산 수를 발생시킨다.

 

배열의 한계

1. 고정된 길이

배열은 가장 기본적인 자료구조이다.

생성 시, 반드시 길이를 결정해야하며, 이는 변하지 않는다.

10자리 준비했는데, 11손님 오면 터져버리는 녀석.

 

2. 부족한 기능

자료구조로서의 성능 외 다른 기능을 기대하기 힘들다.

값 저장, 추가, 수정, 조회 외 작업이 어렵다.

 

이러한 한계를 극복하기 위해 만들어진 것이 Collection 들이다.