본문 바로가기
자바/자바 자료구조

자바 - List - ArrayList 뽀개기 - 2

by 신재은👩🏼‍💻 2024. 4. 14.

그럼 코테에서 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]은 뭘까?

 

이는 '패턴'이다.

  1. 유연성: ArrayList의 크기를 사전에 알지 못하는 상황에서도 이 메서드를 안전하게 사용할 수 있다. 제공된 배열이 리스트의 크기보다 작으면, ArrayList는 내부적으로 새로운 배열을 생성하고, 정확한 크기의 새 배열을 반환한다.
  2. 성능 최적화: Java API 설계자들은 toArray(new Object[0]) (이 경우에는 new Integer[0])이 new Object[list.size()]보다 성능이 좋거나 최소한 같다는 것을 발견했다. 이는 JVM의 최적화 덕분으로, 작은 배열을 인자로 사용했을 때 더 빠르게 동작할 수 있다.
  3. 간결성: 이 방식은 코드를 간단하게 유지하면서도 타입 안정성을 보장한다. 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는 이 정도면 다 본 것 같으니 문제를 풀어 보자.