[자료구조] JAVA 배열을 이용한 자료의 관리

2019. 8. 6. 14:28 기타 정보/자료구조

JAVA 배열을 이용한 자료의 관리


자료구조란 특정 큐칙을 적용한 자료의 집합을 의미한다. 자료구조 중에서 가장 기본이 되며 가장 단순한 구조인 배열은 동일한 형태(int, double, String, Object 등)의 자료들이 순서를 가지고 구성된 집합이다.


배열은 초기 생성시에 그 크기를 미리 지정해야 한다. 초기에 지정한 크기는 바꿀 수 없기 때문에 생성한 크기보다 많은 자료를 저장할 수 없어 효율적인 자료구조로 사용하는데 제약이 따르게 된다.


배열 내에 저장된 자료들은 그 위치 값(index)을 가지고 식별할 수 있으며 위치값은 자료의 절대적인 위치를 나타내므로 특정 데이터에 접근 할 경우 처음부터 탐색할 필요 없이 index를 가지고 직접 접근할 수 있다.


1. 배열의 선언, 생성 및 초기화


    String[] arr;
    
위와 같이 String을 담을 배열을 선언한다. 선언만으로는 저장할 자료의 타입만 지정이 되며 실제 메모리에 공간이 할당되지는 않는다.

    arr = new String[10];
      
new 키워드를 이용하여 배열을 생성한다. 배열을 생성할 때는 위와 같이 배열의 크기를 지정해야 한다.

이차원 또는 다차원 배열 선언시에는 항상 정방형 구조로만 만들 수 있는건 아니다.

    int[][] arr;
    arr = new int[3][];
    arr[0] = new int[5];
    arr[1] = new int[10];
    arr[2] = new int[8];

위의 이차원 배열은 3행을 생성한 후 각 행을 5, 10, 8 열로 각각 다른 크기로 배열을 생성했다.

배열을 생성하면 각 요소는 생성한 데이터 타입의 초기값으로 초기화된다.
정수형 데이터 타입은 0으로, 실수형 데이터 타입은 0.0 이나 0.0f로 초기화 되며 boolean 타입은 false 값으로 초기화된다. char 타입은 '' 로 초기화 되며 String과 같은 객체를 참조하는 경우 null 값으로 초기화 된다.

배열의 생성 및 초기화는 아래의 포스팅을 참고하자


[JAVA] Array 배열, 이중 배열, 다중 배열



2. 배열의 자료 관리 (삽입, 검색, 삭제)


(1) 자료의 삽입


배열에 값을 삽입하기 위해서는 마지막에 삽입된 인덱스의 다음 인덱스를 이용하여 삽입 할 자료를 대입한다.


    int[] arr = new int[20];
    int  size = 0;

    for(int i=0; i<arr.length; i++){
        arr[i] = i+1;
        size++;
    }

arr.length 는 배열의 크기를 반환하므로 위에서는 항상 20을 반환한다. 따라서 실제 사용하는 데이터의 크기를 저장하고 있으려면 size 변수로 데이터의 크기를 항상 가지고 있어야 한다.


(2) 자료의 검색

배열 내의 데이터를 검색할 경우 자료의 중복이 없을 경우 배열의 처음부터 순차적으로 비교하여 매칭되는 데이터가 있을 경우 비교작업을 중지해도 되며, 중복이 있을 경우는 모든 요소를 순차적으로 비교하는 작업을 해야 한다.


    int searchKey = 5;
    for(int i=0; i<size; i++){
        if(arr[i] == searchKey){
            System.out.println(i + "번째에 " + searchKey + " 을 찾았다.");
            break;
        }
    }

배열에 자료가 중복 저장이 없을 경우 자료를 찾은 후 더 이상 배열을 탐색할 필요가 없으므로, break; 로 for 문을 빠져나온다. 중복 자료가 있어 모든 배열을 찾아야 하는 경우 break; 를 제거하면 된다.


(3) 자료의 삭제


삭제도 검색과 마찬가지로 중복이 없으면, 삭제할 데이터를 찾아 삭제 후 더이상 비교 작업을 하지 않도록 break; 를 사용하면 된다.

데이터를 삭제하는 작업은 삭제할 데이터의 인덱스 이후의 값들을 앞으로 한칸씩 밀어주고 배열의 크기를 하나 감소시키면 된다.


   int deleteKey =5;
   for(int i=0; i<size; i++){
       if(arr[i]==deleteKey){
           for(int k=i; k<size-1; k++){
              arr[k] = arr[k+1];
            }
        size --;
        break;
        }
   }

배열을 앞에서 부터 탐색하면서 deleteKey 를 찾는다. 

