본문 바로가기

Java/Java SE, EE

배열 int[]와 Integer[]간에 상호 캐스팅하기

이 문서의 내용

    더보기

    Integer와 Int 타입 간에는 캐스팅이 가능하지만, Integer[]int[] 간에는 단순히 대입 연산자나 캐스팅 타입을 명시하더라도 변환되지 않습니다.

    예를 들어 다음 코드는 Required type 'Integer[]' but provided 'int[]' 오류가 발생합니다.

    int[] a = { 1, 2, 3 };
    Integer[] b = a;

    배열 자료구조의 Primitive 타입Wrapper 클래스간의 변환은 배열의 원소를 차례대로 읽어 복사하는 방법이 있습니다.

    int[] a = { 1, 2, 3 };
    Integer[] b = new Integer[a.length];
    for (int i = 0; i < a.length; ++i)
    	b[i] = a[i];

    단순히 타입을 캐스팅하기 위해서 배열의 크기를 할당하고, 반복문(for) 구문을 작성하고, 원소를 하나 하나 복사하는 과정은 상당히 번거로운 일입니다.

    int[]를 Integer[]로 변환

    자바 8부터 지원하는 람다(Lambda)와 스트림(Stream)을 사용하면 캐스팅 코드를 단순화합니다.

    int[] a = { 1, 2, 3 };
    Integer[] b = Arrays.stream(a).boxed().toArray(Integer[]::new);
    코드 비고
    Line 2 Arrays.stream(a) 배열인 a변수를 스트림으로 구성합니다.
    boxed() 스트림의 원소를 박싱(Boxing)합니다.
    박싱을 하면 Primitive 타입은 Wrapper 클래스로 캐스팅됩니다.
    toArray(Integer[]::new) 스트림을 배열로 구성합니다.
    함수의 호출 인자는 배열을 구성하는 타입입니다.

    Integer[]를 int[]로 변환

    마찬가지로 람다와 스트림을 사용합니다. 스트림에서 Wrapper 클래스를 Primitive 타입으로 변환할 때는 mapToInt()를 사용합니다(타입마다 함수 상이).

    Integer[] b = { 1, 2, 3 };
    int[] a = Arrays.stream(b).mapToInt(Integer::intValue).toArray();
    코드 비고
    Line 2 Arrays.stream(b) 배열인 b변수를 스트림으로 구성합니다.
    mapToInt(Integer::intValue) 스트림의 원소 Integer 타입을 int 타입로 매핑합니다.
    이 과정은 일종의 언박싱(Unboxing)입니다.
    toArray() 스트림을 배열로 구성합니다.
    더보기

    Integer::intValue() java.lang.Integer 클래스에서 정의하는 메소드입니다. 람다를 사용하면 mapToInt에서 임의의 매핑 알고리즘을 구현 할 수 있습니다.

    Integer[] b = { 1, 2, 3 };
    int[] a = Arrays.stream(b).mapToInt(i -> {
    	System.out.println(i +" casting Integer to int");
    	return i;
    }).toArray();

    위 코드를 실행하면 다음과 같이 표시됩니다.

    1 casting Integer to int
    2 casting Integer to int
    3 casting Integer to int

    실행 예시에서처럼 스트림을 사용하더라도 원소를 하나 하나 읽어서 복사하는 과정을 거치게됩니다. 다만 캐스팅을 위한 코드를 직접 작성하는 번거로움은 덜 수 있습니다.

    정리 및 복습

    • Primitive 타입Wrapper 클래스가 자료구조(배열)에 포함된 경우 스트림(Stream)과 람다(Lambda)를 사용하면 쉽게 캐스팅 할 수 있습니다.
    • 스트림 및 람다는 자바 8부터 사용 할 수 있습니다.
    • int[]를 Integer[]로 변환하려면 스트림을 구성하고 박싱합니다.
    Arrays.stream(<int[] 변수>).boxed().toArray(Integer[]::new);
    • Integer[]를 int[]로 변환하려면 스트림을 구성하고 언박싱합니다.
    Arrays.stream(<Integer[] 변수>).mapToInt(Integer::intValue).toArray();