함수형 프로그래밍이란

smlee·2023년 10월 23일
0
post-thumbnail

함수형 프로그래밍이란

함수형 프로그래밍(Functional Programming)이란 순수 함수로만 사용하여 이루어진 프로그램을 뜻한다. 그렇다면 순수 함수란 무엇일까? 순수 함수란 부수 효과(side effect)가 없는 함수를 뜻한다. 따라서 똑같은 입력값에 대해 항상 같은 결과를 리턴해주며, 그에 따라 표현식 대신 결과값으로 대체해도 프로그램의 의미가 바뀌지 않는 것을 뜻한다. 이는 참조 투명성(Referential-Transparency, RT)로 표현되기도 한다.

순수 함수를 사용함으로써 모듈성을 증가시켜 그에 따른 긍정적인 효과를 가져갈 수 있다. 순수 함수를 사용하면 함수를 재사용하기 용이하고, 테스트하기 편하다. 또한, 병렬화(parallelize)하기 좋으며, 일반화(generalize)하기도 좋다.

부수 효과(side-effect)

그렇다면 여기서 또다른 의문점이 생긴다. 부수 효과란 무엇일까? 부수 효과는 결과를 리턴하는 것 이외의 다른 기능을 뜻한다. 대표적인 부수 효과에는 다음과 같은 것들이 있다.
1. 변수의 값을 수정하기
2. 자료 구조를 수정하기
3. error나 exception을 다루는 행위
4. console에 user input을 입력 받거나 출력하는 행위
5. 파일을 읽어들이거나 쓰는 행위
6. 객체 내에 필드를 할당하는 행위

함수형 프로그래밍은 순수 함수, 즉 "부수 효과가 없는 함수로 이루어진 프로그램"이다. 따라서 우리는 함수형 프로그래밍을 위해 부수 효과를 없애는 방향으로 프로그램을 설계해야 한다.

참조 투명성(Referential-Transparency, RT)

모든 프로그램에 대해 표현식(expression) e에 대하여 참조 투명성이 존재한다면 모두 그 표현식 e에 대한 결과로 치환하여도 프로그램에 아무 영향이 없다면 그 표현식 e는 참조에 투명하다(referential transparent). 만약 어떤 함수 f(x)가 모든 입력값 x에 대해 참조에 투명하면 그 함수 f는 순수하다.

+를 생각해보자. +는 2개의 실수를 인자로 받는다. 그리고 그 인자들의 덧셈 값을 리턴한다. 즉, 2 + 3이 입력되면 언제, 어디서 해당 인자들을 입력 받아도 같은 값을 리턴 받으며, 결과값은 5로 치환하여도 그 의미는 명확하게 전달 된다.

String을 뒤집어 주는 reverse 역시 순수하다. 왜냐하면 어떠한 문자열이 입력이 되든, reverse는 항상 해당 입력값을 뒤집은 문자열을 리턴하기 때문이다.

그렇다면 순수하지 않은 함수는 어떤 것이 있을까? StringBuilderappend가 있다. 만약 다음과 같은 코드가 있다고 생각해보자.

val x = new StringBuilder("Hello ")
val y = x.append("world").toString
val z = x.append("world").toString

값 y와 z는 x에 대하여 정확히 같은 동작을 한다. 하지만 결과는 어떨까?

위와 같이 결과 값이 다르다. 따라서 StringBuilderappend는 순수하지 않다고 할 수 있다. 그 이유는 StringBuilder 내부에 있는 문자열들이 append로 인해 변경되기 때문이며, 이는 부수 효과로 볼 수 있기 때문이다.

Reference

  • Manning Functional Programming in Scala - Chapter 1. What is functional programming?

0개의 댓글