deleteKey 를 찾으면 삭제 후 뒤의 데이터를 앞으로 한칸씩 밀어주기 위해 for 문으로 뒤의 데이터를 앞의 열로 대입시키고 배열의 크기(size) 를 감소시킨다. 중복된 데이터가 없다면 break; 로 탐색을 중지하며, 데이터 중복이 있다면 break 를 제거하여 배열 전체를 탐색하면 된다.



3. 클래스를 이용한 배열 관리


배열을 이용하여 데이터를 관리할 때 데이터의 삽입, 검색, 삭제 등의 기능을 매번 직접 작성할 경우 사용할 때 마다 중복되는 작업이 발생한다. 

배열의 삽입, 검색, 삭제 등의 기능을 하는 클래스를 만들어서 필요할 때 재사용 할 수 있다.


(1) MyArray.java  배열 클래스



public class MyArray {
    
    private Object[] data;
    private int count;
    
    public MyArray(int maxSize){
        
        if(maxSize<0){
            throw new IllegalArgumentException("Illegal Capacity:"+maxSize);
        }
        
        // 객체 생성시 받은 maxSize 크기 의 배열을 만든다.
        this.data = new Object[maxSize];
        this.count = 0;
    }
    
    // 배열의 마지막에 obj 를 삽입한다.
    public void add(Object obj){
        if(count>=data.length){
            throw new ArrayIndexOutOfBoundsException(count + ">= " + data.length);
        }
        data[count++] = obj;
    }
    
    // index의 위치에 obj를 삽입한다. index 뒤의 데이터는 한칸씩 밀려난다.
    public void add(int index, Object obj){
        if(count>=data.length){
            throw new ArrayIndexOutOfBoundsException(count + ">= " + data.length);
        }
        
        for(int i=index; i<count; i++){
            data[i+1] = data[i];
        }
        count++;
        
        data[index]= obj;
    }
    
    // index 위치의 데이터를 삭제한다. index 뒤의 데이터는 한칸씩 당겨진다.
    public void remove(int index){
        if(index >= count){
            
            throw new ArrayIndexOutOfBoundsException(index + ">=" + count);
        
        }else if(index <0){
            
            throw new ArrayIndexOutOfBoundsException(index);
            
        }
        
        for(int i = index; i<count-1; i++){
            data[i] = data[i+1];
        }
        count--;
        data[count] = null;
    }
    
    // obj를 찾아서 제거한다.
    public void remove(Object obj){
        
        int index = find(obj);
        
        remove(index);
    }
    
    // index 의 데이터를 가져온다.
    public Object get(int index){
        if(index >= count){
            throw new ArrayIndexOutOfBoundsException(index + ">=" + count);
        }
        
        return data[index];
    }
    
    // 배열에서 obj 를 찾아서 위치 index를 반환한다.
    public int find(Object obj){
        
        int index;
        for(index=0; index<count; index++){
            if(data[index].equals(obj)){
                break;
            }else if(index==count-1){
                index = -1;
                break;
            }
        }
        
        return index;
    }
    
    // 배열의 데이터를 출력한다.
    public String toString(){
        StringBuffer str = new StringBuffer("[");
        if(count>0){
            str.append(data[0]);
        }
        for(int i=1; i<count; i++){
            str.append(", ").append(data[i]);
        }
        str.append("]");
        return str.toString();
    }

}


(2) MyArrayTest.java 테스트 main



public class MyArrayTest {

    public static void main(String[] args) {
        
        // 크기 5 의 배열 객체를 생성한다.
        MyArray arr = new MyArray(5);
        
        // 배열에 데이터를 입력한다.
        for(int i=1; i<=5; i++){
            arr.add("데이터-"+i);    
        }
        
        // 현재 배열의 입력된 데이터 전체를 출력한다. toString()
        System.out.println(arr);
        
        // 배열의 0번째 3번째 데이터를 가져와서 출력한다.
        System.out.println(arr.get(0));
        System.out.println(arr.get(3));
        
        // index ==3 의 데이터를 제거한다.
        arr.remove(3);
        
        // 배열의 데이터를 출력한다.
        System.out.println(arr);
        
        
        // index == 3 의 위치에 "데이터-4"를 삽입한다.
        arr.add(3, "데이터-4");
        
        // 배열 전체를 출력한다.
        System.out.println(arr);
    }

}



MyArrray.java 클래스를 활용하거나 기능을 확장하면 배열을 사용한 데이터 관리를 쉽게 할 수 있다.


ArrayClass.zip



출처: https://hyeonstorage.tistory.com/257?category=578561 [개발이 하고 싶어요]