들어가는 글
자바를 처음 배울 때는 Array에 대해서 많이 배우고 다루었다.
하지만 ArrayList라는 자료구조를 알고 나서 너무 편리해 ArrayList만 써왔고
주변에서도 ArrayList만 사용하였다.
자료구조라는 파트에 들어가 LinkedList를 알게 되었지만 ArrayList보다 불편했다.
하지만 코테를 준비하면서 배열을 많이 이용을 했고
문득 든 생각이 배열과 리스트 그리고 LinkedList는 무슨 차이가 있고
각 쓰임이 어떻게 다른지 알고싶어 공부하여 정리를 하게 되었다.
배열(Array) 과 LinkedList(연결 리스트)란?
공통점
배열과 연결리스트 둘다 여러 개의 데이터를 하나의 이름으로 그룹핑해서 관리 하기 위한 자료구조이다.
차이점
경우 | Array | LinkedList |
크기 할당 | 배열은 크기가 정해진 데이터의 공간입니다. 한 번 정해지면 바꿀 수 없어요! | 리스트는 크기가 정해지지 않은 데이터의 공간입니다. 연결 고리로 이어주기만 하면, 자유자재로 늘어날 수 있습니다! |
맨 뒤에 데이터추가 | 데이터 추가 시 모든 공간이 다 차버렸다면 새로운 메모리 공간을 할당받아야 합니다. | 모든 공간이 다 찼어도 맨 뒤의 노드만 동적으로 추가하면 됩니다. |
중간에 데이터 추가/삭제 | 새로운 배열을 만들어 전부 데이터를 옮겨야 하므로 O(N)의 시간 복잡도를 가집니다. | 앞 뒤의 포인터만 변경하면 됩니다. 따라서 원소 삽입/삭제를 O(1)의 시간 복잡도 안에 할 수 있습니다. |
특정 원소 조회 | index로 데이터에 접근이 가능해 O(1) 의 시간 복잡도를 가집니다. | 맨뒤에 있는 데이터에 접근하려면 처음부터 차례로 조회하며, O(N)의 시간 복잡도를 가지고 있습니다. |
사용 용도
데이터에 접근하는 경우가 빈번하다면 Array를 사용하는게 성능적으로 유리합니다. 하지만 데이터의 삽입과 삭제가 빈번하다면 LinkedList를 사용하는 것이 좋습니다.
ArrayList(배열 리스트)
일반 배열과 ArrayList는 크기를 동적으로 늘릴 수 있다는 점에서 차이점이 있다.
그리고 LinkedList와 ArrayList는 인덱스로 객체를 관리한다는 점에서 차이점이 있다.
즉, ArrayList는 List인터페이스를 구현한 클래스이며, 크기가 동적이며 인덱스를 관리하는 자료구조입니다.
하지만 ArrayList에서 특정 인덱스의 객체를 제거하게 되면, 제거한 객체의 인덱스부터 마지막 인덱스까지 모두 앞으로 1칸씩 앞으로 이동한다. 객체를 추가하게 되면 1칸씩 뒤로 이동하게 된다. 인덱스 값을 유지하기 위해서 전체 객체가 위치가 이동한다. 따라서 잦은 원소의 이동, 삭제가 발생할 경우 ArrayList보다 LinkedList를 사용하는 것이 좋다.
ArrayList는 내부에서 처음 설정한 저장 용량(capacity)가 있다. 설정한 저장 용량 크기를 넘어서 더 많은 객체가 들어오게 되면, 배열 크기를 1.5배로 증가시킨다.
Array(배열) 사용법
배열 선언
데이터타입 앞에 [ ] 를 붙혀 선언할 수 있습니다.
//배열 선언
int[] numbers;
String[] strings;
boolean[] booleans;
char[] chars;
배열 크기 정해주기
배열은 크기를 정해줘야지 사용할 수 있습니다. 아래와 같이 new 데이터타임 [배열크기] 로 배열의 크기를 선언하는 동시에 초기화를 시킬 수 있습니다.
// 크기 정해주기 초기값
numbers = new int[5]; // 0
strings = new String[4]; // null
booleans = new boolean[3]; // false
chars = new char[2]; // ''
배열은 선언과 동시에 크기를 정해줄 수 있습니다.
//선언과 동시에 크기 정해주기
int[] numbers2 = new int[5];
배열 조회
배열의 크기는 9 입니다. 즉 0~8 까지의 인덱스를 가지고 있으며 그 이상의 인덱스에 접근할 때는 에러가 발생합니다.
int[] scores = new int[9];
//배열 조회
System.out.println(scores[0]); //0
System.out.println(scores[1]); //0
System.out.println(scores[2]); //0
System.out.println(scores[3]); //0
System.out.println(scores[4]); //0
System.out.println(scores[5]); //0
System.out.println(scores[6]); //0
System.out.println(scores[7]); //0
System.out.println(scores[8]); //0
System.out.println(scores[9]); //error java.lang.ArrayIndexOutOfBoundsException: 9
배열 초기화
배열은 해당 배열[인덱스] = 초기화 값 으로 초기화를 할 수 있습니다.
//배열 조회
scores[0] = 65;
scores[1] = 74;
scores[2] = 23;
scores[3] = 75;
scores[4] = 68;
scores[5] = 96;
scores[6] = 88;
scores[7] = 98;
scores[8] = 54;
배열은 선언과 동시에 초기화도 진행할 수 있습니다.
//배열은 선언과 동시에 초기화도 진행할 수 있습니다.
int[] numbers2 = {65,74,23,75,68,96,88};
numbers2 = new int[]{1,5,3,5,9,3};
Array(배열) 예제
조회
배열은 for-loop를 이용한 방법이나 반복문을 사용하여 하나씩 조회 할 수 있습니다.
int[] numbers2 = {1,2,3,4,5,6,7};
//배열 조회 예제 for-loop
// [1]
for (int number : numbers2){
System.out.println(number);
}
// [2]
for (int i = 0; i < numbers2.length; i++){
System.out.println(numbers2[i]);
}
데이터 초기화
데이터 초기화도 반복문을 이용하여 초기화 할 수 있습니다.
numbers2 = new int[5];
int cnt = 2;
for (int i = 0; i < numbers2.length; i++) {
numbers2[i] = cnt * i; // 0, 2, 4, 6, 8
}
배열에 대한 전체 코드
'몰아 넣기' 카테고리의 다른 글
[Spring]@Valid, @Validated 에 대해서 정리[3] - DTO구조를 이용한 @Valid (0) | 2022.11.27 |
---|---|
[자바/자료구조] Array(배열)과 LinkedList(연결 리스트) 그리고 ArrayList에 대한 정리[2] - ArrayList 사용법과 예제 (0) | 2022.09.04 |
[Spring] @Valid, @Validated 에 대해서 정리[2] - @Validated 예제 (0) | 2022.09.01 |
[Spring] @Valid, @Validated 에 대해서 정리[1] - @Valid 예제 (0) | 2022.09.01 |
[스프링] GlobalException 처리 방법 및 예제 정리[2] - CustomException 이용하기 (0) | 2022.09.01 |