package ex_list;
import java.util.*;
public class Ex1 {
public static void main(String[] args) {
/*
* 컬렉션 프레임워크
* 2. List 계열
*
*/
List list = new ArrayList(); // ArrayList -> List 업캐스팅 가능
list.add("ONE");
list.add(2);
list.add(3.14);
System.out.println("list 객체가 비어있는가? " + list.isEmpty());
System.out.println("list 객체에 저장된 요소의 갯수는? " + list.size());
System.out.println("list 객체에 모든 요소 출력 : " + list); // toString() 생략
// list 객체의 중복 허용
System.out.println("중복 데이터 3.14 추가 가능한가? " + list.add(3.14));
System.out.println("list 객체가 비어있는가? " + list.isEmpty());
System.out.println("list 객체에 저장된 요소의 갯수는? " + list.size());
System.out.println("list 객체에 모든 요소 출력 : " + list); // toString() 생략
// add(int index, Object e) : 해당 인덱스에 데이터 삽입(끼워넣기)
list.add(2, 3); // 기존 2번 인덱스의 데이터를 밀어내고 정수 3을 2번 인덱스에 삽입
System.out.println("list 객체에 모든 요소 출력 : " + list); // toString() 생략
// Object get(int index) : 특정 인덱스의 요소 리턴
System.out.println("3번 인덱스 요소 : " + list.get(3));
// 만약, 존재하지 않는 인덱스 번호를 지정할 경우 -> 예외 발생!
// System.out.println("5번 인덱스 요소 : " + list.get(5)); // 오류 발생!
// List 객체의 모든 요소 꺼내기
// 1. 향상된 for문 사용(Set 계열 반복 방법과 동일함)
// for (Object o : list) {
// System.out.println(o);
// }
// 2. 일반 for문을 사용하여 List 객체의 get() 메서드로 인덱스를 통해 접근
// => 특정 인덱스 범위 반복이 가능하다는 장정이 있음(배열 접근 방법과 동일함)
// => 0번 인덱스부터 list 크기(갯수)까지 반복
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("================================================");
// Object remove(int index) : index에 해당하는 요소 제거(제거되는 요소 리턴됨)
// boolean remove(Object o) : o에 해당하는 객체 제거(제거될 경우 true 리턴됨)
// System.out.println("인덱스를 사용하여 정수 2(인덱스1) 삭제 : " + list.remove(1));
// System.out.println("정수 2를 지정하여 해당 요소 직접 삭제 : " + list.remove(2));
// => 정수 2를 지정하는 것이 아닌 2번 인덱스 지정으로 취급됨
// 따라서, 정수 2를 지정하여 삭제해야하는 경우 Object 타입으로 형변환 필요!
System.out.println("정수 2를 지정하여 해당 요소 직접 삭제 : " + list.remove((Object) 2));
System.out.println("list 객체에 모든 요소 출력 : " + list);
// Object set(int index, Object o) : 지정된 인덱스의 데이터를 교체(덮어쓰기)
// => 덮어쓰기 위해 제거되는 요소가 리턴됨(존재하지 않는 인덱스 지정 시 오류 발생!)
System.out.println("3번 인덱스 요소를 문자 '4'로 교체 : " + list.set(3, '4'));
System.out.println("list 객체에 모든 요소 출력 : " + list);
// List subList(int fromIndex, int toIndex) : 부분 리스트 추출
// => 시작인덱스(fromIndex)부터 끝인덱스(toIndex) -1 까지 추출됨
List subList = list.subList(1, 3);
System.out.println("1번 인덱스부터 3번 인덱스보다 작은 부분 리스트 추출 : " + subList);
// Object[] toArray() : List 객체의 모든 요소를 Object[] 배열로 리턴
Object[] arr = list.toArray();
for (Object o : arr) {
System.out.println(o);
}
list.add(3);
System.out.println("list 객체에 모든 요소 출력 : " + list);
// int indexOf(Object o) : 요소 o의 인덱스 리턴(첫 인덱스부터 탐색)
System.out.println("3라는 요소의 인덱스 번호 : " + list.indexOf(3));
// int lastIndexOf(Object o) : 요소 o의 인덱스 리턴(끝 인덱스부터 탐색)
System.out.println("3라는 요소의 인덱스 번호 : " + list.lastIndexOf(3));
// 존재하지 않는 요소를 지정할 경우 : 인덱스 번호 -1 리턴(데이터 없음)
System.out.println("10이라는 요소의 인덱스 번호 : " + list.indexOf(10));
// boolean contains(Object o) : 요소 o 존재 여부 리턴
System.out.println("실수 3.14가 존재하는가? " + list.contains(3.14));
System.out.println("실수 3.1이 존재하는가? " + list.contains(3.1));
// Arrays 클래스의 asList() 메서드를 호출하여 데이터를 연속적으로 전달하면
// 해당 데이터들을 List 타입 객체로 변환!
List arrayList = Arrays.asList(1, 2, 3, 4, 5, 6);
System.out.println(arrayList);
// 주의! 기본 데이터타입 배열 자체를 asList() 메서드 파라미터로 전달하면
// 정상적인 변환 불가능(asList() 메서드 파라미터로 클래스타입(Wrapper) 배열로 전달!)
// => 오류는 바라생하지 않으나 배열 데이터를 정상적으로 전달 불가능
// int[] iArr = {1, 2, 3, 4, 5, 6};
// List arrayList2 = Arrays.asList(iArr);
// System.out.println(arrayList2);
// => int 타입 대신 크르래스타입인 Integer 사용!
Integer[] iArr = {1, 2, 3, 4, 5, 6}; // 오토박싱
List arrayList2 = Arrays.asList(iArr);
System.out.println(arrayList2);
// String 타입은 클래스타입이므로 사용 가능!
String[] strArr = {"1", "2", "3"};
List arrayList3 = Arrays.asList(strArr);
System.out.println(arrayList3);
// ArrayList(list3) 객체 생성하고, 정수(3, 4, 1, 6, 5, 2) 추가
List list3 = Arrays.asList(3, 4, 1, 6, 5, 2);
System.out.println("정렬 전 : " + list3);
// Collections 클래스의 static 메서드 sort() 사용 시 List 객체 정렬 가능
// void sort(List list) : 해당 List 객체의 요소를 정렬(오름차순)
Collections.sort(list3);
System.out.println("정렬 후 : " + list3);
// Collections 클래스의 static 메서드 shuffle() 사용 시 List 객체 뒤섞기 가능
// void shuffle(List list) : 해당 List 객체의 요소를 랜덤하게 섞기
Collections.shuffle(list3);
System.out.println("셔플 후 : " + list3);
}
}