본문 바로가기
JAVA

List 컬렉션

by winteringg 2022. 8. 28.

1. List 컬렉션의 특징 및 주요 메서드
1) 특징
  - 순서가 있는 데이터의 집합이며 데이터의 중복을 허용함. ex) 대기자 명단
  - 인덱스로 관리
2) 구현 클래스
  - ArrayList
  - Vector
  - LinkedList

3) 주요 메서드

기능 메서드 설명
객체 추가 boolean add(E e) 주어진 객체를 맨 끝에 추가. 저장되면 true 를 리턴함
void add(int index, E element) 주어진 인덱스에 객체를 삽입. 저장된 곳부터 인덱스 하나씩 밀려남
set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 교체
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부를 true, false 로 리턴
E get(int index) 주어진 인덱스에 저장된 객체를 리턴(보여줌)
isEmpty() 컬렉션 전체가 비어 있는 지 조사해서 true, false 로 리턴
int size() 저장되어 있는 전체 객체 수를 리턴. 중복 상관 없이 같이 조사됨.
int IndexOf(Object o) 왼쪽→오른쪽 지정된 객체의 위치(index)를 반환. (첫번째부터 순방향으로)
int lastIndexOf(Object o) 오른쪽→왼쪽 지정된 객체의 위치(index)를 반환. (마지막부터 역방향으로)
객체 삭제 void clear() 저장된 모든 객체를 삭제
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제하고 리턴
boolean remove(Object o) 주어진 객체를 삭제. 중복된 객체면 같이 삭제 됨.
객체 정렬 void sort(Comparator c) 지정된 비교자(Comparator)로 List를 정렬함.
List subList(int fromIndex, int toIndex) 지정된 범위(fromIndex부터 toIndex)에 있는 객체 반환

  - List 컬렉션 객체 추가, 찾기, 삭제

List<String>list = ....; //리스트가 저장하는 객체 타입이 String 타입이라는 의미
list.add("홍길동");      //리스트 배열 맨 끝에 "홍길동" 객체가 추가됨
list.add(1, "홍길동");   //지정된 1번 인덱스에 "홍길동" 객체가 삽입됨
String.str = list.get(1);  //1번 인덱스 위치의 String 객체 찾아서 리턴됨
list.remove(0);         //지정된 0번 인덱스의 객체 삭제. 뒤의 인덱스들은 한 칸씩 앞으로 당겨짐.
list.remove("홍길동");   //지정한 객체 삭제. 뒤의 인덱스들은 한 칸씩 앞으로 당겨짐.

  - 전체 객체를 대상으로 반복해서 얻기

List<String>list = ...;
for(int i=0; i<list.size(); i++) {  //저장된 총 객체 수 만큼 반복
   String str = list.get(i);        //저장된 총 객체들을 불러와서 str 에 저장.
}

//향상된 for문
for(String str : list) {   //저장된 총 객체 수 만큼 반복해 가져오며 str 에 저장.
}


2. ArrayList

1) 기존의 Vector 를 개선한 것으로 구현원리와 기능적으로 동일함. 보통 싱글 스레드에서 사용 됨.
2) 배열 기반의 저장 공간
  - 초기 : 10
  - 초기 용량 지정 가능
  - 저장 용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어남. (기존 배열의 문제점 해결)

ArrayList 구조

  - 만약 30개의 String 배열을 생성하고 싶으면 아래처럼 괄호 안에 생성하고 싶은 배열 개수를 넣으면 됨. (0~29)

List<String>list = new ArrayList<String>(30);

3) 특정 위치의 객체 제거 Object remove(int index)
  - 특정 위치의 객체 제거 Object remove(int index)

객체 제거되는 구조

4) 고정된 객체들로 구성된 List 를 생성하는 방법은 다음과 같음

List<T> list = Arrays.asList(매개값);
//"홍길동", "김자바", "박철수" 총 3개의 객체 배열이 생성됨.
List<String>list1 = Arrays.asList("홍길동", "김자바", "박철수");
for(String name : list1) {
  System.out.println(name);
}

//정수타입 1,2,3 의 배열이 생성됨.
List<Integer>list2 = Arrays.asList(1, 2, 3);
for(int value : list2) {
  System.out.println(value);
}

 

3. Vector (ArrayList의 old 버전 느낌)
1) ArrayList와 동일한 내부 구조를 가지고 있음.

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


2) ArrayList와 차이점
  - Vector는 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 이 메소드를 실행할 수 없음.
  - 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 할 수 있음 (자체적으로 동기화 처리가 되어있음)

Vector는 멀티 스레드에서 안전하게 사용 가능함


4. LinkedList
1) 배열의 단점을 보완 (크기 변경 불가, 추가/삭제 시간이 오래걸리는 것)
2) 배열과 달리 LinkedList 는 불연속적으로 존재하는 데이터를 연결함.
3) ArrayList Vector 처럼 동일한 내부 구조를 가지고 있음.

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


4) 인접 참조를 링크해서 체인처럼 관리하기 때문에 변경에 유리함.

인접 참조를 링크해서 체인처럼 관리하는 LinkedList 구조


3) 특정 인덱스의 객체를 제거하면 앞, 뒤 링크만 변경되고 나머지 링크는 변경되지 않음.
  - 3번 인덱스를 삭제 해도 뒤의 인덱스들이 당겨온다거나 하지 않음. 이 삭제된 3번 인덱스에 새로운 객체를 삽입해도 됨.
  - 순차적으로 데이터를 추가/삭제 ▶ ArrayList 가 빠르지만 메모리 사용이 비효율적 (고성능을 위해 배열을 크게 잡음)
  - 비순차적으로 데이터를 추가/삭제 ▶ LinkedList 가 더 빠르지만 데이터가 많을수록 접근성이 떨어짐. (노드 하나 하나씩 방문해야 하기 때문에)

- ArrayList & LinkedList 나노 타임으로 소요시간 계산해보기

 

 

 

 

참고 : [한빛미디어] 이것이 자바다 (신용권의 Java 프로그래밍 정복) Chapter 15.컬렉션 프레임워크
참고 : [도우출판] JAVA의 정석(3ND EDITION)-자바의 정석 최신 Java 8.0 포함 Chapter 11.컬렉션 프레임워크

'JAVA' 카테고리의 다른 글

Map 컬렉션 (HashMap, TreeMap)  (0) 2022.08.28
Set 컬렉션 (HashSet, TreeSet)  (0) 2022.08.28
컬렉션 프레임워크  (0) 2022.08.28
람다식 (Lambda Expression)  (0) 2022.08.28
생성자 super() vs 참조변수 super  (0) 2022.08.28

댓글