본문 바로가기
Today I Learned 2024. 6. 10.

(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와 헷갈려서 막상 써야할 때는 쓰지 못하는 습관을 없앨 수 있도록!
 
 
 

팀 과제와 함께 진행하고 있기 때문에 조금 어수선하게 정리했지만, 그래도 필요한 부분이라고 판단하여 책도 찾아보고 검색도 하면서 정리를 했다.