개발 지식

함수형 프로그래밍(Functional Programming)이란? 함수형 프로그래밍의 특징과 장점, 한계

연구소장 J 2022. 7. 4. 22:34

프로그래밍 패러다임

프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고, 결정하는 역할을 한다. 이러한 프로그래밍 패러다임은 다음과 같이 크게 두 가지로 나눌 수 있다.

 

  •  명령형 프로그래밍 : 프로그래밍의 상태와 그것을 변경시키는 구문의 관점에서의 연산을 설명
    • 절차적 프로그래밍 : 프로시저(Procedure)를 이용해 순차적인 처리를 중요시 여기는 패러다임
    • 객체 지향 프로그래밍 : 객체들의 집합으로 프로그램의 상호작용을 표현
  • 선언형 프로그래밍 : 어떻게(How) 할 것인가 보다는 무엇(What)을 할 것인가를 표현
    • 함수형 프로그래밍 : 순수 함수(Pure Function)를 조합하고 프로그램을 만드는 방식

 

함수형 프로그래밍은 초창기부터 소프트웨어 개발의 한 흐름이었지만, 요즘날 그 중요성이 더욱 커지게 되었다.

 

 

참고 :

 

 

[프로그래밍 언어론] 명령형(Imperative)프로그래밍과 선언형(Declarative)프로그래밍

명령형(Imperative) 프로그래밍 명령형 프로그래밍이란 프로그램의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 쉽게 설명하자면, 컴퓨터가 수

code-lab1.tistory.com

 

 

[프로그래밍 언어론] 객체 지향 프로그래밍(OOP : Object Oriented Programming)란? OOP의 장단점

객체 지향 프로그래밍(OOP)과 객체(Object) 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는

code-lab1.tistory.com

 

 

함수형 프로그래밍이란?

 

함수형 프로그래밍(Functional Programming)
[그림 1] 함수형 프로그래밍

 

함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다(위키백과)

 

함수는 코드 구성의 기본이며 모든 고차원 프로그래밍 언어에 존재한다. 일반적으로 함수형 프로그래밍은 깨끗(clean)하고 유지보수가 쉬운 소프트웨어를 만들기 위해 함수를 최상의 효과로 사용하는 것을 의미한다. 

 

가끔 함수형 프로그래밍을 객체지향 프로그래밍(OOP) 혹은 절차적 프로그래밍의 반대 개념으로 생각하는 경우가 있다. 하지만 셋은 상호 배타적이지 않으며 대부분의 시스템은 이 세 가지 모두를 사용하는 경향이 있기 때문에 오해의 소지가 있다. 

 

함수형 프로그래밍 언어로 분류되는 대표적인 언어로는 SQL, Scala, Clojure 등이 존재한다.

 

이러한 함수형 프로그래밍은 다음과 같은 특징들을 가진다.

 

  • 함수형 프로그래밍은 과정(Process)보다 결과(Result)에 관심이 많다.
  • 무엇(What)이 실행될 지를 강조한다.
  • 데이터는 불변(immutable)하다.
  • 함수형 프로그래밍은 문제를 함수로 분해(Decompose)한다.
  • 함수형 프로그래밍은 수학적 함수의 개념에 기반한다.
  • 함수형 프로그래밍은 If-Else와 같은 조건문 혹은 반복문을 지원하지 않는다.

 

함수형 프로그래밍 관련 용어 및 개념

함수형 프로그래밍의 특징
[그림 2] 함수형 프로그래밍의 특징 (출처 : 참고 2번)

 

함수형 프로그래밍 관련 용어들과 개념들을 통해 함수형 프로그래밍에 대해 이해해보자.

 

 

1. 1. 불변하는 데이터(Immutable Data)

 

함수형 프로그래밍의 원칙 중 하나는 데이터를 함수 밖에서 변형(modify) 하지 않는 것이다. 다만, 함수의 반환 값(Return Value)은 함수 내에서 수행된 작업을 반영해야 한다.

 

이것은 부수 효과(Side Effect)를 방지할 수 있는 방법이며 함수의 영향에 대해 추론하는 것을 더 쉽게 만들어준다.

 

* 부수 효과 : 함수 내의 동작으로 인해 함수 외부가 영향을 받는 것을 의미한다. 예를 들어 함수 내의 동작으로 인해 함수 밖의 변수 값이 변경되거나, 예외나 오류가 발생하여 실행이 중단되는 것 등을 뜻한다.

 

2. 클로저(Closure)

 

