개발 공부

[프로그래밍 패러다임] 함수형 프로그래밍

Lea Hwang 2022. 11. 8. 17:49

프로그래밍 패러다임

절차지향 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍은 프로그래밍 패러다임에 속하며 프로그래머가 코드를 어떻게 작성할지 결정하는 역할을 합니다.

 

프로그래밍 패러다임을 배우는 것은 지금과는 다른 방식으로 사고하는 방법을 배우는 것과 같다고 생각합니다.

열린 사고를 바탕으로  프로그래밍을 하면 유연한 문제 해결과 더 나은 코드를 작성할 수 있을 것입니다.

 

 

 

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

등장 배경

이전까지 명령형 프로그래밍을 기반으로 개발을 했을 때 부수효과가 나타났습니다.

여기서 부수효과란 어떤 함수의 동작에 의해 프로그램 내 특정 상태가 변경되는 상황을 말하는 것인데요.

이는 외부의 데이터를 참조해서 함수를 만들거나 원본 데이터를 그대로 가지고 와서 작업하는 등 여러 이유로 발생합니다.

 

물론 *수동적인 방식으로 제한할 수는 있지만 구현이 어렵고 주의를 필요로 합니다.

* 수동적인 방식에는 한 쓰레드가 접근해서 일을 마치기까지 수동으로 변수에 락을 걸거나,

   synchronized 등을 이용해 변수를 동기화하는 방법이 있습니다.

 

함수형 프로그래밍은 선언형 프로그래밍으로(~는 ~다.) 이러한 부작용에 의한 문제로부터 보다 자유롭습니다.

함수의 동작에 의한 변수의 부수적인 값 변경을 원천 배제함으로써 앞서 말한 종류의 오류를 방지하는 것입니다.

 

외부 변수를 사용하더라도 그 본체에 접근해서 변경하는 게 아닌 인자로 넣어 사본으로 복사해가서 작업을 하기 때문에

부작용이 일어나지 않게 됩니다.

 

물론 앱 전체를 함수형 프로그래밍으로 짤 수는 없겠지만 일정 단위의 작업에 있어서는 부수효과 없이 안정적이고 예측 가능한 프로그램을 짜는 것을 목표로 합니다. (Scala, Haskell, Elixir, F#)

 

 

 

대표적 특징

함수형 프로그래밍의 특징을 잘 나타내는 문장이 있어서 가져와 봤습니다. 

부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환 값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.

여기서의 키워드는 '부수 효과', '순수 함수', '1급 객체', '참조 투명성'입니다. 하나씩 알아보도록 하겠습니다.

 

 

(1) 부수 효과(Side Effect)

다음과 같은 변화 또는 변화가 발생하는 작업을 의미합니다.

  • 변수의 값이 변경됨
  • 자료 구조를 제자리에서 수정함
  • 객체의 필드 값을 설정함
  • 예외나 오류가 발생하며 실행이 중단됨
  • 콘솔 또는 파일 I/O가 발생함

 

(2) 순수 함수(Pure Function)

  • 외부 환경으로부터 철저히 독립적이며 (따라서 외부 상태를 변경하거나 외부의 값을 참조하지 않음)
  • 같은 인풋에 있어 언제나 동일한 아웃풋을 생산해 내는 함수를 순수 함수라고 합니다. 
  • 함수 자체가 독립적이며 Side Effect가 없기 때문에 Thread에 안전성을 보장받을 수 있고 병렬 처리를 동기화 없이 진행할 수 있습니다.

 

(3) 1급 객체

함수형 프로그래밍에서는 함수도 '값'으로 보아 인자로 다른 함수를 받아 올 수 있습니다.

자바스크립트로 예를 들어보겠습니다.

function hello (given) {
	console.log(given);
}

var hello = function (given) {
	console.log(given);
}

 

그리고 인자로 다른 함수를 받아 결과값을 내보내는 함수를 고계 함수라고 합니다.

 

이를 바탕으로 1급 객체를 정리해보자면 다음과 같은 것들이 가능한 객체를 의미합니다.

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

함수형 프로그래밍에서 함수는 1급 객체로 취급받기 때문에 함수를 파라미터로 넘기는 등의 작업이 가능한 것입니다.

 

 

(4) 참조 투명성

  • 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
  • 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.(Immutable Data)

 

 

 

장점

Side Effect를 미연에 방지하고 예측을 용이하게 하는 것이 장점입니다.

 

 

 

 

 

 

함수형 언어나 함수형 프로그래밍을 위한 라이브러리들에는 컬렉션 내 요소들을 다양하게, 연속적으로 처리할 수 있습니다.

Java의 경우 함수형 프로그래밍을 위한 이미 많은 구현체들을 만들어두었으며 다양한 API를 제공하고 있어 다음 포스팅에서는 Stream API를 기술할 예정이며 추가적으로 For each, Lambda Expression, Functional Interface도 함께 정리해 볼 계획입니다.

 

 

 

 

 


 

 

 

 

참고:

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

절차지향 vs 객체지향 vs 함수형
함수형 프로그래밍이란?

함수형 프로그래밍이 뭔가요?