자료구조 with JAVA

[JAVA] 자료구조 - 배열(Array)

beginner-in-coding 2024. 12. 1. 20:21

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));