본문 바로가기
JAVA

[JAVA] 컬렉션(Collection)[1]- List에 대하여

by code:J 2023. 7. 26.
반응형
SMALL

컬렉션(Collection)[0] - Collection에 대하여 (완료)

컬렉션(Collection)[1] - List에 대하여 (현재)

컬렉션(Collection)[2] - Map에 대하여 (예정)

컬렉션(Collection)[3] - Set에 대하여 (예정)


Collection의 List 인터페이스

Java의 Collection Framework에서 가장 많이 사용되는 인터페이스 중 하나입니다.

Array(배열)와 유사한 구조를 가지고 있지만, 크기를 동적으로 조정하는 (Dynamic Array) 동적 배열로 구현됩니다.

 

또한 , 순서가 있는 데이터의 집합으로, 중복을 허용하며 인덱스(Index)를 통해 각 요소에 접근할 수 있습니다.

List의 특징

  •  크기 조정 : 요소들을 추가하거나 삭제할 때, 내부적으로 자동으로 크기를 조정합니다.
    • 배열을 사용하면서도 배열의 크기를 동적으로 변경할 수 있게 만들어 줍니다.
  • 인덱스 접근 : 배열의 인덱스를 사용하여 원하는 요소에 빠르게 접근할 수 있습니다.
    • 리스트 내부에 위치해 있는 특정한 요소를 빠르게 검색할 수 있습니다.
  • 순서 보장 : 요소들의 순서를 보장해 줍니다.
    • 요소를 추가한 순서대로 유지해 줍니다.
  • 중복 요소 허용 : 중복 요소의 저장을 허용합니다.
    • 같은 값을 가진 요소를 여러 번 추가할 수 있습니다.

List의 주요 메서드

  • add (E e) : 요소를 List에 추가합니다.
  • get (int index) : 인덱스로부터 해당 위치의 요소를 반환합니다.
  • remove ( int index) : 인덱스로부터 해당 위치의 요소를 삭제합니다.
  • size() : List에 저장된 요소의 개수를 반환합니다.

 

 


ArrayList 에 대하여

내부적으로 Array(배열)을 사용하여 요소들을 저장하는 Dynamic Array(동적 배열)입니다.

자바의 배열은 연속된 메모리 공간을 사용하므로, 인덱스를 사용하여 빠르게 요소에 접근할 수 있습니다.

크기를 동적으로 조절할 수 있기 때문에, 요소를 추가하거나 삭제할 때 배열의 크기를 자동으로 조정합니다.

 

ArrayList의 특징 

  • 자바의 배열은 연속된 메모리 공간을 사용하므로, 인덱스를 사용하여 빠르게 요소에 접근할 수 있습니다.
    • 따라서 조회 시 인덱스를 통한 접근은 O(1)의 시간복잡도를 가집니다
  • 데이터의 추가 및 삭제를 빈번하게 사용하는 경우에는 성능에 영향을 미칠 수 있습니다. 
    • 이유는 요소를 추가하고 삭제함으로써 크기가 조정되기 때문에 배열의 복사가 발생할 수도 있습니다.
    • 또한, 동시성 문제로 인한  Concurrentmodificationexception  이 발생할 수 있습니다.(추후 추가 포스팅 예정)
import java.util.ArrayList;
import java.util.List;

public class WritingContents {
    public static void main(String[] args) {
        // ArrayList를 생성하고, 글의 단락을 저장할 List를 만듭니다.
        List<String> paragraphs = new ArrayList<>();

        // 글의 단락들을 추가합니다.
        paragraphs.add("안녕하세요 Code:J 입니다!");
        paragraphs.add("이 포스트는 Java의 Collection 중 ArrayList를 사용하여 작성되었습니다.");
        paragraphs.add("ArrayList는 데이터를 동적으로 저장하는 데 효과적이며,");
        paragraphs.add("내부적으로 배열을 사용하여 빠른 검색과 순차적 접근이 가능합니다.");

        // 글을 출력합니다.
        System.out.println("<< 글의 내용 >>");
        for (String paragraph : paragraphs) {
            System.out.println(paragraph);
        }
    }
}