클로저란 부모 함수가 실행되었더라도 부모 함수의 변수에 접근할 수 있는 내부 함수(inner function)를 뜻한다. 

 

 

3. 순수 함수(Pure Functions)

 

함수형 프로그래밍의 이상(ideal)은 순수 함수라고 알려져있다. 순수 함수는 입력 파라미터에만 의존하며, 부수 효과를 일으키지 않는 함수를 뜻한다. 함수형 프로그래밍은 순수 함수를 통해 불변하는 데이터의 특징을 가질 수 있다.

 

이러한 순수 함수의 아름다움은 단순함에 있다. 순수 함수는 오직 인수(arguments)와 반환 값으로만 환원된다. 즉, 순수 함수는 정의된 API를 통해서만 외부 시스템과 상호 작용하여 결과를 만들어낸다. 쉽게 말해 정해진 입력 값을 주면 정해진 반환 값을 주기만 할 뿐, 부수 효과가 발생하지 않는 단순한 구조를 가지고 있는 것이다.

 

바로 이점이 객체 지향 프로그래밍(이하 OOP)과 다른 점이다. OOP는 객체의 메서드가 객체의 상태(혹은 객체의 멤버)와 상호작용하며 외부 상태가 함수 내에서 조작되고는 한다. 

 

 

4. 일급 객체 함수(First Class Functions)

 

순수 함수라는 이상(ideal)을 넘어, 실제 함수형 프로그래밍은 일급 객체 함수에 의존한다. 일급 객체란 다음과 같은 특징을 가진 객체를 뜻한다.

 

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환 값으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 property 할당이 가능하다.

함수형 프로그래밍에서 함수는 일급 객체로 취급된다. 따라서 일급 객체 함수란 일급 객체로 취급되는 함수를 뜻한다.

 

이러한 일급 객체 함수는 사용에 제한이 없기 때문에 프로그램 내 어디서든 사용할 수 있어 유연(flexible)하고 유용하다.

 

5. 유지 관리 가능성(Maintainability)

 

유지 관리 가능성이란 함수 밖에서 의도치 않게 어떠한 것이 바뀌지 않으므로(=부수 효과가 발생하지 않기 때문에) 프로그램을 유지 관리하기 용이하다는 뜻이다.

 

6. 모듈화 (Modularity)

 

모듈화는 생산성을 증가시킨다. 작은 모듈은 빠르게 작성할 수 있으며 재사용하기 용이하여 프로그램 개발 속도를 높일 수 있다. 또한 모듈은 분리하여 테스트하기에도 유용하여 디버깅과 테스트 시간을 줄일 수 있다.

 

7. 참조 투명성(Referential Transparency)

 

함수형 프로그래밍에서 함수는 항상 같은 동작을 진행한다. 따라서 프로그래머는 함수의 실행으로 인해 어떠한 결과를 반환할지 예측할 수 있다. 동일한 인자에 대해서는 항상 동일한 결과를 반환한다는 뜻으로 해석해도 된다.

 

 

함수형 프로그래밍의 장점과 한계

 

함수형 프로그래밍을 사용하면 다음과 같은 장점들이 존재한다.

 

  • 헷갈리는 문제와 오류를 피할 수 있다.
  • 테스트와 디버깅이 용이하다.
  • 더 나은 모듈화와 짧은 코드를 제공한다.
  • 개발 생산성을 높일 수 있다.
  • 가독성이 높은 코드를 작성하기 쉽다.
  • 부수효과를 제거할 수 있다.
  • 함수 단위의 코드 재사용이 쉽다.
  • 프로그램의 동작을 예측하기 쉽다.

 

함수형 프로그래밍은 그 유연성과 유용함을 인정받아 대표적인 OOP 언어인 JAVA와 C# 에서 조차 일급 객체 함수를 지원한다. Java 8에서부터 람다(Lamda)를 지원하는 것이 그 예이다.

 

하지만 다음과 같은 한계점도 존재한다.

 

  • 함수형 프로그래밍의 개념은 이해하기 쉽지 않다.
  • 프로그래밍을 진행하며 수 많은 함수들을 파악하고 유지 관리하기 힘들어진다.
  • 광범위한 환경 설정이 필요할 수 있다.
  • 함수가 많아질 수록 함수를 조합하기 복잡해지며 꾸준한 리팩터링(Refactoring)이 필요할 수 있다.

 

 

 

 


참고

1. https://www.infoworld.com/article/3613715/what-is-functional-programming-a-practical-guide.html

2. https://www.guru99.com/functional-programming-tutorial.html

3.https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84

 

 

반응형