이 문서의 내용
더보기
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);
코드 | 비고 | |
배열인 |
||
스트림의 원소를 박싱을 하면 |
||
함수의 호출 인자는 |
Integer[]를 int[]로 변환
마찬가지로 람다와 스트림을 사용합니다. 스트림에서 Wrapper 클래스를 Primitive 타입으로 변환할 때는 mapToInt()를 사용합니다(타입마다 함수 상이).
Integer[] b = { 1, 2, 3 };
int[] a = Arrays.stream(b).mapToInt(Integer::intValue).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();
'Java > Java SE, EE' 카테고리의 다른 글
인터페이스를 구현하는 *Impl, 관습적인 추상화에 대한 이해 (0) | 2024.02.08 |
---|---|
Windows에서 OpenJDK 17 버전 설치 (0) | 2023.12.27 |
배열에서 중복되는 Element 제거하기(Set과 Stream) (0) | 2023.11.30 |
Azure AD와 MSAL4J를 사용한 SSO(Single Sign-On) 로그인 인증 구현 (0) | 2023.11.28 |
데이터 표현을 위한 Record 클래스 (0) | 2023.11.27 |