본문 바로가기
Jave & Kotlin

JAVA8 IntStream을 이용한 반복문

by devLog by Ronnie's 2021. 9. 15.

JAVA8 IntStream을 이용한 반복문

 

Stream이란 다양한 데이터를 표준화된 방법으로 다루기 위한 라이브러리이며 자바8부터 추가되었다.

여러 종류(LongStream, DoubleStream..)에 스트림이 있지만 오늘은 그중에 IntStream에 대해 정리한다.

 

IntStream을 이용하여 반복문을 처리하게 되면 코드가 줄고 가독성이 좋아진다. 그렇지만 모든 상황에서 IntStream을 사용하는 것보단 상황에 따라 적절한 반복문을 쓰는 것이 필요하다. 간단한 예제를 통해 차이를 알아본다.

 

for & IntStream

아래는 일반적인 1부터 10까지 차례대로 출력하는 for문이다.

public void loop()
{
        for (int i = 1 ; i <= 10 ; i++)
        {
            System.out.println(i);
        }
}

다음은 IntStream을 이용한 반복문이다. for문에 비해 단 한줄로 표현이 가능하다. 다만  range를 이용하게 되면 두번째 파라미터에 범위는 포함하지 않으므로 1~9까지만 출력되게된다. (system.out::println은 람다표현식이다.)

public void intStream_range() 
{
        IntStream.range(1, 10).forEach(System.out::println);
 }

두번째 파라미터값까지 포함시키려면 range를 rangeClosed로 변경하면 된다.

 

이렇게만 보면 반복문을 사용할때 IntStream을 사용하면 좋을거 같지만 IntStream같은 경우에는 한번 실행하면 중간에 break문을 만나도 빠져나가지 않고 끝까지 실행되게 된다. 말로는 잘 이해가 가지않아 예를 든다.

 

'1~10까지를 출력하는데 5일때는 출력을 하지 않는다' 라는 조건을 만족하는 반복문을 만들어본다.

for

 public void break()
 {
        for (int i = 1 ; i <= 10 ; i++) {
            if (i == 5) {
                break;
            }
            System.out.println(i);
        }
  }
  
  
  //결과
  1
  2
  3
  4

 IntStream

중간에 return을 한다고 빠져나가는 것이 아닌 5에 대해서만 출력을 하지않고 이후로는 실행이 된다.

public void intStreambreak() 
{
        IntStream.rangeClosed(1, 10)
        .forEach(i -> {
            if (i == 5) 
            {
                return;
            }
            System.out.println(i);
        });
    }
    
    
//결과
1
2
3
4
6
7
8
9
10

IntStream을 사용하여 결과를 똑같이 나타내고 싶다면 다음과 같이 하면 되지만 이것도 결국 IntStream 내부적으로는 10까지 실행된다는 점을 알아야한다. 

public void intStreambreak() {
        IntStream.rangeClosed(1, 10).forEach(i -> {
     
     //수정
     if (i >= 5) 
     {   
                return;
      }
            System.out.println(i);
        });
    }
    
//결과
1
2
3
4

 

다음과 같이 무조건 IntStream을 사용하는 것보단 차이를 알고 상황에 맞게 적절한 반복문을 사용하는 것이 좋다.

 

댓글