Programming/Kotlin

[Kotlin] 함수형 프로그래밍이란? (순수함수)

MB Brad KWON 2023. 9. 5. 09:49

Side effect를 유발하는 코드

- 블럭 외부에서 변수를 변경하는 경우 (공유 자원)

- 메모리에 직접 접근하여 값을 변경하는 경우 (공유 자원)

- 객체에 필드를 설정하는 경우 (공유 자원)

- 예외를 던지거나 발생해서 프로그램을 중단 (실행 흐름)

- 콘솔 출력이나 사용자의 입력 대기 (실행 흐름)

- 파일을 입출력 (공유 자원)

- 화면 출력 (공유 자원 /. 실행 흐름)

 

위와 같은 Side effect를 줄이는 방법으로 프로그래밍을 하도록 한다. IO 수행, 오류 처리, 데이터 변경 등의 처리를 보다 제한적이고 안전한 방법으로 한다. 이를 위해 함수형 프로그래밍을 살펴본다.

 

함수형 프로그래밍을 하기 위해서는 순수 함수를 이해하는 것이 중요하다. 위의 Side effect를 유발하는 코드의 공통점은 외부의 영향을 받아서 결과값이 바뀐다는 것이다. 예를 들어서 블럭 외부의 변수를 변경할 경우, 이를 참조하고 있던 함수의 결과값이 바뀔 것이다. 이것은 순수하지 않다. 순수하려면 항상 특정 입력값에 대해서 동일한 결과값을 돌려줘야한다. 우리는 이를 사상(mapping)한다고 한다.

 

위의 그림과 같이 하나의 입력값에 대해서 동일한 결과값을 돌려줘야한다. 오른쪽의 그림처럼 '3'이라는 입력값에 대해서 다른 결과값을 돌려주는 경우는 외부의 변경에 의해서 내부의 비지니스로직이 영향을 받았을 확률이 높다. 이는 사상하지 않고, 또한 순수하지 않다. 순수 함수가 중요한 이유는 함수 단위의 모듈화가 가능하기 때문이다. 함수를 모듈화 하여 치환 가능하도록 하는 것이다. 각 함수를 모듈화 하여 치환 가능하도록 수현하면 함수의 결과에 대해서, 더 나아가 코드의 실행과 결과에 대한 추론이 쉬워진다. 이를 치환모델 (Substitution model)이라고 하며, 함수형 프로그래밍을 이해하고 사용하기 위한 첫 걸음이다. 

 

대략적인 함수형 프로그래밍의 개념에 대해서는 아래의 강의에서 얘기한 적이 있다. 이번에는 Kotlin이라는 언어를 통해서 함수형 프로그래밍에 대해 논해보려고 한다.