본문으로 바로가기
반응형

Java에서는 배열을 다루는 다양한 방법이 있으며, 그중에서도 스트림(Stream)을 사용하면 배열 요소들을 간편하게 변환하거나 필터링할 수 있습니다. 이번 글에서는 Arrays.stream(), map(), toArray() 등의 메서드를 활용하여 배열을 처리하는 방법을 설명하고, 이를 기반으로 간단한 예제를 만들어보겠습니다.

1. Arrays.stream() 메서드란?

Arrays.stream()은 Java 8부터 추가된 스트림(Stream) API의 일부로, 배열을 스트림 형태로 변환하여 다양한 처리를 할 수 있게 해줍니다. 스트림은 배열이나 컬렉션의 요소를 함수형 프로그래밍 방식으로 처리할 수 있도록 도와줍니다.

사용 예시:

int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(System.out::println);

위 코드에서 Arrays.stream(arr)을 통해 배열 arr의 각 요소를 스트림으로 변환하고, forEach() 메서드를 사용하여 각 요소를 출력합니다.

2. map() 메서드란?

스트림의 map() 메서드는 각 요소를 주어진 함수에 따라 변환하여 새로운 스트림을 생성하는 데 사용됩니다. 예를 들어, 배열의 각 요소에 특정 값을 더하거나 곱하는 연산을 손쉽게 적용할 수 있습니다.

기본 문법:

Stream<T> map(Function<? super T, ? extends R> mapper)

이 함수는 입력값 T를 다른 타입 R으로 변환하는 작업을 합니다. 배열의 각 요소를 변환할 때 주로 사용됩니다.

사용 예시:

int[] arr = {1, 2, 3};
int k = 2;
int[] result = Arrays.stream(arr)
    .map(operand -> operand * k)  // 각 요소에 k를 곱한다
    .toArray();

위 코드에서는 배열 arr의 각 요소에 k(여기서는 2)를 곱한 값을 새로운 배열로 변환한 후, toArray() 메서드를 사용해 배열로 다시 변환합니다.

3. toArray() 메서드란?

스트림 연산의 결과를 다시 배열로 변환하고 싶을 때는 toArray() 메서드를 사용합니다. 이 메서드는 스트림의 요소를 배열로 변환해 반환합니다.

기본 문법:

T[] toArray()

toArray()는 스트림에서 처리한 결과를 배열로 바꿔줍니다. 스트림으로 작업한 데이터를 다시 배열로 반환할 때 매우 유용합니다.

사용 예시:

int[] arr = {1, 2, 3};
int[] result = Arrays.stream(arr)
    .map(operand -> operand + 1)  // 각 요소에 1을 더한다
    .toArray();                   // 결과를 배열로 변환

4. 실전 예제: k 값에 따른 배열 요소 변환

이번에는 위에서 설명한 Arrays.stream(), map(), toArray()를 모두 활용한 예제를 살펴보겠습니다. 배열의 각 요소를 주어진 값 k에 따라 변환하는 함수를 구현해보겠습니다.

문제 설명:

  • 배열의 각 요소를 k의 값에 따라 변환합니다.
    • k가 짝수일 때는 각 요소에 k를 더하고,
    • k가 홀수일 때는 각 요소에 k를 곱합니다.

코드 구현:

public int[] solution(int[] arr, int k) {
    return Arrays.stream(arr)
        .map(operand -> k % 2 == 0 ? operand + k : operand * k)
        .toArray();
}

코드 설명:

  1. Arrays.stream(arr)을 통해 배열을 스트림으로 변환합니다.
  2. map()을 이용해 배열의 각 요소 operand에 대해 변환 작업을 수행합니다.
    • k가 짝수일 경우 (k % 2 == 0)에는 각 요소에 k를 더하고,
    • k가 홀수일 경우에는 각 요소에 k를 곱합니다.
  3. 변환된 결과를 toArray()로 배열로 다시 반환합니다.

실행 예시:

  • 입력: arr = [1, 2, 3], k = 4
    • k가 짝수이므로 배열의 각 요소에 k를 더하여 [5, 6, 7]이 됩니다.
  • 입력: arr = [1, 2, 3], k = 3
    • k가 홀수이므로 배열의 각 요소에 k를 곱하여 [3, 6, 9]이 됩니다.

 

다양한 연산자

1. 중간 연산 (Intermediate Operations)

