100세까지 코딩
[자바 공부] 컬렉션(3) List 본문
List란?
- 요소들에 순서를 부여하며 저장한다.
- 인덱스가 있어 위치를 지정하여 찾을 수 있다.
- 동일한 요소를 중복 저장할 수 있다.
List 종류
ArrayList | 동적 배열을 이용한 List |
Vector | ArrayList와 거의 동일, but 동기화 제공 |
LinkedList | 연결 리스트로 구현된 List |
ArrayList
- 배열을 이용하여 List 인터페이스를 구현한 클래스이다.
- List 종류 중 가장 많이 사용되는 클래스이다.
- ArrayList는 필요한 경우 현재의 크기보다 50% 자동으로 크기를 키운다.
그러나, 비용이 비싸서 생성자를 사용하여 목적에 맞게 사이즈를 설정하는 것이 좋다. - 요소들은 get(), set()으로 직접 접근 가능하다.
- add(), remove()를 사용하여 새로운 요소를 추가 또는 제거할 수 있다.
ArrayList 예시
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
public class ArrayListStudy {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(5); // 목적에 맞게 사이즈 설정
list.add("111"); // [0]인덱스에 "111" 추가
list.add("222"); // [1]인덱스에 "222" 추가
list.add(1, "333"); // [1] 인덱스에 "333" 추가 후 기존에 있던것은 한칸 뒤로
list.add("444");
System.out.println("구성 데이터 : " + list);
// 데이터 위치 파악
int pos = list.indexOf("222");
System.out.println("222의 위치는 :" + pos);
// ArrayList가 비어 있는지, 데이터 포함 여부 검사
boolean check1 = list.isEmpty();
boolean check2 = list.contains("444");
System.out.println("비어 있음 : " + check1 + " 포함 여부 : " + check2);
// 데이터 개수
int size = list.size();
System.out.println("리스트의 크기 :" + size);
// 특정 위치 데이터 구하기
String item = list.get(2);
System.out.println("2번째 위치 데이터 : " + item);
// 데이터 반복 처리 - 첫 번째 방법
System.out.println("데이터 반복 처리 - 첫 번째 방법");
for (int i = 0; i < list.size(); i++){
System.out.println("Index: " + i + " - Item: " + list.get(i));
}
// 데이터 반복 처리 - 두 번째 방법
System.out.println("데이터 반복 처리 - 두 번째 방법");
for (String str : list){
System.out.println("Item is: " + str);
}
// 데이터 반복 처리 - 세 번째 방법
System.out.println("데이터 반복 처리 - 세 번째 방법");
for (Iterator<String> it = list.iterator(); it.hasNext();) {
System.out.println("데이터 :" + it.next());
}
// 데이터 수정
list.set(1,"888");
System.out.println("수정 후 :" + list);
// 지정 위치 데이터 제거, 데이터로 저장되어 있는 첫 요소 제거
list.remove(0);
list.remove("444");
System.out.println("리스트의 최종 내용 : " + list);
// Arraylist를 Array로 변환
String[] arr = list.toArray(new String[list.size()]);
System.out.println("변환 배열 : " + Arrays.toString(arr));
}
}
결과 :
Vector
- ArrayList와 동일하지만 차이점은 2개다.
- 첫 째, 동기화 기능이 있다.
- 둘 째, 사이즈를 증가시킬 때 100% 증가시킨다.
- 멀티 스레드가 아닌 경우에는 동기화되어 있지 않은 ArrayList를 사용하는 게 바람직하다. (성능 ↑)
Vector 예시
- ArrayList와 사용법이 비슷하기 때문에 Vector에서만 사용할 수 있는 요소 추가와 반복 처리 방법을 알아보기
import java.util.Enumeration;
import java.util.Vector;
public class VectorStudy {
public static void main(String[] args) {
Vector<String> v = new Vector<String>();
v.add("aaa"); // "aaa" 추가, Collection 메서드
v.addElement("bbb"); // "bbb" 추가, Vector 메서드
v.addElement("ccc");
v.remove("bbb");
// Vector에서만 적용할 수 있는 반복 처리 방법
Enumeration<String> e = v.elements();
while(e.hasMoreElements()) {
System.out.println(e.nextElement());
}
}
}
결과 :
LinkedList
- 연결 리스트 형태로 자료를 저장한다.
- 데이터가 많으면 검색 시 처음부터 순차적으로 찾아야 되어 성능이 저하된다.
- 데이터 추가 / 삭제는 위치 정보를 수정만 하면 되어 처리가 빠르다.
- LinkedList는 자료구조가 유연성이 있어 Stack, Queue 둘다 구현 가능하다.
메서드 예시
import java.util.LinkedList;
public class LinkedListStudy {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.addFirst("aaa"); // 리스트 제일 앞에 추가
list.addLast("bbb"); // 리스트 끝에 추가
list.getLast(); // 마지막 위치 데이터 반환
// Queue 관련
list.offer("ddd"); // 마지막 원소로 추가
list.poll(); // 리스트의 첫 번째 데이터 반환 (제거 O)
list.peek(); // 리스트의 첫 번째 데이터 반환 (제거 X)
// Stack 관련
list.push("eee"); // 리스트의 마지막에 추가
list.pop(); // 리스트의 마지막 데이터 반환 (제거 O)
list.peek(); // 리스트의 마지막 데이터 반환 (제거 X)
// 임의의 위치 데이터 조작
list.add("111");
list.add(1,"222"); // [1] 인덱스에 "222" 추가
list.get(1); // [1] 인덱스 데이터 반환
list.remove(1); // [1] 인덱스 원소 삭제
}
}
LinkedList 예시
import java.util.LinkedList;
public class LinkedListStudy {
public static void main(String[] args) {
// Stack 관련
LinkedList<String> stack = new LinkedList<>();
stack.push("aaa");
stack.push("bbb");
System.out.println("Stack :" + stack);
String s = stack.pop();
System.out.println(s+"가 팝업됨");
System.out.println("Stack :" + stack);
// Queue 관련
LinkedList<String> queue = new LinkedList<>();
queue.offer("ccc");
queue.offer("ddd");
System.out.println("Queue :" + queue);
String ss = queue.poll();
System.out.println(ss + "가 반환 및 제거");
System.out.println("Queue :" + queue);
// 임의 위치의 데이터 조작
LinkedList<String> list = new LinkedList<String>();
list.add("aaa");
list.add("fff");
list.add(0,"ggg");
System.out.println("List : " + list);
String sss = list.remove(1);
System.out.println(sss+"가 제거됨");
String t = list.get(1);
System.out.println("인덱스 1 위치의 값은 : " + t);
System.out.println("List : " + list);
}
}
결과 :
컬렉션의 입문 시작 !!
'JAVA' 카테고리의 다른 글
[자바 공부] 컬렉션(5) Map (0) | 2023.09.15 |
---|---|
[자바 공부] 컬렉션(4) Stack & Queue (0) | 2023.09.15 |
[자바 공부] 컬렉션(2) Set (0) | 2023.09.12 |
[자바 공부] 컬렉션(1) Iterator (0) | 2023.09.12 |
[자바 공부] 제네릭 (0) | 2023.09.10 |