본문 바로가기

Computer Science/Data Structure

배열(Array) 구조의 이해

 

 

Array의 개념

 

 

Array는 저장해야 할 값이 많고, 그 값들의 type이 같은 유형인 경우 사용하는 자료구조이다. 따라서 하나의 Array에 각기 다른 여러 type의 value들을 담을 수 없다.

 

Array의 값들은 index를 통해서 접근할 수 있으므로, Linked List와 달리 value의 검색과 변경의 속도가 빠르다(시간 복잡도 O(N) = 1). Array List와 같은 시간 복잡도를 가지지만 Array List는 길이가 고정되어 있지 않아 value의 추가, 삭제가 자유롭다. 하지만 Array는 primitive type으로서 object type인 List에 비해 작업의 속도가 빠르므로, Array List로 완전히 대체할 수는 없다. 실제 Array와 Array List가 자주 쓰이는 코딩 테스트에서 이러한 차이 때문에 통과 여부가 갈리기도 하므로 주의할 필요가 있다.

 

List에는 기본 타입 변수를 담을 수 없지만 Array에는 담을 수 있어 Unboxing 과정을 거칠 필요가 없다는 장점도 가지고 있다. 이는 편의성의 문제뿐만 아니라 primitive type이 빠른 처리속도를 가지게 하는 데도 영향을 준다.

 

 

Array 구조에서의 명칭

 

 

보다 복잡한 조작을 편리하게 하기 위해 Array를 정렬하고 검색하는 데 도움을 주는 java의 유틸리티 클래스인 Arrays를 사용할 수 있다. List의 유틸리티 클래스인 Collections에 비해 지원 method가 부족하므로 다양한 조작에 비교적 어려움이 있는 편이다.

 

 

Array의 응용

 

 

Array는 각 배열의 index마다 배열을 담을 수 있으며, 이를 통해 다차원 배열을 생성할 수 있다. 따라서 List 등의 Collection 함수에 비해 다차원의 개념을 구현하는 데 강점을 가진다. 이는 (x, y, z, ···)의 n차원 좌표 형태로도 나타내고 활용할 수 있다.

 

 

3차원 Array의 구조도

 

 

Array는 참조타입이며 정적 크기를 가짐에 따라 한 번 길이가 결정되면 길이를 변경할 수 없으므로, 객체를 생성할 때 반드시 new 타입[길이]의 형태로 길이를 지정하거나 원하는 길이만큼의 값을 담아야 사용할 수 있다.

 

int[][][] array;

array = new int[4][][];
array[0] = new int[4][];
array[2] = new int[2][];
array[0][1] = new int[2];
array[0][3] = new int[2];
array[2][1] = new int[2];

 

위의 예시에서 3차원 배열의 index들에는 기본 초기값인 0이 담기게 되지만, 상위 차원의 index들 중 길이가 초기화되지 않은 index들은 값을 담을 수 없으므로 null값을 출력하게 된다. 또한 배열의 길이를 초과한 index를 읽으려 하면 ArrayIndexOutOfBoundsException이, 길이가 없는 배열의 index를 읽으려 하면 NullPointerException이 발생한다.

 

System.out.println(array);
System.out.println(array[3]); // null
System.out.println(array[0][1]);
System.out.println(array[0][2]); // null
System.out.println(array[2][1][1]); // 0
System.out.println(array[4]); // ArrayIndexOutOfBoundsException 발생

int[] array2 = null;
System.out.println(array2[1]); //NullPointerException 발생

'Computer Science > Data Structure' 카테고리의 다른 글

Heap 구조의 이해  (0) 2023.06.17
Linked List 구조의 이해  (0) 2023.06.16
Hash Map 구조의 이해  (0) 2023.06.15
큐(Queue) 구조의 이해  (0) 2023.06.13
스택(Stack) 구조의 이해  (0) 2023.06.12