백준 13410 거꾸로 구구단 문제를 풀면서
문자열 배열을 리스트로 변환하고 해당 리스트의 원소들을 reverse 해야하는 일이 있었다.
문자열 배열을 리스트로 변환할 때 Stream API를 사용하여 아래의 코드로 작성하였다.
for (int i = 0; i < K; i++) {
// 문자열 배열을 리스트 형태로 변환
List<String> list = Arrays.stream(String.valueOf(N * (i + 1)).split("")).toList();
Collections.reverse(list);
max = Math.max(max, Integer.parseInt(temp[i]));
}
실행해본 결과 아래와 같은 `UnsupportedOperationException` 에러를 만났다.
이후 코드를 다시 살펴보니 IDE에서 다음과 같은 주의사항(?)창을 보여주었다.
자세히보니 toList로 반환하는 객체는 불변객체이기 때문에 이후에 수정, 삽입 자체가 불가능하다는 것이다.
그래서 리스트로 변환한 후에 `Collections.reverse(list)` 코드를 실행하면 `UnsupportedOperationException` 에러를 만나는 것이였다.
결국 IDE에서 안내하는 대로 .collect(Collectors.toList())로 작성하였고 그 결과 성공적으로 문제를 풀 수 있었다.
이런 문제 말고도 .toList()와 .collect(Collectors.toList()) 어떤 차이가 있는지 GPT에게 물어봤고 일부만 가져와서 나름 정리해봤다.
다음에도 이런일이 있다면 한번 더 생각해보자
1. .toList()
- 설명: Java 16부터 제공되는 간결한 메서드로, Stream의 요소를 변경 불가능한 List로 수집합니다.
- 특징:
- 반환 타입: 불변 리스트 (변경 불가능).
- 성능적으로 최적화되어 있으며, 내부적으로 이미 최적화된 구현체를 사용합니다.
- 반환된 리스트는 add, remove 같은 수정 작업을 지원하지 않습니다. 수정하려고 하면 UnsupportedOperationException이 발생합니다.
- 사용 예시:
java코드 복사List<Integer> list = Stream.of(1, 2, 3, 4).toList(); System.out.println(list); // [1, 2, 3, 4] // list.add(5); // UnsupportedOperationException 발생
2. .collect(Collectors.toList())
- 설명: Java 8부터 제공되며, Collectors 유틸리티 클래스의 toList 메서드를 사용해 스트림의 요소를 List로 수집합니다.
- 특징:
- 반환 타입: 변경 가능한 List (수정 가능).
- 내부적으로 ArrayList를 반환하는 구현이 기본으로 되어 있습니다.
- 스트림에서 데이터를 수집한 후, 리스트에 추가/삭제 작업이 가능합니다.
- 사용 예시:
java코드 복사List<Integer> list = Stream.of(1, 2, 3, 4).collect(Collectors.toList()); System.out.println(list); // [1, 2, 3, 4] list.add(5); // 수정 가능 System.out.println(list); // [1, 2, 3, 4, 5]