Java 공부

[Java] Lazy Evaluation

piedra_de_flor 2023. 2. 12. 20:56

Lazy Evaluation이란?

Lazy Evaluation은 직역하면 "게으른 연산"이다.

java에서의 Lazy Evaluationd은 불필요한 연산들을 피하기위해 연산을 지연시키는 것을 말한다.

 

불필요한 연산을 피한다라는 것의 이해를 돕기 위해 예시를 들어보자면,

public class Lazy {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            list.add(i);
        }
        System.out.println(
                list.stream()
                        .filter(i -> i<6)
                        .filter(i -> i%2==0)
                        .map(i -> i*10)
                        .collect(Collectors.toList())
        );
    }
}

1~10까지의 정수를 담고 있는 리스트가 하나 있을때 이 리스트의 요소들 중

6보다 작으며, 2로 나누어 지는 수에 10을 곱하여 출력해주는 코드이다.

 

함수형 프로그래밍또는 Lazy Evaluation을 접해보지 못한 사람들은 이 코드의 처리과정이

  1. 전체 요소들 중 6보다 작은 수를 구한다.
  2. 1번에서 구한 요소들중 2로 나누어지는 수를 구한다.
  3. 그 수에 10을 곱한다.

이처럼 진행될 것이라 생각할 수 있지만, 아니다.

 


 

이 코드의 진행방식은 각 요소들에 대해 아래와 같은 방식으로 진행된다.

  1. 6보다 작은지 검사한다 ( 6보다 클 경우 2번 3번 과정을 무시하고 다음 요소 검사 진행)
  2. 2로 나누어 지는지 검사한다. ( 2로 나누어지지 않을 경우 3번 과정을 무시하고 다음 요소 검사 진행)
  3. 10을 곱하여 출력한다.

이처럼 불필요한 연산과정을 하지않고 각 요소에 대해 검사가 진행된다.

 

물론 처음의 처리과정이나 두번째의 처리과정의 출력값은 동일하다. 하지만 불필요한 연산을 하지 않은 두번째 처리과정이 성능면에서 우월하다.

 

첫번째 처리과정을 우리는 Eager Evaluation 이라 부르고,

두번째 처리과정을 우리는 Lazy Evaluation 이라 부른다.

 


 

항상 Lazy Evaluation이 처리 속도가 빠른것은 아니기에 테스트가 필요하지만 대부분의 경우에서 Lazy Evaluation이 더욱 좋은 성능을 보인다.

 

이러한 Lazy Evaluation은 Java8 이후의 Lambda 방식을 이용하여 함수형 프로그래밍으로 java에서도 구현을 할 수 있다.

 

 

 

※ 하지만 Lazy Evaluation이 항상 좋은 것 만은 아니다. 앞서 말했듯 항상 Lazy Evaluation이 성능이 좋은 것 만은 아니고 성능이 대충 비슷할 때도 있다. 이러할 경우에는 굳이 코드가 복잡해져 유지보수가 어려워 질 가능성이 있기에 이에 유의해야한다.