본문 바로가기
Language/Java

[Java API] List 인터페이스(ArrayList, LinkedList)

by 클레어몬트 2024. 9. 19.

https://claremont.tistory.com/entry/Java-API-%EC%BB%AC%EB%A0%89%EC%85%98-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%ACCollection-Framework

 

[Java API] 컬렉션 프레임워크(Collection Framework)

컬렉션 프레임워크(Collection Framework): 데이터를 저장하고 조작하는 데 유용한 자료구조와 알고리즘을 제공하는 표준화된 라이브러리이 프레임워크는 데이터를 효율적으로 다루기 위해 다양한

claremont.tistory.com

https://claremont.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-ep3-1-%EB%8B%A8%EC%9D%BC%EC%97%B0%EA%B2%B0%EB%A6%AC%EC%8A%A4%ED%8A%B8Single-Linked-List

 

[자료구조] ep3-1) 단일연결리스트(Single Linked List)

ㅁ리스트 ADT: 여러 개의 노드들이 순차적으로 연결된 형태를 갖는 자료구조응용 예: 스택, 큐, 집합 / 소규모 db(주소록 등) or 더 복잡한 데이터구조 재료 ※노드(node): 커다란 자료구조의 일부

claremont.tistory.com

 

 

컬렉션 프레임워크 - 컬렉션 인터페이스 - 리스트 인터페이스

List 인터페이스

List 인터페이스java.util 패키지에 있는 컬렉션 프레임워크의 일부다. List객체들의 순서가 있는 컬렉션을 나타내며, 같은 객체의 중복 저장을 허용한다. 이 리스트는 배열과 비슷하지만, 크기가 동적으로 변화하는 컬렉션을 다룰 때 유연하게 사용할 수 있다.

List 인터페이스는 ArrayList, LinkedList 와 같은 여러 구현 클래스를 가지고 있으며, 각 클래스는 List 인터페이스의 메서드를 구현한다.

 

 

[List 인터페이스의 주요 메서드]

 

 

 

java.util.ArrayList

ㅇArrayList: 배열을 이용한 리스트 구조

 

 

- 기본 CAPACITY는 10(CAPACITY를 초과하면 배열을 50%씩 증가시킨다)

- 메모리 고속 복사 연산을 사용한다 - System.arraycopy()

 

 

java.util.LinkedList

ㅇLinkedList: 이중연결리스트 구조

 

- 첫 번째 노드와 마지막 노드 둘 다 참조한다

class Node {
    E item;
    Node next;
    Node prev;
}

class LinkedList {
    Node first; // 첫 번째 노드 참조
    Node last; // 마지막 노드 참조
    int size;
}

 

 

 

[성능 비교 표] (size = 50000, loop = 10000)

ArrayList vs LinkedList

이론적으로 LinkedList가 중간 삽입에 있어 더 효율적일 수 있지만, 현대 컴퓨터 시스템의 메모리 접근 패턴, CPU 캐시 최적화, 메모리 고속 복사 등을 고려할 때 ArrayList가 실제 사용 환경에서 더 나은 성능을 보여주는 경우가 많다. 따라서 대부분의 경우 배열 리스트가 성능 상 유리하다. 이런 이유로 실무에서는 주로 배열 리스트(ArrayList)를 기본으로 사용한다.

(만약 몇백만 건의 대용량 데이터를 앞쪽에서 자주 추가하거나 삭제할 일이 있다면 연결 리스트를 고려하자)

 

 

 

(ArrayList 사용 예시 코드)

package collection.list.ex1;

import java.util.ArrayList;

public class ListEx1 {
    public static void main(String[] args) {
        ArrayList<Integer> students = new ArrayList<>();
        // List<Integer> students = new ArrayList<>();
        students.add(90);
        students.add(80);
        students.add(70);
        students.add(60);
        students.add(50);

        int total = 0;
        for (int i = 0; i < students.size(); i++) {
            total += students.get(i);
        }

        double average = (double) total / students.size();
        System.out.println("점수 총합: " + total);
        System.out.println("점수 총합: " + average);
    }
}

 

 

 

 

 

 

 

참고 및 출처: 김영한의 실전 자바 - 중급 2편

https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EC%A4%91%EA%B8%89-2