Today I Learned
(24.06.10)[9주차] 원시타입 Array -> List 변환
Array 배열과 List를 변환해줘야하는 코드 테스트 시험이 있을 때 매우 유용한 부분이라고 생각되어 CODE KATA의 문제 중에 짠 코드를 사용해서 분석하고 정리를 했다.
원시타입 Array의 List 변환
public class Main {
public static void main(String[] args) {
int[] score = {1, 2, 3, 1, 2, 3, 1};
List<Integer> scoreList = new ArrayList<>(Arrays.asList(score)); // 에러
...
이슈
- 원시 타입의 Array를 asList 메스드를 활용 불가
- 가장 기초적인 것이지만, 빨리 코드를 작성하고, 로직을 구현하고자 할때, 자연스럽게 Integer <-> int 의 자동 박싱 언박싱을 구분하지 않는 것
원인
- Integer와 int가 연산 등에 있어서 서로 호환이 가능하도록 변환이 가능하지만, asList 자체로 한번에 변환할 수는 없음
해결
- 즉, int 타입 Array값들을 하나씩 Integer로 바꿔서 List의 값으로 넣어주는 로직을 활용해서 List로 변환을 해야함
- List<int> 의 자료형태는 존재할 수 없음
for문 사용
public class Main {
public static void main(String[] args) {
int[] score = {1, 2, 3, 1, 2, 3, 1};
List<Integer> scoreList = new ArrayList<>();
for(int index : score) {
scoreList.add(index);
}
...
- List 컬렉션 타입에서 add 메스드를 통해서 원시타입 자체를 넣을 수 있기 때문에 향상된 for문을 사용해서 리스트 하나씩 넣는 방법
- 가장 많이 사용하는 방법
Stream 사용
- int[] intArray = IntStream.toArray(); 는 가능하지만, Stream<Integer> stream 일 경우, int[] intArray = stream.toArray(size->new int[size]); 의 Stream -> Array 인 상황과 반대되는 상황
- 하지만, 단순하게 Stream을 진행해서는 X
- boxing을 진행을 해야함
List<Integer> scoreList = IntStream.of(score).boxed().collect(Collectors.toList());
- boxed() 를 통해서 원시값의 스트림을 래퍼 클래스 스트림으로 변환하는 메서드 활용
- 따라서 위의 boxed를 통해 통해 IntStream이 Stream<Integer>로 변환
- 박싱을 해야하는 부분을 빼먹고 바로 Collector를 사용할 수 있기 때문에 이 부분을 주의
- 그 이후, collector 사용해서 List로 정상적으로 진행
- stream() 메서드는 Wrapper클래스를 포함한 참조형 non-primitive 데이터 타입을 Stream<> 형태로 만들어주는 것이기 때문에 (int 타입 배열).stream() 애초에 성립이 되지 않음 -> IntStream, LongStream, DoubleStream 을 사용해야.
참고 : String 타입의 Array를 List로 만들때
- String 은 참조형 타입 즉, List<String>이 가능하기 때문에, 그냥 Arrays클래스의 asList 매서들를 통해 Arrays.asList(stringArray) 로 List로 변환을 시킬 수 있음!
Comment
- 학습을 하기 전에 IntStream.of() 을 사용해서 그냥 스트림으로 바꾸는 부분만 알고 쓰고 있었는데, 그 이후 List로 변환하거나 Stream 최종연산에 관련해서는 Stream<> 처럼 만들어야해서 boxed() 박싱을 해줘야한다는 사실을 한번 더 인지할 수 있었음
- 자동으로 박싱/언박싱 해주는 Java와 헷갈려서 막상 써야할 때는 쓰지 못하는 습관을 없앨 수 있도록!
팀 과제와 함께 진행하고 있기 때문에 조금 어수선하게 정리했지만, 그래도 필요한 부분이라고 판단하여 책도 찾아보고 검색도 하면서 정리를 했다.
'Today I Learned' 카테고리의 다른 글
(24.06.12)[9주차] Spring 심화 강의 01 (0) | 2024.06.12 |
---|---|
(24.06.11)[9주차] HashMap + 사용자 정의 Comparator 사용하기 (1) | 2024.06.11 |
(24.06.07)[8주차] Spring Data의 Paging & Sort 정리 (0) | 2024.06.07 |
(24.06.05)[8주차] Response용 DTO 활용 (0) | 2024.06.05 |
(24.06.04)[8주차] Java에서의 LocalDate 포맷으로 파싱 (0) | 2024.06.04 |