[자료구조] JAVA 배열을 이용한 자료의 관리
JAVA 배열을 이용한 자료의 관리
자료구조란 특정 큐칙을 적용한 자료의 집합을 의미한다. 자료구조 중에서 가장 기본이 되며 가장 단순한 구조인 배열은 동일한 형태(int, double, String, Object 등)의 자료들이 순서를 가지고 구성된 집합이다.
배열은 초기 생성시에 그 크기를 미리 지정해야 한다. 초기에 지정한 크기는 바꿀 수 없기 때문에 생성한 크기보다 많은 자료를 저장할 수 없어 효율적인 자료구조로 사용하는데 제약이 따르게 된다.
배열 내에 저장된 자료들은 그 위치 값(index)을 가지고 식별할 수 있으며 위치값은 자료의 절대적인 위치를 나타내므로 특정 데이터에 접근 할 경우 처음부터 탐색할 필요 없이 index를 가지고 직접 접근할 수 있다.
1. 배열의 선언, 생성 및 초기화
new 키워드를 이용하여 배열을 생성한다. 배열을 생성할 때는 위와 같이 배열의 크기를 지정해야 한다.
arr = new int[3][];
arr[0] = new int[5];
arr[1] = new int[10];
arr[2] = new int[8];
위의 이차원 배열은 3행을 생성한 후 각 행을 5, 10, 8 열로 각각 다른 크기로 배열을 생성했다.
배열의 생성 및 초기화는 아래의 포스팅을 참고하자
2. 배열의 자료 관리 (삽입, 검색, 삭제)
(1) 자료의 삽입
배열에 값을 삽입하기 위해서는 마지막에 삽입된 인덱스의 다음 인덱스를 이용하여 삽입 할 자료를 대입한다.
int size = 0;
for(int i=0; i<arr.length; i++){
arr[i] = i+1;
}
배열 내의 데이터를 검색할 경우 자료의 중복이 없을 경우 배열의 처음부터 순차적으로 비교하여 매칭되는 데이터가 있을 경우 비교작업을 중지해도 되며, 중복이 있을 경우는 모든 요소를 순차적으로 비교하는 작업을 해야 한다.
for(int i=0; i<size; i++){
if(arr[i] == searchKey){
System.out.println(i + "번째에 " + searchKey + " 을 찾았다.");
break;
}
}
배열에 자료가 중복 저장이 없을 경우 자료를 찾은 후 더 이상 배열을 탐색할 필요가 없으므로, break; 로 for 문을 빠져나온다. 중복 자료가 있어 모든 배열을 찾아야 하는 경우 break; 를 제거하면 된다.
(3) 자료의 삭제
삭제도 검색과 마찬가지로 중복이 없으면, 삭제할 데이터를 찾아 삭제 후 더이상 비교 작업을 하지 않도록 break; 를 사용하면 된다.
데이터를 삭제하는 작업은 삭제할 데이터의 인덱스 이후의 값들을 앞으로 한칸씩 밀어주고 배열의 크기를 하나 감소시키면 된다.
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 클래스를 활용하거나 기능을 확장하면 배열을 사용한 데이터 관리를 쉽게 할 수 있다.
출처: https://hyeonstorage.tistory.com/257?category=578561 [개발이 하고 싶어요]
'기타 정보 > 자료구조' 카테고리의 다른 글
[자료구조] Java 원형 큐(Circular Queue), 우선순위 큐(Priority Queue), 데크(Deque-double ended queue) (0) | 2019.08.06 |
---|---|
[자료구조] Java 큐(Queue) 정리 (배열, 연결리스트) (0) | 2019.08.06 |
[자료구조] Java 스택(Stack) 정리 (배열, 연결 리스트) (0) | 2019.08.06 |
[자료구조] Java 이중 연결 리스트 (doubly linked list) 정리 (0) | 2019.08.06 |
[자료구조] Java 이중 말단 연결 리스트(double ended linked list) 정리 (0) | 2019.08.06 |
[자료구조] Java 단순 연결 리스트(simple linked list) 정리 (0) | 2019.08.06 |
[자료구조] Java 배열(array)과 리스트(list) 비교 (0) | 2019.08.06 |
[자료구조] 자료구조의 개요, 특징, 분류 (0) | 2019.08.06 |