🧐 List Interface(리스트 인터페이스)란?
List Interface는 선형 자료구조로 순서가 있는 데이터를 목록으로 사용할 수 있도록 만들어진 인터페이스이다.
배열은 우리가 선언한 공간 외에는 더 이상 사용할 수 없다.
이런 배열의 단점을 보완하여 List를 통해 구현된 클래스들은 동적 크기를 가지면서 배열처럼 사용할 수 있다.
특징으로는 다음과 같다.
- 요소의 저장 순서가 유지
- 같은 요소의 중복 저장 허용
- 배열의 기능 + 동적 크기 할당
Java에서는 두 가지 범용 List 구현이 있다.
- 일반적으로 사용하는 ArrayList
- 특정 상황에서 더 나은 성능을 제공하는 LinkedList
위의 List 구현말고도 잘 사용하지 않는 두 가지가 더 있다.
- Vector
- Stack
🧐 List Interface에 정의된 메서드
당연히 Collection 인터페이스로부터 상속받은 메서드도 쓸 수 있다.
📝 List 구현 클래스
1. ArrayList
가장 많이 사용되는 클래스이다.
JDK 1.2부터 제공되었으며, 내부적으로 배열을 이용하여 요소를 저장한다.
배열을 사용하기에 인덱스를 이용해 배열 요소에 빠르게 접근 가능하다.
배열은 크기를 변경할 수 없는 인스턴스라서 크기를 늘리기 위해서는 새로운 배열을 생성하고 기존 요소를 옮긴다.
이 모든 복잡한 과정을 ArrayList는 자동으로 수행한다. (성능이 느려질 수 있음)
- 가장 많이 사용되는 클래스
- 배열을 이용하므로 인덱스를 통해 요소 접근(Access Elements)에서 성능이 좋음
- 삽입, 삭제의 경우에는 복잡한 과정을 거쳐 배열의 크기를 동적으로 이용하기에 성능이 나쁨
- 삽입, 삭제의 경우 데이터를 한칸씩 옮겨서 작업하는데, 마지막 요소를 작업한다면 작업시간이 짧아진다
- 기존의 Vector를 개선한 것
2. LinkedList
ArrayList의 배열을 이용하여 생기는 단점을 개선하기 위해 만들어졌다.
JDK 1.2부터 제공되었으며, 내부적으로 연결 리스트(linked list)를 이용하여 요소를 저장한다.
연결 리스트는 저장된 요소가 비순차적이고, 요소(Node)들 사이를 링크(link)로 연결하여 구성한다.
즉, 데이터와 주소값으로 이루어진 클래스인 노드(Node)를 만들어 서로 연결하는 방식이다.
이렇게 다음 요소를 가리키는 참조(주소값)만을 가지는 연결 리스트를 단일 연결 리스트(Singly Linked List)라고 한다.
단일 연결 리스트는 저장 삭제 작업이 빠르지만, 이전 요소로 접근하기 힘들다.
따라서 이전 요소를 가리키는 참조도 가지는 이중 연결 리스트(Doubly Linked List)가 있으며 좀 더 많이 사용된다.
LinkedList 클래스는 이중 연결 리스트를 내부적으로 구현한 것이다.
- LinkedList는 이중 연결 리스트를 내부적으로 구현한 클래스
- 요소 검색의 경우, 메모리 주소값이 불연속적인 요소들이 연결된 것이라 처음부터 검색할 요소까지 검색해야해서 성능이 나쁨
- 요소 삽입, 삭제의 경우, 링크를 끊거나 연결만 하면 되기에 성능이 좋음
ArrayList 와 LinkedList 비교
3. Vector
JDK 1.0부터 제공되었으며, ArrayList와 같은 동작을 수행하는 클래스이다.
즉, Collections Framework가 도입되기 전부터 지원하던 클래스이다.
Vector는 항상 동기화를 지원하기에 멀티 쓰레드에서는 안전하지만, 단일 쓰레드에서도 동기화를 하므로 ArrayList에 비해 성능이 느리다.
- 기존 코드의 호환성을 위해 남아있는 코드
- Vector 클래스보다는 ArrayList 클래스를 사용하는 것이 좋음
- 항상 동기화를 지원
4. Stack
LIFO(Last In First Out) 방식으로 후입선출 구조이다.
이것은 마지막에 저장한 데이터를 가장 먼저 꺼낸다는 의미이다.
List 컬렉션 클래스의 Vector 클래스를 상속받고 있고, Vector의 메서드를 이용하여 구현되고 있으므로 크게 다를것이 없다.
Stack 클래스는 스택 메모리 구조를 표현하기 위해 Vector 클래스의 메서드 5개만 상속받아 사용한다.
- LIFO 구조
- Vector 클래스를 상속
- Vector 클래스의 메서드 5개만 사용
- 스택은 ArrayList와 같은 배열 기반 컬렉션 클래스가 적합하다
참고
https://st-lab.tistory.com/142
https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
http://www.tcpschool.com/java/java_collectionFramework_stackQueue
'프로그래밍 > Java' 카테고리의 다른 글
Set 인터페이스 (0) | 2022.02.24 |
---|---|
Queue 인터페이스 (0) | 2022.02.22 |
Java 줄바꿈문자 \n 이란? (0) | 2022.02.17 |
JVM(자바가상머신)이란? - Part 3, ClassLoader (0) | 2022.02.01 |
자바 getBytes() (0) | 2022.01.28 |