자료구조와 알고리즘/리스트

[자료구조] 리스트 - ArrayList

운동하는 주니어개발자 2024. 12. 17. 19:18

1. List의 특징

  - 선형적인 자료구조

  - 데이터를 일렬로 늘여 놓은 형태

  - 순서

  - 데이터 삽입하기

  - 데이터 삭제하기

  - 리스트 탐색하기

 

2. List의 종류

  - ArrayList

  - LinkedList : Single Linked List, Double Linked List

 

3. ArrayList

  - 배열 기반의 리스트

  - 메모리 공간을 연속적으로 사용

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 문자열 리스트 생성
        List<String> list = new ArrayList<>();

        // 리스트에 문자열 넣기
        list.add("Hello");
        list.add("World");
        list.add("GRACE");

        System.out.println(list);

        // 리스트에서 문자열 삭제
        list.remove("Hello");

        System.out.println(list);

        // 리스트에서 원하는 문자열 찾기 (0번째 데이터)
        System.out.println(list.get(0));
    }
}

 

4. ArrayList 배열 예제

1. IList라는 이름의 인터페이스를 생성

package list;

public interface IList<T> {
    void add(T t);

    void insert(int index, T t);

    void clear();

    boolean delete(T t);

    boolean deleteByIndex(int index);

    T get(int index);

    int indexOf(T t);

    boolean isEmpty();

    boolean contains(T t);

    int size();
}

 

2. 인터페이스를 생성 후 구현해줄 클래스를 생성 후 초기 설정 및 생성자 생성

package list;

public class MyArrayList<T> implements IList<T> {

    private static final int DEFAULT_SIZE = 50;

    private int size;
    private T[] elements;

    // 생성자 생성
    public MyArrayList() {
        this.size = 0;
        this.elements = (T[]) new Object[DEFAULT_SIZE];
    }

 

3. 배열 끝에 데이터를 넣어주는 add 함수 예제

@Override
    public void add(T t) {
        // 만약에 elements 배열에 데이터가 꽉 찼을 경우
        // Arrays.copyOf를 사용하여 배열의 크기를 확장시킨 후 데이터를 옮겨준다
        // 옮기지 않을경우 그냥 새 배열을 생성한것과 다름없음
        if(this.size == this.elements.length) {
            this.elements = Arrays.copyOf(this.elements, this.size * 2);
        }
        this.elements[this.size++] = t;
    }

 

4. 배열의 원하는 부분에 데이터를 넣어주는 insert함수 예제

@Override
    public void insert(int index, T t) {
        if(this.size == this.elements.length) {
            this.elements = Arrays.copyOf(this.elements, this.size * 2);
        }
        for (int i = index; i < this.size; i++) {
            this.elements[i + 1] = this.elements[i];
        }
        this.elements[index] = t;
        this.size++;
    }

 

5. 배열의 삭제하고 싶은 데이터(원하는 값)을 삭제하는 delets함수 예제

@Override
    public boolean delete(T t) {
        for(int i = 0; i < this.size; i++) {
            if(this.elements[i].equals(t)) {
                for(int j = i; j < this.size - 1; j++) {
                    this.elements[j] = this.elements[j + 1];
                }
                this.size--;
                return true;
            }
        }
        return false;
    }

 

6. 배열의 위치에 해당하는 데이터를 삭제하는 deleteByIndex함수 예제

@Override
    public boolean deleteByIndex(int index) {
        if(index < 0 || index > this.size - 1 ) {
            return false;
        }
        for(int i = index; i< this.size -1; i++) {
            this.elements[i] = this.elements[i + 1];
        }
        this.size--;
        return true;
    }

 

7. 배열의 원하는 데이터를 가져오는 get함수 예제

@Override
    public T get(int index) {
        if(index < 0 || index > this.size - 1) {
            throw new IndexOutOfBoundsException();
        }
        return this.elements[index];
    }

 

8. 파라미터 t로 받은 데이터가 배열에 존재하면 true 그렇지 않다면 false를 반환하는 contains함수 예제

@Override
    public boolean contains(T t) {
        for(int i = 0; i < this.size; i++) {
            if(this.elements[i].equals(t)) {
                return true;
            }
        }
        return false;
    }

 

9. contains함수와 유사하지만 데이터의 유무만 파악해주는게 아닌 존재한다면 어느 위치에 존재하는지 알려주는 indexOf함수 예제

@Override
    public int indexOf(T t) {
        for(int i = 0; i < this.size; i++) {
            if(this.elements[i].equals(t)) {
                return i;
            }
        }
        return -1;
    }

 

10. 배열에 데이터가 얼마나 있는지 조회해주는 size함수 예제

@Override
    public int size() {
        return this.size;
    }

 

11. 배열에 데이터가 있는지 없는지 확인하는 isEmpty함수 예제

@Override
    public boolean isEmpty() {
        return this.size == 0;
    }

 

12. 배열에 데이터를 전부 비워주는 clear함수 예제

@Override
    public void clear() {
        this.size = 0;
        this.elements = (T[]) new Object[DEFAULT_SIZE];
    }