함수형 프로그래밍(Functional Programming, FP) 개요

Why should We write code as functional programming?

Mango
5 min readFeb 14, 2021
프로그래밍 방식의 진화 과정을 보여주는 대표적인 이미지
프로그래밍 방식의 진화 과정을 보여주는 대표적인 이미지

대부분의 개발자들은 명령형 프로그래밍(Imperative Programming) 에 익숙합니다. 그럼에도 불구하고 우리가 기존에 코드를 작성하던 형태인 명령형 프로그래밍 방식을 탈피하고 왜 함수형 프로그래밍으로 개발을 해야 하는지, 어떠한 특성들이 있는지 알아보는 시간을 가져보려 합니다.

The reason why?

함수형 프로그래밍을 사용하는 이유를 함수형 프로그래밍의 특징과 같이 설명하도록 하겠습니다.

Pure Function Features
  • 불변성(Immutable)
  • 부수효과(Side Effects) 제거
  • 참조 투명성(Referential Transparency)
  • 순수함수(Pure Function)
  • 일급 함수(First-Class Function)
  • 게으른 평가(Lazy Evaluation)

함수형 프로그래밍의 가장 큰 특징은 객체의 불변성을 유지하여 부수효과(Side effects)를 발생시키지 않고 일급 함수를 사용하여 간결하고 결합도(Coupling)가 낮고 응집력(Cohesion)이 높은 코드를 작성하여 코드, 테스트 케이스의 신뢰도와 재사용성을 높인다는 것입니다.

불변성(Immutable)이란?

  • 모든 객체는 상수로 선언되어 선언된 객체의 값이나 상태가 변하지 않는것.
  • 불변성을 유지함으로써 부수효과를 없애고 객체의 값을 신뢰할 수 있게된다.

부수효과(Side Effects)란?

  • 함수가 실행되는 과정에서 외부의 상태(외부 변수, 전역 변수)를 사용 or 수정하는 것
  • 파일이나 네트워크를 출력하는 작업
  • 예외 발생
  • 부수효과가 있는 함수는 아래와 같은 단점들이 존재한다.
    ‣ 테스트를 신뢰하기 어렵다.
    ‣ 디버깅하기 어렵다.
    ‣ 외부의 상태를 사용하는 다른 모든 메서드들에 대하여 예외 처리가 필요하며 불확실성이 많아진다.

참조 투명성(Referential Transparency)이란?

  • 프로그램 변경 없이 어떠한 표현식을 값으로 대체할 수 있는 것
  • 어떠한 표현식들을 값으로 대체할 수 있음으로써 여러 이점들을 얻을 수 있다.
    ‣ 컴파일 단계에서 코드 최적화를 가능하게 한다.
    ‣ 코드가 평가되는 시점을 늦출 수 있다. -> 게으른 실행(Lazy Evaluation)

순수함수(Pure Function)란?

  • 동일 입력은 매번 동일한 결과값을 출력한다.
  • 외부 객체를 참조하지 않는다.
  • 파일 입출력, 네트워크 통신 등의 작업을 하지 않는다.

실제 업무 환경에서 작업을 하다보면 파일 입출력, 네트워크 통신 등의 작업들은 불가피합니다. 그렇다면 우리는 최대한 순수함수를 사용하여 부수효과를 없애 함수형 프로그래밍의 장점을 살리려면 아래와 같이 작업해야 합니다.

순수하지 못한 작업의 분리

  1. 파일 입출력, 네트워크 통신 등의 작업을 하는 함수를 최소한으로 선언
  2. 위와같은 함수들을 따로 모듈화하여 분리하는 방식으로 접근

일급함수(First-Class Function)란?

  • 함수를 매개변수로 받을 수 있다.
  • 함수를 결과값으로 반환할 수 있다.
  • 함수를 객체나 자료구조에 담을 수 있다.

일급함수의 특징 덕분에 우리는 함수형 프로그래밍을 할 수 있고 여러 방법들을 사용하여 코드를 더 간결하고 재사용성이 높은 코드 작성이 가능합니다. 이러한 점들이 가능하게 하는 방법들에 대해서는 다음 챕터에서 자세히 다루도록 하겠습니다.

게으른 평가(Lazy Evaluation)란?

  • 함수가 호출되는 시점에 한번만 연산이 발생하며 연산이 이루어진 후 값을 저장해놓는다.
  • 연산이 오래 걸리는 작업에 유용하다.
  • 게으른 평가의 특징으로 인하여 무한한 자료구조를 담을 수 있다. -> 코틀린을 기준으로 설명하면 Sequence 자료구조를 사용하여 무한한 자료구조를 담을 수 있습니다.

Conclusions

위 메인 사진에서 보듯이 진화란 이전 단계에서의 단점을 보안하여 더 나은 형태로 변하는 것을 뜻합니다. 함수형 프로그래밍은 위와 같은 방식들을 사용하여 명령형 프로그래밍의 단점들을 보안하였습니다. 앞서 소개한 방식들을 토대로 함수형 프로그래밍에서 제안하는 재귀, 모나드, 펑터, 커링 등과 같은 여러 기능들을 제공합니다. 이 기능들을 사용하여 우리는 함수형 프로그래밍을 사용함으로써 발생하는 효율성 손실 등의 단점들을을 막고 함수형 프로그래밍의 장점을 극대화시켜 주지만 기능들을 다 학습해야 한다는 단점이 있습니다. 즉 러닝커브가 어느정도 있다는 이야기 입니다. 하지만 도구를 처음 사용하는것이 어렵지 사용법을 익히고 사용하면 할수록 금세 익숙해 지듯이 계속 사용한다면 금방 익숙해 질 것입니다. 이번 챕터에서 함수형 프로그래밍의 기본 개요를 다루었으니 앞으로 다음 챕터에 계속 이어서 함수형 프로그래밍의 기능들에 대하여 설명하도록 하겠습니다.

--

--