본문 바로가기
질문 연습

왜 int, String 배열은 스트림(Stream)으로 쉽게 변환되는데 char 배열은 안 되는 것일까?! (자바 캐릭터 배열 스트림으로 변환하기)

by Renechoi 2023. 6. 24.

 

 

Java.util 패키지의 Arrays 클래스를 이용하면 간단히 Stream으로 변경할 수 있다. 

 

 

위에서와 int 외에도 다양한 숫자형 strem 변환을 지원한다. 

 

public class Example {
   public static void main(String[] args) {
      toStream(new int[]{1, 2, 3, 4, 5});
   }

   private static void toStream(int[] array) {
      IntStream stream = Arrays.stream(array);
   }
}

 

 

String의 경우 제네릭 T 타입 배열로 인자값이 들어가는 케이스로 변환된다. 

 

private static void toStream(String[] array){
   Stream<String> stream = Arrays.stream(array);
}

 

 

 

그런데 캐릭터 배열 char[] array 를 변환하려고 하면 다음과 같은 컴파일 에러가 발생한다. 

 

 

 

왜 이러한 에러가 발생하는 것일까? 

 

그 이유는 앞서 언급한 제네릭 타입과 관련이 있다. 

 

char은 원시 타입으로 제네릭 호환이 되지 않는다. 제네릭은 객체형을 타입 파라미터로 받을 수 있으므로 원시타입은 전달되지 않는다. String은 원시타입처럼 사용되지만 실제로 객체 타입이기 때문에 호환이 되었던 것이다. 

 

그렇다면 char의 래퍼 클래스로서 Character로 만들어진 배열을 전달하면 어떨까? 

 

private static void toStream(Character[] array){
   Stream<Character> stream = Arrays.stream(array);
}

 

 

당연히 무리 없이 생성되는 것을 볼 수 있다. 

 

그런데 원시타입으로 구성된 char[]를 활용해야 될 때가 있다. 그럴때 char[]을 스트림으로 변환해서 사용할 필요가 있으면 어떻게 해야할까?

 

그럴 때는 Instream을 사용하면 된다. 

 

다음과 같이 할 수 있다. 

 

1) 먼저 IntStream을 연다. 

2) IntStream의 각 요소, 즉 숫자를 char와 매핑한다. 

3) 이후에는 이제 똑같이 스트림의 기능을 사용할 수 있다. 즉, Stream<Character>가 된다. 

 

 

 

진행 과정 

 

1) 

IntStream intStream = IntStream.range(0, array.length);

 

 

2) 

 

Stream<Character> characterStream = intStream.mapToObj(i -> array[i]);

 

 

 

 

3) 

characterStream.filter(// todo 원하는 처리...)

 

 

 

이를 활용해 캐릭터 배열에서 중복 값을 찾는 예시 코드를 다음과 같이 작성할 수 있다. 

return IntStream.range(0, wheel.length).mapToObj(i-> wheel[i]).anyMatch(alphabet -> alphabet == current);

 

 

 

 

반응형