List 인터페이스 구현체 비교

  • ArrayList: 크기가 변하는 배열을 구현한 자료 구조다. ArrayList는 배열과 유사한 특징을 가지고 있어 getset 메서드로 요소에 직접 접근할 수 있다.
  • Vector: ArrayList와 유사하지만 동기화 되어있지 않고 오래되었다.
  • LinkedList: 이중 연결 리스트로 구현된 자료 구조다. 삽입·삭제 연산의 성능이 좋지만, 요소에 접근하는 메서드(get, set)의 성능이 낮다. 원하는 요소에 도달할 때까지 리스트를 순회해야 하기 때문이다.

Thread-Safe 환경을 고려해야 한다면 ArrayList가 좋은 선택이다. LinkedList는 Queue 인터페이스를 구현하므로 다른 자료 구조에 비해 유용한 메서드(offer, peek, poll 등)가 더 많다.

Vector는 메서드에 synchronized 키워드가 명시되어 있다. synchronized 키워드는 두 개 이상의 스레드가 한 변수에 동시에 접근할 때, 경쟁 상태가 발생하지 않도록 한다. 따라서 Vector 클래스는 멀티 스레드 환경에서 안전하게 사용할 수 있어야 하지만, Vector 클래스의 동기화는 완벽하지 않다. Vector 클래스의 메서드는 동기화 되어 있지만, Vector 인스턴스에 대해서는 동기화 되지 않기 때문이다.

List.of 메서드

List.of 메서드는 불변 리스트를 생성하는 정적 메서드다. 리스트에 요소를 추가·삭제·변경 할 수 없고, 요소의 값으로 null을 설정할 수 없다.

List<String> empty = List.of();
List<String> single = List.of("apple");
List<String> fruits = List.of("apple", "banana", "orange");
List<String> many = List.of(fruits);