그럼 코테에서 ArrayList는 어떻게 쓸 수 있을까?
1. 초기화 및 선언
ArrayList를 선언하고 초기화하는 기본적인 방법들입니다:
import java.util.ArrayList;
// 기본적인 선언
ArrayList<Integer> list = new ArrayList<>();
// 초기 용량 지정
ArrayList<Integer> listWithCapacity = new ArrayList<>(100);
// 다른 컬렉션으로부터 초기화
ArrayList<Integer> listFromOther = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
주의:
Arrays.asList(1, 2, 3, 4, 5) <- 이거 ArrayList 아니다. 배열인데 List가 가진 메서드 쓰기 위해 이렇게 변환한다.
그리고 여기에서 배열은 int[] 이런 게 아니고 Integer[]다.
이 부분이 조금 tricky한데 이건 직접 해 보면 안다. ㅠㅠ
2. 요소 추가하기
ArrayList에 요소를 추가하는 방법입니다:
ArrayList<Integer> list = new ArrayList<>();
list.add(10); // 맨 끝에 요소 추가
list.add(0, 20); // 특정 인덱스에 요소 추가
3. 요소 접근 및 수정
ArrayList에서 요소를 접근하거나 수정하는 방법:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
// 요소 접근
int value = list.get(2); // index 2의 요소 접근, value = 30
// 요소 수정
list.set(2, 35); // index 2의 요소를 35로 수정
4. 요소 삭제
ArrayList에서 요소를 삭제하는 방법:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
// 인덱스로 삭제
int removed = list.remove(2); // index 2의 요소를 삭제하고 삭제된 요소 반환
// 객체로 삭제
boolean isRemoved = list.remove(Integer.valueOf(20)); // 20이라는 객체를 찾아 삭제, 성공 시 true 반환
5. 리스트 순회
ArrayList를 순회하는 방법들:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
// for-loop 사용
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// Enhanced for-loop 사용
for (int num : list) {
System.out.println(num);
}
// Iterator 사용
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// Java 8 이상에서의 Stream API 사용
list.stream().forEach(System.out::println);
* iterator는 왜 쓸까?
1. 순회 중에도 삭제 가능!
2. hasNext(뒤에 또 있냐?)와 next(next~) 메서드를 사용해 순회 흐름을 명시적으로 제어할 수 있다.
3. 모든 콜렉션 타입에서 다 쓸 수 있다.
4. 여러 iterator를 동시에 사용해 콜렉션의 다른 부분을 병렬 처리 할 수 있다.
5. Iterator 인터페이스를 기반으로 동작하는 일부 API에 대응해서 사용할 수 있다.
6. 리스트 정렬
ArrayList를 정렬하는 방법:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(40, 10, 30, 20));
// 오름차순 정렬
Collections.sort(list);
// 내림차순 정렬
Collections.sort(list, Collections.reverseOrder());
7. ArrayList의 변환 및 조작
ArrayList를 배열 또는 다른 컬렉션 타입으로 변환하거나 조작하는 방법:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
// ArrayList를 배열로 변환
Integer[] array = list.toArray(new Integer[0]);
// ArrayList를 다른 컬렉션 타입으로 변환
HashSet<Integer> set = new HashSet<>(list);
그런데 list.toArray까지는 괜찮은데 new Integer[0]은 뭘까?
이는 '패턴'이다.
- 유연성: ArrayList의 크기를 사전에 알지 못하는 상황에서도 이 메서드를 안전하게 사용할 수 있다. 제공된 배열이 리스트의 크기보다 작으면, ArrayList는 내부적으로 새로운 배열을 생성하고, 정확한 크기의 새 배열을 반환한다.
- 성능 최적화: Java API 설계자들은 toArray(new Object[0]) (이 경우에는 new Integer[0])이 new Object[list.size()]보다 성능이 좋거나 최소한 같다는 것을 발견했다. 이는 JVM의 최적화 덕분으로, 작은 배열을 인자로 사용했을 때 더 빠르게 동작할 수 있다.
- 간결성: 이 방식은 코드를 간단하게 유지하면서도 타입 안정성을 보장한다. new Integer[0]은 명시적으로 Integer 타입의 배열임을 보여주며, 반환되는 배열도 Integer[] 타입이 된다.
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
Integer[] array = list.toArray(new Integer[0]);
이 코드는 list의 모든 요소를 포함하는 새로운 Integer 배열을 반환한다. 배열의 크기는 list.size()와 동일하게 조정된다.
이런 식으로 toArray(new Integer[0])는 Java에서 흔히 사용되는 테크닉으로, 간결하고 효율적인 코드 작성을 도와준다고 한다.
자, 그러면 ArrayList는 이 정도면 다 본 것 같으니 문제를 풀어 보자.
'자바 > 자바 자료구조' 카테고리의 다른 글
자바 - List - LinkedList 뽀개기 (0) | 2024.04.26 |
---|---|
[묘공단] 스택 이야기 (0) | 2024.04.22 |
자바 - List - ArrayList 뽀개기 - 1 (0) | 2024.04.14 |
자바에서 사용할 수 있는 자료구조의 종류 (0) | 2024.04.14 |
자바 자료구조 학습 중 궁금한 점 (0) | 2024.04.14 |