배열(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