함수형 프로그래밍의 작은 깨달음

함수형 프로그래밍의 작은 깨달음

모나드 ? 🤔


함수형 프로그래밍


최근 함수형 프로그래밍에 대한 관심이 높아지고 있다.

나는 기본적으로 객체지향으로 코딩을 하고 있지만, 이런저런 개발 방법론을 접할 때마다 그들의 철학에 매료된다.

객체지향이 아닌 다른 방식들을 객체지향에 접목하면 더 좋은 코드를 작성할 수 있을 것만 같기 때문이다.


단박에 느껴지는 함수형 프로그래밍의 메리트는 부수효과가 없다는 것이다.

이로 인해 에러가 줄어들고, 무엇보다 병렬성을 크게 끌어올릴 수 있다.

아무튼, 함수형 프로그래밍 서적을 보는데 함수형 프로그래밍의 함수에 대한 정의에서 한 가지 의문이 들었었다.

함수형 프로그래밍 속 함수의 정의는 다음과 같다.


  • 수학에서 말하는 함수와 같다
  • 함수는 0개 이상의 입력값을 가지며, 1개 이상의 반환값을 가져야 한다
  • 부수효과(Side-Effect)가 없어야 한다. 즉, 같은 입력이 들어오면 항상 같은 값이 반환되어야 한다


여기서 의문이 들었는데, 그렇다면 함수 내부에서 예외(Exception)가 발생한다면 어떻게 해야하는가? 라는 의문이었다.

예외가 발생한다면 일반적인 자바 프로그래밍에서는 예외를 캐치하여 처리하거나 던질것이다.

하지만 이렇게 하면 함수의 정의에 벗어난다.

예외를 던지면 값을 반환하지 못하는 것이며, 예외 처리를 하여 예외를 던지지 않고 임의의 값을 반환한다면? 이 역시도 애매하다.

같은 입력에 대해 언제나 같은 값이 출력된다고 보장하기 힘들 것 같았다.


예를 들어, 나누기를 하는 함수가 있다고 가정하자.


public double divide(double x, double y) {
    return x / y; 
}


근데 x가 임의의 실수이고, y가 0이라면 어떻게 해야할까?

무한루프가 발생할 것이므로, 일반적인 자바 스타일의 코딩을 한다면 적절한 예외처리를 해주어야만 한다.


이러한 경우를 함수형 프로그래밍에서는 어떻게 해결하는지 궁금해져 질문을 했더니, 모나드요 ! 라는 답변이 돌아왔다.

결론적으로는 다음과 같다.


public Optional<Double> divide(double x, double y) {
    if(y == 0) {
        return Optional.empty();
    }
    return Optional.of(x / y); 
}


반환값 자체를 반환값이 있을수도 있고, 없을수도 있다는 범주로 묶는 것이다.

이러면 예외상황에도 항상 같은 값(Optional)을 반환할 수 있게 된다.

이러한 개념을 함수형 프로그래밍에서는 모나드라고 부르는 것 같은데, 이게 함수형 프로그래밍에서 아주 어려운 개념인 듯 하다.

그렇다면 Optional도 일종의 모나드인가? 아직 잘 모르겠다.

아무튼 신기한 해결방식에 흥미가 생겼고, 모나드가 무엇인지 이해하고 싶다는 생각이 들게되는 계기가 되었다.



© 2022. All rights reserved.