본문 바로가기

자바

자바 List

1. List 란?

   - 객체를 일렬로 늘어놓은 구조로 이루어져 있다.

   - 배열처럼 "순서"가 있어 객체를 인덱스로 관리한다.

   - List의 종류는 ArrayList, Vector, Stack, LinkedList 이다.

 

2. ArrayList

   - 쉽게 확장 가능한 배열이다. 즉, 동적 크기의 배열이다.

   - 제네릭 클래스로 ArrayList<E> 와 같이 선언한다.

   - 동일한 값을 여러 번 저장할 수 있다.

   - 데이터를 자주 조회하는 작업에 효율적이다. 중간에 데이터 추가, 삭제 작업은 배열 재할당 작업이 필요하다.

   - Not Thread safe 하다. 즉, 멀티스레드 환경에서는 스레드 동기화 처리가 가능한 "Vector" 를 사용해야 한다.

 

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

public class ArrayListExample {
    public static void main(String[] args) {
        // ArrayList 생성
        ArrayList<String> fruits = new ArrayList<>();

        // 추가
        fruits.add("사과");
        fruits.add("바나나");
        fruits.add("딸기");

        // 크기
        System.out.println("과일 개수: " + fruits.size()); // 출력: 과일 개수: 3

        // 조회
        System.out.println("첫 번째 과일: " + fruits.get(0)); // 출력: 첫 번째 과일: 사과

        // 변경
        fruits.set(1, "오렌지");
        System.out.println("두 번째 과일: " + fruits.get(1)); // 출력: 두 번째 과일: 오렌지

        // 삭제
        fruits.remove("사과");
        System.out.println("과일 개수: " + fruits.size()); // 출력: 과일 개수: 2

        // 특정 인덱스 조회
        System.out.println("딸기의 인덱스: " + fruits.indexOf("딸기")); // 출력: 딸기의 인덱스: 1

        // ArrayList 비우기
        fruits.clear();
        System.out.println("비어있는지 확인: " + fruits.isEmpty()); // 출력: 비어있는지 확인: true
    }
}

 

3. Vector

   - ArrayList와 기능 측면에서는 거의 동일하다. 다만, 동기화 지원 여부가 다르다.

   - Thread safe 하다. 여러 스레드가 동시에 Vector를 수정하거나 접근해도 안전하다.

   - 하지만 동기화 처리로 인해 arrayList보다 성능이 떨어진다는 단점이 있다.

 

4. Stack

   - Stack은 Vector를 확장하여 만들었다. 즉, Vector가 부모 클래스이다.

   - Stack의 가장 큰 존재 이유는 LIFO를 지원하기 위함이다.

   - LIFO : Last In First Out의 약자로, 가장 마지막에 추가한 값을 가장 처음 빼 내는 것이다.

   - Stack에 대한 자세한 내용은 따로 정리할 예정이다.

 

5. LinkedList

   - 이중 연결 리스트 ( Doubly Linked List )로 구현된다.

   - 각 노드 ( Node )가 링크( 포인터 )로 한 줄로 서로 연결되어 있는 자료 구조이다.

   - 객체 추가 / 삭제할 때, 해당 노드와 이전 또는 다음 노드를 연결만 해주면 되어서 효율성이 뛰어나다.

   - 따라서 데이터를 자주 추가/삭제하는 작업에 효율적이다.

 

import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {
    public static void main(String[] args) {
        // LinkedList 생성
        LinkedList<Integer> linkedList = new LinkedList<>();

        // 추가
        linkedList.add(10);
        linkedList.add(20);
        linkedList.add(30);
        linkedList.add(40);

        // 출력
        System.out.println("LinkedList : " + linkedList); // 출력 LinkedList : [10, 20, 30, 40]

        // 특정 인덱스에 추가
        linkedList.add(2, 25); // 인덱스 2에 25 추가

        // 출력
        System.out.println("LinkedList : " + linkedList); // 출력 LinkedList : [10, 20, 25, 30, 40]

        // 특정 객체 삭제
        linkedList.remove(Integer.valueOf(30)); // 값이 30인 객체 삭제

        // 출력
        System.out.println("LinkedList : " + linkedList); // 출력 LinkedList : [10, 20, 25, 40]

        // 크기
        int size = linkedList.size();
        System.out.println("Size : " + size); // 출력 Size : 4

        // 조회
        int element = linkedList.get(2);
        System.out.println("index : " + element); // 출력 index : 25

        // 변경
        linkedList.set(1, 22); // 인덱스 1의 원소를 22로 변경

        // 출력
        System.out.println("LinkedList : " + linkedList); // 출력: LinkedList : [10, 22, 25, 40]
    }
}

 

6. ArrayList  VS  LinkedList

   - 장단점 

      ArrayList 장점: 인덱스 기반 접근이 빠르며, 데이터를 자주 조회하는 작업에 효율적이다.
                      단점: 중간에 객체를 추가/삭제하는 경우에 느릴 수 있고, 배열 재할당에 따른 성능 저하가 발생할 수 있다.

 

    LinkedList 장점: 중간에 객체를 추가/삭제하는 작업에 효율적이다.
                      단점: 메모리 사용이 많고, 인덱스 기반 접근이 불가능하여 ArrayList보다 느릴 수 있다.

 

    * linkedList.get(int index); 메서드는 실제로 인덱스 기반으로 직접 접근하는게 아니라 링크를 하나하나 따라가면서

      해당 인덱스에 해당하는 노드를 찾아서 객체를 가져오는 것이다.

'자바' 카테고리의 다른 글

자바 Queue  (0) 2023.07.24
자바 Stack  (0) 2023.07.24
자바 JVM 내부 구조 및 메모리 구조  (0) 2023.07.18
자바 String builder, String buffer 차이  (0) 2023.07.18
자바 JVM 이란  (0) 2023.07.18