배열(Array)
- 많은 수의 데이터를 다룰 때 사용하는 자료 구조
- 각 데이터를 인덱스와 1:1 대응하도록 구성
- 데이터가 메모리 상에 연속적으로 저장됨

배열의 장점
- 인덱스를 이용하여 데이터에 빠르게 접근 가능

배열의 단점
- 데이터의 추가/삭제가 번거로운 편
: 미리 최대 길이를 정해서 생성해야 함
: 가변 길이 배열은 배열의 크기를 변경할 때마다 새로운 배열을 생성
: 데이터 삭제 시, 인덱스를 유지하기 위해 빈 공간 유지

실습 코드
// 선형 자료구조 - 배열
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 1차원 배열
System.out.println("== 1차원 배열 ==");
int[] arr = {1, 2, 3, 4, 5};
for (int item: arr) {
System.out.println("item = " + item);
}
arr[1] = 100;
System.out.println("arr = " + arr);
// 2차원 배열
System.out.println("== 2차원 배열 ==");
int[][] arr2 = {{1, 2, 3}, {4, 5, 6}};
System.out.println(arr2[0][1]);
for(int[] row: arr2) {
for(int item: row) {
System.out.println("item = " + item);
}
}
// ArrayList - 1차원, 2차원
System.out.println("== ArrayList ==");
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);
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);
}
}
연습 코드
// Practice
// 기본 배열 자료형을 이용한 배열의 생성, 삽입, 삭제 기능 구현
import java.util.Arrays;
class MyArray {
int[] arr;
// 배열의 초기 사이즈 설정
MyArray(int size) { // 생성자 만들기
// arr(멤버변수)의 사이즈를 받기
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 + 1; i < this.arr.length; i++) {
this.arr[i] = arrDup[i - 1];
}
this.arr[index] = data;
}
// 배열에서 특정 데이터 삭제
public void removeData(int data) {
int targetIndex = -1;
// 배열을 순회하면서 각각의 배열에 위치한 데이터가
for (int i = 0; i < this.arr.length; i++) {
// 삭제하려고 요청으로 들어온 data와 같은지 비교해보고
// 만약 같은 data가 있으면 targetIndex 위치를 (처음엔 아무 위치 없는 -1)
// 찾은 위치에 해당하는 index로 넣어주고(i)
// 만약 해당 데이터가 있으면 더이상 찾을 필요가 없으니 break 시켜준다.
if (this.arr[i] == data) {
targetIndex = i;
break;
}
}
// data가 없을 때 (찾는게 없을 때 = -1)
if (targetIndex == -1) {
System.out.println("해당 데이터가 없습니다.");
} else {
int[] arrDup = this.arr.clone(); // 기존 데이터 백업
this.arr = new int[this.arr.length - 1];
for (int i = 0; i < targetIndex; i++) {
this.arr[i] = arrDup[i];
}
// 지우려고 하는 data에 해당하는 것은 빼고 나머지 데이터만
// 새로 만들어준 배열에 들어감
for (int i = targetIndex; i < this.arr.length; i++) {
this.arr[i] = arrDup[i + 1];
}
}
}
}
public class Practice {
public static void main(String[] args) {
// Test code
int size = 5;
MyArray myArray = new MyArray(size);
for (int i = 0; i < size; i++) {
myArray.arr[i] = i + 1;
}
System.out.println(Arrays.toString(myArray.arr)); // [1, 2, 3, 4, 5]
myArray.arr[0] = 10;
System.out.println(Arrays.toString(myArray.arr)); // [10, 2, 3, 4, 5]
myArray.insertData(2, 20);
System.out.println(Arrays.toString(myArray.arr)); // [10, 2, 20, 3, 4, 5]
myArray.insertData(6, 60);
System.out.println(Arrays.toString(myArray.arr)); // [10, 2, 20, 3, 4, 5, 60]
myArray.insertData(-1, 0); // Index Error
myArray.removeData(4);
System.out.println(Arrays.toString(myArray.arr)); // [10, 2, 20, 3, 5, 60]
myArray.removeData(5);
System.out.println(Arrays.toString(myArray.arr)); // [10, 2, 20, 3, 60]
myArray.removeData(99); // 해당 데이터가 없습니다.
}
}
'자료구조 l 알고리즘 > Ch. 02. 선형 자료구조' 카테고리의 다른 글
| 해시 테이블_1 (0) | 2023.03.19 |
|---|---|
| 데크(Deque) (0) | 2023.03.18 |
| 큐(Queue) (0) | 2023.03.17 |
| 스택(Stack) (0) | 2023.03.17 |
| 연결리스트 (0) | 2023.03.17 |