본문 바로가기

Java/Java SE, EE

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

닫기

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

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

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

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

java
닫기
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)을 사용하면 캐스팅 코드를 단순화합니다.

shell
닫기
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()를 사용합니다(타입마다 함수 상이).

java
닫기
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에서 임의의 매핑 알고리즘을 구현 할 수 있습니다.

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

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

shell
닫기
1 casting Integer to int 2 casting Integer to int 3 casting Integer to int

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

정리 및 복습

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