Java의 'List' 란?

myminimin·2023년 7월 20일
0

JAVA

목록 보기
8/21

(23.7.31 추가)

Vector는 JDK 1.0에서 등장한 자료 구조고 지금까지도 사용되지만 JDK 1.2 이후에 ArrayList가 추가된 후에는 ArrayList가 성능 측면에서 더 효율적이기 때문에 일반적으로 더 많이 사용된다고 한다. Vector는 호환성을 위해 기존 코드에서 그대로 사용 되는 경우가 많다고 한다!

일반적으로 신규 코드를 작성한다면 ArrayList를 사용하는 것이 좋다. 동기화를 지원하지 않아 더 가볍고 빠른 성능을 제공하며, 버전 호환성이 없다는 단점이 있지만 멀티스레드 환경이 아닌 한, 대부분의 경우에는 ArrayList를 사용하는 것이 더 권장된다.

또, 최신 자바 버전의 멀티스레드 환경에서 동기화된 자료 구조가 필요한 경우에는 Concurrent Collections 또는 동기화된 ArrayList인 Collections.synchronizedList()를 사용하는 것이 더 적절할 수도 있다고 한다.


List<>는 컬렉션 프레임워크(Collection Framework)의 일부로, 동적 크기 배열을 구현하는 인터페이스이다. List<>를 사용하면 데이터를 순서대로 저장하고 관리할 수 있다. 이를 통해 배열과 비슷한 동작을 하지만 크기를 자동으로 조정할 수 있는 장점을 갖는다.

publc interface List<E> extends Collection<E> { 
	// List 인터페이스의 메서드들이 여기에 선언된다.
}
  • 여기에서 <E>는 요소(element)의 타입을 의미하며, 원하는 타입으로 바꿀 수 있다. 예를 들면
    List<Integer>, List<String>, List<Double> 과 같이 사용할 수 있다.

    	`List<>` 인터페이스는 다음과 같은 주요 메서드들을 포함한다.
        	1. int size() : 리스트에 저장된 요소의 개수를 반환.
            2. boolean isEmpty() : 리스트가 비어있는지 여부를 확인.
            3. boolean contains(Object o) : 주어진 객체가 리스트에 존재하는지 여부를 확인.
            4. boolean add(E e) : 주어진 요소를 리스트의 끝에 추가.
            5. boolean remove(Object o) : 주어진 객체가 리스트에 존재할 경우 해당 요소를 삭제한다.
            6. E get(int index) : 주어진 인덱스에 위치한 요소를 반환.
            7. E get(int index, E element) : 주어진 인덱스에 위치한 요소를 새로운 요소로 대체.
            8. void add(int index, E element) : 주어진 인덱스에 위치한 요소를 새로운 요소로 대체.
            9. E remove(int index) : 주어진 인덱스에 위치한 요소를 삭제하고 반환.
            10. int indexOf(Object o) : 주어진 객체가 리스트에서 처음으로 나타나는 인덱스를 반환, 
            객체가 없을 경우 -1을 반환.
  • List<> 인터페이스를 구현하는 대표적인 클래스로는 ArrayList<>LinkedList<>가 있다. 대체로 데이터를 추가, 삭제하는 빈도에 따라서 성능 차이가 있으므로, 필요에 따라 적절하게 사용하면 된다.

    	- ArrayList<> : 내부적으로 배열로 구현되며, 요소에 대한 빠른 접근과 순차적인 접근에는 빠른 성능을 보인다.
    	- LinkedList<> : 내부적으로 연결 리스트로 구현되며, 요소의 삽입, 삭제에 빠른 성능을 보인다.
     	import java.util.ArrayList;
     	import java.util.List;
    
        public class ListExample {
            public static void main(String[] args) {
              // List 인터페이스를 ArrayList로 구현하여 리스트 생성
              List<String> fruits = new ArrayList<>();
    
              // 리스트에 요소 추가
              fruits.add("Apple");
              fruits.add("Banana");
              fruits.add("Orange");
    
              // 리스트의 크기 출력
              System.out.println("리스트 크기: " + fruits.size());
    
              // 리스트의 모든 요소 출력
              for (String fruit : fruits) { // 향상된 for문
                  System.out.println(fruit);
              }
    
              // 리스트에서 요소 삭제
              fruits.remove("Banana");
    
              // 요소 삭제 후 리스트이 모든 요소 출력
              for (String fruit : fruits) {
                  System.out.println(fruit);
              }
           }
    	}
  • 위의 예시는 ArrayList<>을 사용한 예시이다. ArrayList의 위치에 LinkedList<>를 사용해도 동일한 결과를 얻을 수 있는데 내부적으로 데이터를 저장하는 방식에 차이가 있어 특정 작업에 대한 성능 차이가 발생할 수 있다!

출력된 값 :
리스트 크기: 3
Apple
Banana
Orange
Apple
Orange


  • ArrayList<>은 배열을 사용하여 데이터를 저장해서 데이터의 추가나 삭제가 발생할 때, 해당 위치에서 데이터를 삽입하거나 삭제한 뒤에 다른 요소들을 한 칸씩 이동시켜야 한다. 예를 들어, 리스트 중간에 요소를 삽입하는 경우, 그 이후의 모든 요소들을 한 칸씩 뒤로 이동시켜야 한다.

  • LinkedList<>은 각 요소들을 노드(Node)로 구성한 연결 리스트를 사용해 데이터를 저장하기 때문에 데이터의 추가나 삭제가 발생할 때, 해당 위치에서 노드를 추가하거나 삭제하면 된다. 이 과정은 단순히 이전 노드와 다음 노드의 포인터를 변경함으로 이루어지기 때문에 ArrayList<>와 달리 이동 연산 없이 수행된다.

  • 예를 들어서 우리가 To-Do 리스트를 관리하는 프로그램을 만들고 있을 때 이 프로그램에서는 사용자가 할 일을 추가하거나 완료한 일은 삭제할 수 있어야 한다!
	1. 데이터 삽입 : 사용자가 새로운 할 일을 추가할 때마다 리스트에 해당 정보를 삽입해야 한다. 이때 
    'LinkedList<>'는 데이터를 빠르게 삽입할 수 있고 삽입 위치에 따라서 리스트 전체를 이동시키지 않아도 되기 
    때문에 이런 상황에 사용할 경우 성능이 뛰어나다!라고 말할 수 있다.
    
    2. 데이터 삭제 : 사용자가 할 일을 완료하면 해당 할 일 정보를 리스트에서 삭제해야 한다. 
    'LinkedList<>'는 데이터를 빠르게 삭제할 수 있고 삭제 위치에 따라서 리스트 전체를 이동시키지 않아도
    되기 때문에 성능이 뛰어나다!
    
  • 또 다른 예시로는 도서관 대출 관리 시스템을 생각해볼 수 있는데 사용자가 책을 대출하거나 반납하는 상황에서는 대출 정보에 누군가가 대출을 해갔습니다~ 반납했습니다~ 하고 데이터를 삽입, 삭제하는데 이때는 LinkedList<>를 사용하면 되고 어떤 책을 빌려갔는지, 반납했는지와 같은 데이터 조회를 하는 상황에서는 ArrayList<>를 사용하는 것이 좋다 😙✌️

데이터 '조회'가 많은 상황 -> ArrayList<>

데이터 '삽입'과 '삭제'가 많은 상황 -> LinkedList<>

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

유익한 글 잘 봤습니다, 감사합니다.

답글 달기