컬렉션 프레임워크(Collections Framework) - List Interface

ImOk·2021년 12월 7일
2
post-thumbnail

📚 List Interface

  • 배열과 비슷하게 객체를 인덱스로 관리한다.
  • 배열과 차이점은 저장 용량이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여된다는 점이다.
  • 추가, 삭제, 검색을 위한 다양한 메소드가 제공 된다.
  • 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다. 때문에 동일한 객체를 중복 저장할 수 있다. 이 경우 동일한 번지가 참조된다.
  • null도 저장 가능하며, 이 경우 인덱스는 객체를 참조하지 않는다.

[ List 인터페이스에서 공통적으로 사용하는 메소드 ]

기능메소드설명
객체 추가boolean add(E e)주어진 객체를 맨 끝에 추가
void add(int index, E element)주어진 인덱스에 객체 추가
E set(int undex, E element)주어진 인데스에 저장된 객체를 주어진 객체로 바꿈
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 조사
E get(int index)주어진 인덱스에 저장된 객체를 리턴
boolean isEmpty()컬렉션이 비어 있는지 조사
int size()저장되어 있는 전체 객체 수 리턴
객체 삭제void clear()저장된 모든 객체 삭제
E remove(int index)주어진 인덱스에 저장된 객체를 삭제
boolean remove(Object o)주어진 객체를 삭제

💻 List 예제

// String 객체를 저장하는 ArrayList 생성
List<String> list = new ArrayList<String>();

list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add(2, "Database");
list.add("iBATIS");

System.out.println("총 객체수: " + list.size());
System.out.println(list.contains("JDBC"));
System.out.println("2: " + list.get(2));

for (int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    System.out.println(i + ":" + str);
}

list.remove(2); // 2번 인덱스 "Database" 삭제
list.remove(2); // 2번 인덱스 "Servlet/JSP" 삭제
list.remove("iBATIS");

for (int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    System.out.println(i + ":" + str);
}

🔔 List 출력

총 객체수: 5
true
2: Database

0:Java
1:JDBC
2:Database
3:Servlet/JSP
4:iBATIS

0:Java
1:JDBC


1. ArrayList

  • 인덱스를 이용해 객체를 찾거나, 맨 마지막에 객체를 추가하는 경우 사용
  • 중간 인덱스의 객체를 제거하면 뒤에 있는 객체의 인덱스가 1씩 앞당겨 진다.
List<E> list = new ArrayList<E>();
List<E> list = new ArrayList<>();

2. Vector

  • ArrayList와 동일한 내부 구조를 가진다.
  • 차이점은 Vector는 동기화(synchronized)된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메소드를 실행할 수 없고, 하나의 스레드가 메소드 실행을 완료해야만 다른 스레드가 메소드를 실행할 수 있다.
  • 따라서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 할 수 있다 (Thread safe 하다고 표현)
  • 동기화 되어있기 때문에 ArrayList 보다는 객체를 추가, 삭제하는 과정은 느리다. 안정성을 추구하고, 속도를 포기한 트레이드 오프(trade off)이다.
List<E> list = new Vector<E>();
List<E> list = new Vector<>();

3. LinkedList

  • ArrayList에는 내부 배열에 객체를 저장해서 인덱스로 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리 한다.
  • 따라서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경된다.
  • 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList 사용 보다는 LinkedList 사용이 더 좋은 성능 발휘
List<E> list = new LinkedList<E>();
List<E> list = new LinkedList<>();
구분순차적 추가/삭제중간 추가/삭제검색
ArrayList빠르다느리다빠르다
LinkedList느리다빠르다느리다


📜 마치며

List 컬렉션을 정리하면서 궁금증이 생겼던, 아래 둘의 차이를 정리해 보았다.

List<E> list = new ArrayList<>();  
ArrayList<E> list = new ArrayList<>();

List인터페이스 이고, ArrayList클래스 이다.
List를 도형, ArrayList는 정사각형이라고 비유한다면,

List로 선언하면 여러 도형들(ArrayList,LinkedList)로 바꿀 수 있고,
ArrayList로 선언하면 정사각형(ArrayList)로만 사용할 수 있다.



📖 참고 문헌

profile
ImOk👌

0개의 댓글