본문 바로가기

Algorithms/개념

자바 배열을 활용한 ArrayList 구현 및 기본 개념 정리

오늘은 선형자료구조인 배열의 개념 및 arrayList를 배열을 통해서 간단히 구현 그리고 마지막으로 arrayList의 함수에는 어떤 것들이 있는 지 알아보는 시간을 가지려고 한다.

 

ㆍ배열의 개념

배열은 동일한 데이터 유형의 요소를 갖는 데이터 구조로서 여러 값을 하나의 변수에 저장할 수 있도록 해주는 자료구조

 

ㆍ배열의 특징

  1. 동일한 데이터 유형의 요소
    - 배열은 동일한 데이터 유형의 요소들로 구성
  2. 고정된 크기
    - 배열은 생성될 때 크기가 fix되어 나중에 변경
    - 크기 변경을 원하면 새 배열 생성 후 복사하는 작업

  3. 인덱스
    - 배열의 각 요소는 고유한 인덱스(위치)를 가진다.
    - 첫 번째 인덱스는 0부터 시작해서 순차적으로 증가

  4. 메모리에 연속적으로 저장
    - 배열의 요소들은 메모리에 연속적으로 저장
    - 특정 인덱스의 요소를 빠르게 접근가능

  5. 반복문으로 처리 용이
    - 배열은 반복문(주로 for 루프)을 사용하여 효과적으로 처리
    - 주로 인덱스를 활용하여 배열의 각 요소에 접근하거나 수정

  6. 다차원 배열
    - 배열은 하나 이상의 차원을 가질 수 있다.
    - 1차원 배열은 벡터 또는 리스트와 유사, 2차원 배열은 행렬과 유사

ㆍArrayList의 개념

자바의 ArrayList는 Java에서 제공하는 동적 배열 기반의 자료구조로 배열과 유사하지만 크기가 가변적이다.

 

 

ㆍ배열로 ArrayList 구현

배열을 이용해서 간단하게 동적으로 삽입, 삭제가 가능한 ArrayList를 구현해보았다.

import java.util.Arrays;

public class ArrayActive {
    /*
    * Array
    * 많은 수를 다룰 때 사용
    * 데이터와 인덱스가 1:1 대응
    * 메모리에 연속이 되어 저장
    * - 장점
    * 1. 인덱스로 빠르게 접근가능
    * - 단점
    * 1. 데이터의 추가/삭제가 번거로움
    * 2. 길이를 정해서 생성해야한다.
    * 3. 가변길이는 배열의 크기가 변할 때마다 새로운 배열 생성
    * 4. 데이터 삭제 시, 인덱스 유지를 위해 빈 공간 유지
    * */

//  ArrayList없이 삽입, 삭제 구현
    public static void main(String[] args) {
        int size = 5;
        ArrayEx arrayClass = new ArrayEx(size);

        for (int i = 0; i < size; i++) {
            arrayClass.arr[i] = i + 1;
        }
        System.out.println(Arrays.toString(arrayClass.arr));
        arrayClass.insertData(0, 10);
        System.out.println(Arrays.toString(arrayClass.arr));
        arrayClass.insertData(2, 20);
        System.out.println(Arrays.toString(arrayClass.arr));
        arrayClass.insertData(4, 40);
        System.out.println(Arrays.toString(arrayClass.arr));
        arrayClass.insertData(-1, 40);

        arrayClass.removeData(1);
        System.out.println(Arrays.toString(arrayClass.arr));
        arrayClass.removeData(20);
        System.out.println(Arrays.toString(arrayClass.arr));
        arrayClass.removeData(99);
    }
}

class ArrayEx {
    int[] arr;

//  생성자로 배열 사이즈를 지정
    ArrayEx(int size) {
        this.arr = new int[size];
    }

//  배열에 값 삽입
//  새 배열 생성 후 복사 + 기존 배열 size 1증가 
//  기존 값들 삽입 후 idx에 맞는 자리에 data 삽입
//  나머지 값들은 1자리씩 뒤에 삽입
    void insertData(int idx, int data) {
        if (idx < 0 || idx >= this.arr.length) {
            System.out.println("idx err");
            return;
        }

        int[] arrNew = this.arr.clone();
        this.arr = new int[this.arr.length + 1];

        for (int i = 0; i < idx; i++) {
            this.arr[i] = arrNew[i];
        }

        this.arr[idx] = data;

        for (int i = idx + 1; i < this.arr.length; i++) {
            this.arr[i] = arrNew[i - 1];
        }
    }

//  배열에 값 삭제
//  새 배열 생성 후 복사 + 기존 배열 size 1 감소 
//  기존 값들 삽입 후 idx에 맞는 자리를 건너뛴다.
//  나머지 값들은 1자리씩 앞에 삽입
    void removeData(int data) {
        int targetIdx = -1;

        for (int i = 0; i < arr.length; i++) {
            if (data == arr[i]) {
                targetIdx = i;
                break;
            }
        }

        if (targetIdx == - 1) {
            System.out.println("해당 Data x");
        } else {
            int[] arrNew = this.arr.clone();

            this.arr = new int[this.arr.length - 1];

            for (int j = 0; j < targetIdx; j++) {
                arr[j] = arrNew[j];
            }
            for (int j = targetIdx; j < arr.length; j++) {
                arr[j] = arrNew[j+1];
            }
        }
    }
}

 

ㆍArrayList 주요함수

기본 동작
ArrayList() : 빈 ArrayList를 생성
ArrayList(Collection<? extends E> c) : 주어진 컬렉션의 요소를 포함하는 ArrayList를 생성
ArrayList(int initialCapacity) : 지정된 초기 용량으로 빈 ArrayList를 생성


요소 추가 및 삭제
boolean add(E e) : 요소를 ArrayList에 추가
void add(int index, E element) : 지정된 위치에 요소를 추가
boolean addAll(Collection<? extends E> c) : 지정된 컬렉션의 모든 요소를 ArrayList에 추가
boolean addAll(int index, Collection<? extends E> c) : 지정된 위치부터 지정된 컬렉션의 모든 요소를 추가
void clear() : 모든 요소를 제거
E remove(int index) : 지정된 위치의 요소를 제거
boolean remove(Object o) : 지정된 객체를 제거
boolean removeAll(Collection<?> c) : 지정된 컬렉션의 모든 요소를 제거


요소 접근 및 검색
E get(int index) : 지정된 위치의 요소를 반환
int indexOf(Object o) : 지정된 객체의 인덱스를 반환합니다. 처음 발견되는 것만 반환
int lastIndexOf(Object o) : 지정된 객체의 인덱스를 반환합니다. 마지막에 발견된 것만 반환
E set(int index, E element) : 지정된 위치에 새로운 요소를 설정
boolean contains(Object o) : 지정된 객체가 ArrayList에 포함되어 있는지 여부를 반환

 

크기 및 상태 확인
int size() : ArrayList에 포함된 요소의 개수를 반환
boolean isEmpty() : ArrayList가 비어 있는지 여부를 반환

 

배열로 변환
Object[] toArray() : ArrayList를 배열로 변환
<T> T[] toArray(T[] a) : ArrayList를 지정된 배열에 복사