(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<>와 달리 이동 연산 없이 수행된다.
1. 데이터 삽입 : 사용자가 새로운 할 일을 추가할 때마다 리스트에 해당 정보를 삽입해야 한다. 이때
'LinkedList<>'는 데이터를 빠르게 삽입할 수 있고 삽입 위치에 따라서 리스트 전체를 이동시키지 않아도 되기
때문에 이런 상황에 사용할 경우 성능이 뛰어나다!라고 말할 수 있다.
2. 데이터 삭제 : 사용자가 할 일을 완료하면 해당 할 일 정보를 리스트에서 삭제해야 한다.
'LinkedList<>'는 데이터를 빠르게 삭제할 수 있고 삭제 위치에 따라서 리스트 전체를 이동시키지 않아도
되기 때문에 성능이 뛰어나다!
LinkedList<>
를 사용하면 되고 어떤 책을 빌려갔는지, 반납했는지와 같은 데이터 조회를 하는 상황에서는 ArrayList<>
를 사용하는 것이 좋다 😙✌️데이터 '조회'가 많은 상황 -> ArrayList<>
데이터 '삽입'과 '삭제'가 많은 상황 -> LinkedList<>
유익한 글 잘 봤습니다, 감사합니다.