01. 배열(Array)
- 많은 수의 데이터를 다룰 때 사용하는 자료구조
- 각 데이터는 인덱스와 1:1 대응
- 데이터가 메모리상에 연속적 저장 (물리적 연속적)
Data | 'a' | 'b' | 'c' | 'd' | ... |
Index | 0 | 1 | 2 | 3 | ... |
02. 장점과 단점
- 장점: 인덱스(Index)를 이용하여 데이터에 빠르게 접근 가능
ex) arr[0] => 'a' , arr[1] => 'b' , arr[2] => 'c', ...
- 단점: 데이터의 추가/삭제 번거로움
- 미리 최대 길이를 정해서 생성
- 가변 길이의 배열은 배열의 크기를 변경할 때마다 새로운 배열 생성
- 데이터 삭제시, 인덱스를 유지하기 위해 빈 공간 유지
03. 구현하기 - 구조 익히기
import java.util.Arrays;
/*자바에서 제공하는 배열 대신 실제로 구현해보며 구조 익히기*/
class MyArray {
int[] arr;
// 배열의 초기 사이즈 설정
MyArray(int size){
this.arr = new int[size];
}
// 배열에 데이터 삽입 메소드(인덱스 자리, 데이터)
public void insertData(int index, int data){
if(index < 0 || index > this.arr.length){ //만약 인덱스의 길이가 유효하지 않다면
System.out.println("Index Error");
return;
}
int[] arrDup = this.arr.clone(); //기존의 배열을 복사함
this.arr = new int[this.arr.length+1]; //배열의 길이를 늘려줌
//넣으려는 인덱스 자리를 기준으로
for (int i = 0; i < index; i++) { //인덱스 이전에 기존에 존재하던 데이터 삽입
this.arr[i] = arrDup[i];
}
for (int i = index; i < this.arr.length; i++) { //인덱스 이후에 기존에 존재하던 데이터 삽입
this.arr[i] = arrDup[i-1];
}
this.arr[index] = data; //인덱스자리에 데이터 삽입
}
// 배열에서 특정 데이터 삭제 메소드(삭제하려는 데이터)
public void removeData(int data){
int targetIndex = -1;
//data 있는지 확인
for (int i = 0; i < this.arr.length; i++) {
if(this.arr[i] == data){
targetIndex = i;
break;
}
}
if(targetIndex == -1){ //데이터가 배열에 존재하지 않을 경우
System.out.println("해당 데이터가 존재하지 않음");
return;
}else{ //데이터가 배열에 존재할 경우
int[] arrDup = this.arr.clone(); //기존 배열을 복사함
this.arr = new int[this.arr.length-1]; //배열의 크기를 다시 조정
for (int i = 0; i < this.arr.length; i++) { //새로운 배열에 데이터 삽입
if(i == targetIndex){ //만약 지우려는 데이터의 인덱스리면
continue;
}
this.arr[i] = arrDup[i];
}
}
}
}
- 위 코드를 보면, 데이터를 삽입하거나 삭제하는 경우 배열을 복사해놓은 후, 새로운 배열을 생성해 크기를 조정하는 과정을 볼 수 있음.
04. JAVA에서 제공하는 클래스 이용하기
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 1차원 배열
int[] arr = {1, 2, 3, 4, 5};
for (int item: arr) { //모두 출력
System.out.println("item = " + item);
}
arr[1] = 100; //인덱스 이용해서 데이터 수정
System.out.println("arr = " + Arrays.toString(arr));
// 2차원 배열
int[][] arr2 = {{1, 2, 3}, {4, 5, 6}}; //int[열][행]
System.out.println(arr2[0][1]); //0열의 1행: 2
for(int[] row: arr2) {
for(int item: row) {
System.out.println("item = " + item);
}
}
// ArrayList - 1차원, 2차원
ArrayList list1 = new ArrayList(Arrays.asList(1, 2, 3));
System.out.println("list1 = " + list1);
list1.add(4);
list1.add(5);
System.out.println("list1 = " + list1);
list1.remove(2);
System.out.println("list1 = " + list1);
list1.remove(Integer.valueOf(2));
System.out.println("list1 = " + list1);
// 2차원
ArrayList list2d = new ArrayList();
ArrayList list1d1 = new ArrayList(Arrays.asList(1, 2, 3));
ArrayList list1d2 = new ArrayList(Arrays.asList(4, 5, 6));
list2d.add(list1d1);
list2d.add(list1d2);
System.out.println("list1d1 = " + list1d1);
System.out.println("list1d2 = " + list1d2);
System.out.println("list2d = " + list2d);
}
}
- 위 코드처럼 ArrayList를 사용할 때, 제네릭(Generic)을 생략해도 컴파일하는데 문제가 없지만,
- 타입 안정성과 코드 재사용성을 높이기 위해 아래와 같이 명시해주는 것이 좋음.
ArrayList<ArrayList<Integer>> list2d = new ArrayList<>();
ArrayList<Integer> list1d1 = new ArrayList<>(Arrays.asList(1, 2, 3));
ArrayList<Integer> list1d2 = new ArrayList<>(Arrays.asList(4, 5, 6));
'자료구조 with JAVA' 카테고리의 다른 글
[JAVA] 자료구조 - 데크 (Deque) (0) | 2024.12.30 |
---|---|
[JAVA] 자료구조 - 큐(Queue) (1) | 2024.12.30 |
[JAVA] 자료구조 - 스택(Stack) (0) | 2024.12.30 |
[JAVA] 자료구조 - 연결 리스트(Linked List) (0) | 2024.12.05 |
[JAVA] 자료구조 - 소개 (0) | 2024.12.01 |