중간 연산은 스트림에서 변환 작업을 수행하며, 여러 개의 중간 연산을 연결해서 사용할 수 있습니다. 이 연산들은 스트림을 반환하며, 종료 연산이 호출될 때까지 실제로 수행되지 않습니다.

1.1. filter()

  • 조건에 맞는 요소들만 걸러냅니다.
int[] arr = {1, 2, 3, 4, 5};
int[] result = Arrays.stream(arr)
    .filter(n -> n % 2 == 0)  // 짝수만 걸러냄
    .toArray();

1.2. distinct()

  • 중복된 요소를 제거합니다.
int[] arr = {1, 2, 2, 3, 3, 3, 4};
int[] result = Arrays.stream(arr)
    .distinct()  // 중복 제거
    .toArray();

1.3. sorted()

  • 스트림의 요소를 정렬합니다.
int[] arr = {5, 3, 1, 4, 2};
int[] result = Arrays.stream(arr)
    .sorted()  // 오름차순 정렬
    .toArray();

1.4. limit()

  • 스트림의 요소 중 상위 몇 개만 선택합니다.
int[] arr = {1, 2, 3, 4, 5};
int[] result = Arrays.stream(arr)
    .limit(3)  // 처음 3개 요소만 선택
    .toArray();

1.5. skip()

  • 스트림의 앞부분에서 지정한 개수만큼의 요소를 건너뜁니다.
int[] arr = {1, 2, 3, 4, 5};
int[] result = Arrays.stream(arr)
    .skip(2)  // 처음 2개 요소를 건너뜀
    .toArray();

1.6. peek()

  • 스트림의 각 요소에 대해 추가 작업을 수행합니다. 주로 디버깅이나 로깅에 사용됩니다.
Arrays.stream(arr)
    .peek(n -> System.out.println(n))  // 요소 출력 (연산 사이에 사용)
    .toArray();

2. 종료 연산 (Terminal Operations)

종료 연산은 스트림의 처리를 끝내고 결과를 반환하는 연산입니다. 종료 연산은 스트림을 소비하여 실행됩니다.

2.1. forEach()

  • 각 요소에 대해 주어진 작업을 수행합니다.
int[] arr = {1, 2, 3};
Arrays.stream(arr).forEach(System.out::println);  // 각 요소 출력

2.2. reduce()

  • 스트림의 모든 요소를 하나의 결과로 합칩니다. 축약(reduce) 작업에 주로 사용됩니다.
int[] arr = {1, 2, 3, 4, 5};
int sum = Arrays.stream(arr)
    .reduce(0, Integer::sum);  // 모든 요소의 합 계산

2.3. collect()

  • 스트림의 요소를 List, Set, Map과 같은 컬렉션으로 변환합니다.
List<Integer> list = Arrays.stream(arr)
    .boxed()  // 기본형 int를 Integer로 변환
    .collect(Collectors.toList());  // List로 변환

2.4. count()

  • 스트림의 요소 개수를 반환합니다.
long count = Arrays.stream(arr).count();  // 요소의 개수 반환

2.5. anyMatch(), allMatch(), noneMatch()

  • 스트림의 요소 중 조건에 맞는 요소가 있는지 확인합니다.
boolean anyEven = Arrays.stream(arr).anyMatch(n -> n % 2 == 0);  // 짝수가 있는지 확인

2.6. findFirst(), findAny()

  • 스트림에서 첫 번째 요소 또는 아무 요소나 반환합니다.
OptionalInt first = Arrays.stream(arr).findFirst();  // 첫 번째 요소

요약

  • 중간 연산: map(), filter(), distinct(), sorted(), limit(), skip(), peek() 등이 있으며, 여러 중간 연산을 연결하여 사용할 수 있습니다.
  • 종료 연산: forEach(), reduce(), collect(), count(), anyMatch(), findFirst() 등이 있으며, 스트림을 끝내고 결과를 반환합니다.

 

결론

이번 글에서는 Java의 스트림 API에서 자주 사용되는 Arrays.stream(), map(), toArray() 메서드를 활용하여 배열을 처리하는 방법을 살펴보았습니다. 이 메서드들을 조합하면 배열의 요소에 다양한 변환을 적용할 수 있어 매우 유용합니다. 이를 통해 코드를 더욱 간결하고 직관적으로 작성할 수 있으며, 함수형 프로그래밍의 장점을 충분히 활용할 수 있습니다.

여러분도 배열을 처리할 때 스트림을 한번 사용해보세요!

 

 

반응형