위의 예시 코드에서는 ArrayList를 사용하여 글의 단락들을 저장하고 출력하는 방법을 보여줍니다.

add() method를 사용하여 단락을 추가해 주고, 향상된 for문을 사용하여 출력해 주었습니다.

 

이렇게 ArrayList는 데이터를 동적으로 저장하고 처리하는데 매우 유용한 클래스이며, Java에서 많이 활용되는 컬렉션 중 하나입니다.

 


LinkedList에 대하여

Node(노드)로 연결된 리스트를 사용하여 요소들을 저장하는 자료구조입니다.

각 노드는 데이터와 다음 노드를 가리키는 Reference(참조)를 포함합니다.

각 노드들은 서로를 연결하면서 리스트를 형성합니다.

ArrayList와 다르게 데이터를 추가 및 삭제하는 데에 있어 높은 유연성을 가지고 있습니다.

 

LinkedList의 특징

  • 데이터를 추가 및 삭제하는 빈도가 높은 경우에는 ArrayList  보다는 LinkedList 가 효율적입니다.
  • 다만, Index를 통한 접근을 하는 ArrayList 보다 느릴 수 있습니다.
    • 각 요소가 노드로 연결되어 있으므로, 원하는 위치에 요소를 접근하려면 처음부터 순회하며 찾기 때문입니다.
    • 따라서 조회 시 인덱스를 통한 접근은 O(n)의 시간복잡도를 가집니다 => (n)은 리스트의 길이
import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        // LinkedList를 생성합니다.
        LinkedList<String> linkedList = new LinkedList<>();

        // 요소들을 추가합니다.
        linkedList.add("apple");
        linkedList.add("banana");
        linkedList.add("orange");
        linkedList.add("grape");

        // LinkedList를 출력합니다.
        System.out.println("<< LinkedList의 내용 >>");
        for (String fruit : linkedList) {
            System.out.println(fruit);
        }

        // 인덱스를 사용하여 요소에 접근합니다.
        System.out.println("인덱스 2에 있는 요소: " + linkedList.get(2));

        // 요소를 삭제합니다.
        linkedList.remove("banana");

        // 변경된 LinkedList를 출력합니다.
        System.out.println("<< 변경된 LinkedList의 내용 >>");
        for (String fruit : linkedList) {
            System.out.println(fruit);
        }
    }
}

위의 예시 코드에서는 LinkedList를 생성한 후 add() 메서드를 사용하여 요소들을 추가하였습니다.

그리고 for문을 사용하여 LinkedList의 요소들을 출력합니다.

인덱스를 사용하여 get() 메서드를 호출하여 특정 위치에 접근하고, remove() 메서드를 사용하여 "banana"를 삭제하였습니다.

 

이처럼 LinkedList는 데이터를 추가하고 삭제할 때 효율적인 자료구조 이므로, 데이터의 변경이 빈번하게 발생하는 경우에 유용하게 사용될 수 있습니다. 다만, 인덱스를 통한 접근은 ArrayList 보다 느릴 수도 있기 때문에, 데이터의 조회가 빈번하게 발생하는 경우에는 ArrayList를 사용할지 LinkedList를 사용할지 성능적인 면에서 고려해보아야 합니다.

 


요약

  • ArrayList    : 배열 기반, 인덱스 접근 빠름, 추가 / 삭제가 느리다.
  • LinkedList  : 노드 기반, 인덱스 접근 느림, 추가 / 삭제가 빠르다.

 

이 포스팅을 하다 보니 for문에 관한 iterator, iterable과 깊은 복사, 얕은 복사, Concurrentmodificationexception에 대하여 추가 포스팅을 진행하려 합니다.

반응형
LIST