CS 지식/개발 상식

함수형 프로그래밍(Functional Programming)

naksnaks 2023. 2. 6.
반응형

함수형 프로그래밍

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

함수형 프로그래밍 언어의 종류에는 대표적으로 Scala(스칼라), Haskell(하스켈), Clojure(클로저) 등이 있습니다.
Javascript, Java, Python, Kotlin 등에서도 함수형 프로그래밍 문법을 사용할 수 있습니다.

선언형 프로그래밍 패러다임을 따르고 있습니다.

선언형 프로그래밍은 WHAT(무엇을 할 지) 을 중요시 하고, 명령형 프로그래밍은 HOW(어떻게 할 지) 를 중요시 합니다.

함수형 프로그래밍 장단점

장점

  • 순수 함수를 이용하기 때문에 함수에서 함수로 전달되는 상태만 있을 뿐, 전역 상태 자체가 존재하지 않습니다. -> 외부 데이터에 의존 X, 외부 데이터 변경 X
  • 객체 내부의 상태 변화를 제어하는 어려움 X
  • 문제가 발생했을 때 객체 지향 프로그래밍에 비해 문제의 원인을 파악하고 유지 보수하기 편합니다.

단점

  • 코드의 가독성 ↓
  • 재귀함수를 통해 무한 루프에 빠질 수 있습니다.
  • 순수함수를 쓰는 것은 쉬울 수 있어도, 조합하는 것은 어렵습니다.

함수형 프로그래밍의 특징

1. Pure function(순수함수)

  • 동일한 입력에는 항상 같은 값을 반환해야 합니다.
  • 함수의 출력(return)은 그 함수에 입력된 값(input)에만 의존합니다.
  • 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 합니다.

2. Immutability(불변성)

  • 데이터는 변하지 않는 불변성을 유지해야 합니다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행합니다.

Shallow copy vs Deep copy

함수형 프로그래밍의 특징 중 불변성을 실현하려면 복사본을 만들어야 합니다. 그렇다면 두 가지의 복사의 방법 중 어떤 것을 사용해야 할까요?

Shallow copy
주소 값을 복사(스택 영역)하기 때문에 참조하고 있는 실제 값은 같습니다.

Deep copy
실제 값을 메모리 공간에 복사(힙 영역)하기 때문에 참조하고 있는 실제 값이 다릅니다.

위 두 가지 경우를 보았을 때, input이 객체 or 배열 같은 참조 타입(reference type)이라면, shallow copy로 인해 원본이 변경되지 않도록 조심해야 합니다.

3. Function Composition(기능 구성)

  • 둘 이상의 함수를 조합하는 과정을 말합니다.
  • 함수를 조합하기 때문에 고차원함수(Higher-Order Function)을 활용합니다.

Higher-Order Function(고차원 함수)

  • 함수를 argument(인자)로 받습니다.
  • 함수를 결과로 반환합니다.

함수형 프로그래밍에서 함수는 1등급 객체(First-Class Object)입니다.

1등급 객체(first-class object)

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

※ JAVA로 함수형 프로그래밍 도입하기 - Tecoble - Java 8에서 왜 함수형 프로그래밍이 도입되었을까?

참조
JONGMINFIRE - 함수형 프로그래밍이란?
위키피디아 - 함수형 프로그래밍
Sung Archive - 프로그래밍 언어 종류와 언어별 특징
thms200 - 함수형 프로그래밍
최블랙의 개발로그 - Shallow copy와 Deep copy

반응형

'CS 지식 > 개발 상식' 카테고리의 다른 글

MVC vs MVVM  (0) 2023.02.09
Git 과 Github  (0) 2023.02.02
애자일 (Agile)  (0) 2023.01.26
RESTful API란?  (0) 2023.01.26
OOP(객체 지향 프로그래밍)  (2) 2023.01.26

댓글

💲 추천 글