Java의 순차 리스트 구현

  1. List 인터페이스

1.1 List 소개

Java의 컬렉션 프레임워크에서 List는 Collection을 상속받는 인터페이스입니다. Iterable <-- Collection <-- List.

Collection도 인터페이스이며, 이는 후속 컨테이너에서 사용되는 일반적인 메서드를 정의합니다.

Iterable은 요소를 개별적으로 순회할 수 있는 클래스를 나타내는 또 다른 인터페이스입니다.

데이터 구조 관점에서 보면, List는 동일한 타입의 요소로 이루어진 유한 시퀀스인 선형 리스트이며, 이 시퀀스에서는 추가, 삭제, 수정 및 검색 등의 연산을 수행할 수 있습니다.

2.1 주요 메서드

List 인터페이스는 다음과 같은 다양한 메서드를 제공합니다:

  • boolean add(E e) - 요소 e를 리스트의 끝에 추가합니다.
  • void add(int index, E element) - index 위치에 요소 e를 삽입합니다.
  • E remove(int index) - index 위치의 요소를 제거합니다.
  • E get(int index) - index 위치의 요소를 반환합니다.
  • void clear() - 모든 요소를 제거합니다.
  1. ArrayList와 순차 리스트

2.1 순차 리스트 구현

순차 리스트는 연속된 메모리 공간을 이용하여 데이터 요소를 저장하는 선형 구조입니다. 일반적으로 배열을 사용하여 구현됩니다.

2.1.1 IList 인터페이스

public interface IList {
    void append(int data); // 마지막에 요소 추가
    void insertAt(int pos, int data); // 특정 위치에 요소 삽입
    boolean contains(int toFind); // 요소 포함 여부 확인
    int findIndex(int toFind); // 요소의 인덱스 찾기
    int retrieveAt(int pos); // 특정 위치의 요소 가져오기
    void updateAt(int pos, int value); // 특정 위치의 요소 업데이트
    void delete(int toRemove); // 첫 번째 일치하는 요소 삭제
    int length(); // 리스트 길이 반환
    void empty(); // 리스트 비우기
    void display(); // 리스트 출력 (테스트 용)
    boolean isFull(); // 리스트가 가득 찼는지 확인
    boolean isEmpty(); // 리스트가 비어있는지 확인
}

2.2 MyArrayList 클래스

public class MyArrayList implements IList {
    private int[] elements;
    private int currentSize;
    private static final int DEFAULT_CAPACITY = 5;

    public MyArrayList() {
        elements = new int[DEFAULT_CAPACITY];
    }
}

2.3 리스트 출력

@Override
public void display() {
    for (int i = 0; i < this.currentSize; i++) {
        System.out.print(elements[i] + " ");
    }
    System.out.println();
}

2.4 요소 추가

@Override
public void append(int data) {
    if (isFull()) {
        elements = Arrays.copyOf(elements, elements.length * 2);
    }
    elements[currentSize++] = data;
}

@Override
public boolean isFull() {
    return currentSize == elements.length;
}

2.5 특정 위치에 요소 삽입

@Override
public void insertAt(int pos, int data) {
    checkPosition(pos);
    if (isFull()) {
        elements = Arrays.copyOf(elements, elements.length * 2);
    }
    for (int i = currentSize - 1; i >= pos; i--) {
        elements[i + 1] = elements[i];
    }
    elements[pos] = data;
    currentSize++;
}

private void checkPosition(int pos) {
    if (pos < 0 || pos > currentSize) {
        throw new IllegalArgumentException("Invalid position: " + pos);
    }
}

2.6 요소 포함 여부 확인

@Override
public boolean contains(int toFind) {
    for (int i = 0; i < currentSize; i++) {
        if (elements[i] == toFind) {
            return true;
        }
    }
    return false;
}

2.7 요소 인덱스 찾기

@Override
public int findIndex(int toFind) {
    for (int i = 0; i < currentSize; i++) {
        if (elements[i] == toFind) {
            return i;
        }
    }
    return -1;
}

2.8 특정 위치의 값 가져오기

@Override
public int retrieveAt(int pos) {
    checkPosition(pos);
    if (isEmpty()) {
        throw new IllegalStateException("List is empty");
    }
    return elements[pos];
}

private void checkPosition(int pos) {
    if (pos < 0 || pos >= currentSize) {
        throw new IllegalArgumentException("Invalid position: " + pos);
    }
}

@Override
public boolean isEmpty() {
    return currentSize == 0;
}

2.9 특정 위치의 값 업데이트

@Override
public void updateAt(int pos, int value) {
    checkPosition(pos);
    if (isEmpty()) {
        System.out.println("List is empty");
    } else {
        elements[pos] = value;
    }
}

2.10 요소 삭제

@Override
public void delete(int toRemove) {
    if (isEmpty()) {
        throw new IllegalStateException("List is empty");
    }
    int index = findIndex(toRemove);
    for (int i = index; i < currentSize - 1; i++) {
        elements[i] = elements[i + 1];
    }
    currentSize--;
}

2.11 리스트 크기 반환

@Override
public int length() {
    return currentSize;
}

2.12 리스트 비우기

@Override
public void empty() {
    currentSize = 0;
}

3. ArrayList 사용 예제

3.1 ArrayList 생성

public static void main(String[] args) {
    List<Integer> list1 = new ArrayList<>();
    List<Integer> list2 = new ArrayList<>(10);
    list2.add(1);
    list2.add(2);
    list2.add(3);

    ArrayList<Integer> list3 = new ArrayList<>(list2);
}

3.2 ArrayList 기본 연산

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("JavaSE");
    list.add("JavaWeb");
    list.add("JavaEE");

    System.out.println(list.get(1)); // 특정 위치의 요소 가져오기
    list.set(1, "JavaWEB"); // 특정 위치의 요소 변경
    list.add(1, "JavaDataStructures"); // 특정 위치에 요소 삽입
    list.remove("JVM"); // 특정 요소 삭제
    list.remove(list.size() - 1); // 마지막 요소 삭제
    System.out.println(list.contains("JavaSE")); // 요소 포함 여부 확인
    System.out.println(list.indexOf("JavaSE")); // 요소의 첫 번째 인덱스 반환
    System.out.println(list.lastIndexOf("JavaSE")); // 요소의 마지막 인덱스 반환
    List<String> subList = list.subList(0, 4); // 부분 리스트 반환
    list.clear(); // 리스트 비우기
}

3.3 ArrayList 반복 처리

ArrayList는 여러 방법으로 순회할 수 있습니다:

public static void main(String[] args) {
    ArrayList<Integer> arrayList = new ArrayList<>();
    arrayList.add(10);
    arrayList.add(20);
    arrayList.add(30);

    // for문을 통한 순회
    for (int i = 0; i < arrayList.size(); i++) {
        System.out.print(arrayList.get(i) + " ");
    }

    // foreach문을 통한 순회
    for (int x : arrayList) {
        System.out.print(x + " ");
    }

    // Iterator를 사용한 순회
    Iterator<Integer> it = arrayList.iterator();
    while (it.hasNext()) {
        System.out.print(it.next() + " ");
    }
}

태그: java list ArrayList SequentialList DataStructure

8월 29일 21:29에 게시됨