본문 바로가기
IT 정보

함수형 프로그래밍을 배워야 하는 이유

by 삼모리 2019. 2. 20.

최근 함수형 프로그래밍이라는 말을 많이 듣는다. 객체지향 프로그래밍만 해도 버거운데 함수형 프로그래밍이라니? 하루하루 바쁘게 살고 있는데 또 뭔가 배워야 하는 압박이 온다. 도대체 함수형 프로그래밍이 뭐길래 왜 배워야 할까? 오늘은 간단하게 이에 정리해봤다.



1. 함수형 프로그래밍 정의

함수형 프로그래밍은 절차형 프로그래밍, 객체지향형 프로그래밍(이른바 OOP)과 대비되는 또 다른 프로그래밍 패러다임이다. 


2. 함수형 프로그래밍과 객체지향 프로그래밍의 차이

우리는 학교에서 수학을 배울 때 함수란 것을 배웠다. 함수는 y = f(x) 라는 식으로 쓰인다. 함수에 어떤 값 x를 넣으면 y가 나온다는 의미이다. 이처럼 수학적 함수에서의 y값은 철저하게 입력된 인자 x에 의존한다. 함수형 프로그래밍에서 사용되는 함수는 철저하게 이 규칙을 따른다.


하지만, 절차지향 프로그래밍이나 객체지향 프로그래밍의 함수는 그렇지 않다. 객체지향 프로그래밍에서는 보통 메서드라는 것이 함수의 역할을 한다. 메서드는 수학적 함수처럼 동작하기도 하지만 그렇지 않을 때도 있다. 


1. 수학적 함수처럼 동작하는 경우

public int doubleNumber(x) {

return x * 2

}


2. 수학적 함수처럼 동작하지 않는 경우

public void processSomething() {

OtherData data = OtherObject.getData();


if(data !== null) {

process(data);

}

}


위 예시처럼 객체지향 프로그래밍의 메서드는 수학적 함수처럼 동작하지 않는 경우가 있다. 수학적 함수는 인자 x를 넣으면 y가 리턴된다. 그러나 두 번째 예시에서는 어떤 인자도 입력되지 않았으며 어떤 값도 리턴되지 않았다.


하지만 두 번째 메서드는 OtherObject의 데이터를 가져와 어떤 작업을 거쳐 data의 상태를 변화시키고 있다. 숨겨진 입력과 숨겨진 출력이 있는 것이다.


3. 부수 효과

숨겨진 입력을 부원인(side-cause)라고 하며, 숨겨진 출력은 부작용(side-effect)이라고 한다. 그리고 이 둘을 통틀어 부작용 또는 부수 효과라고 한다.


부수 효과는 우리가 예상하지 못한 결과를 의미한다. 만약 메서드 processSomething의 API를 받아서 코드를 짠다고 생각해보자. 이 때 processSomething의 인자는 void이고 리턴값은 없다고 적혀 있을 것이다. API 명세만 봐서는 Other 객체의 data가 변하게 된다는 것을 알 수 없다.


물론 이런 문제는 문서화를 철저히 하면 된다고 생각할 수 있다. 하지만 개발을 해본 사람은 잘 알 것이다. 문서화는 완벽하게 하기도 어렵고, 했다고 해도 그것을 보는 사람이 제대로 보지 않는다. 숨겨져 있는 입력과 출력을 갖는 메서드를 겉으로 들어난 API만 보고 사용할 경우 뜻하지 않았던 부수 효과가 발생한다. 그리고 이런 부수 효과가 쌓이고 쌓이면 프로그램은 복잡해지고 소프트웨어의 안정성이 현격히 떨어진다.


4. 순수 함수

함수형 프로그래밍에서는 부수 효과를 차단하기 위해서 철저하게 수학적 함수를 짠다. 즉 출력값이 입력되는 인자에 따라서만 달라지도록 한다. 함수 안에는 외부의 어떤 것도 참조하지 않으면 외부의 어떤 것도 변형시키지 않는다.


함수형 프로그래밍에서 이렇게 만든 함수를 순수 함수라고 부른다. 순수 함수는 온전히 입력 값에만 의존하고 다른 외부 환경에는 어떠한 의존성도 갖지 않는다. 따라서 독립적으로 테스트할 수 있고, 독립적으로 디버깅할 수 있으며, 독립적으로 실행할 수 있다.


5. 함수형 프로그래밍을 배워야 하는 이유

함수형 프로그래밍에서 함수는 순수 함수로만 짜야 한다. 프로그램이 순수 함수로만 이뤄져 있으면 부수 효과가 적어진다. 결과적으로 버그가 줄어들고 프로그램이 안전해진다. 바로 이것이 함수형 프로그래밍을 배워야 하는 이유이다. 


그렇다면 지금 우리가 알고 있는 객체지향 프로그래밍은 완전히 버려야 하는 것인가? 아직 함수형 프로그래밍이 현 시대 메이저 프로그래밍 패러다임인 객체지향을 완전히 대체하기에는 시기 상조라는 말이 많다. 그래서 Scala, OCaml 같이 함수형 프로그래밍을 표방하지만 OOP 개념도 들어간 멀티 프로그래밍 패러다임 언어가 나오고 있다.


그렇지만 결국 프로그램은 부수 효과를 최소화 하는 방향으로 개발되어야 한다. 그리고 그 방향은 함수형 프로그래밍으로 향해있다. 그 말은 지금부터라도 함수형 프로그래밍을 배우고 준비해야하는 이유가 된다.


참고 : 함수형 프로그래밍이란 무엇인가?



댓글