본문 바로가기
개발/개발지식

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

by 그레이웅 2022. 10. 10. 17:34
반응형

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

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

함수형 프로그래밍은 말 그대로 깨끗하고 유지 보수가 가능한 소프트웨어를 만들기 위해 함수를 사용하여 최상의 효과를 내는 것을 의미한다.

 

이해를 돕기 위해서 공장을 생각하면 쉬울 것 같다. 컵라면 공장을 생각해보면 컵라면의 컵을 먼저 레일에 올리고, 

면이 담기고, 스프가 담기고, 뚜껑을 닫는다.

함수형 프로그래밍을 공장으로 생각해보면 각각의 역할(컵라면의 컵에 면을 담는 행위)처럼 공장에선 개별 장치들이 각자 자신이 맡은 역할만 한다.

같은 입력을 받으면 항상 똑같은 행위(결과)를 내보낸다는 것이 순수 함수의 개념이다.

 

함수형 프로그래밍의 특징

 

함수형 프로그래밍의 특징은 다음과 같다.

 

1. 순수 함수(Pure Function)

 

- 순수 함수는 동일한 입력값이 있으면 항상 같은 결과를 반환해야 한다.

- 함수의 실행이 프로그램의 실행에 영향을 미치면 안 된다.

- 입력 매개변수에만 의존하고 연산이 side Effect를 일으키면 안 된다.

 

순수 함수 예제

function sum(x,y) {
	return x + y;
}

console.log(sum(1,3)) // 4;

순수 함수는 매개변수에만 의존하기 때문에 sum함수에 들어가는 파라미터 인자 값만 달라진다.

입력값에 대해서만 값의 변환이 있고 프로그램 실행에 영향을 미치지 않는 것이 순수 함수이다.

 

 

2. 불변성(Pure Function)

- 함수형 프로그래밍은 데이터의 불변성을 유지해야 한다. (데이터가 변하지 않는 상태)

- 데이터의 변경을 시도할 경우 원본 데이터는 유지하면서, 복사본을 만들어 복사본을 사용하여 작업한다.

 

const todos = { no : 1, todo : "할일" };

function addTodo (todo) {
	return {...todos, no : todos.no + 1, todo : todo };
}

이와 같이 전개 연산자를 사용해 데이터의 복사본을 만들고 이 복사본을 사용해 작업을 진행한다.

 

3. 1급 객체(First-class citizen)

1급 객체는 다음과 같은 조건을 충족해야 1급 객체라고 할 수 있다.

 

- 변수나 데이터 구조 안에 담을 수 있어야 한다.

- 파라미터로 전달할 수 있다.

- 리턴 값으로 사용할 수 있다.

 

프로그래밍 언어에서 1급 객체란 타입을 전달, 반환, 할당할 수 있는 경우 1급 객체로 취급한다.

JavaScript 에서는 함수를 반환도 하고, 함수를 받을 수 있는 함수를 만들 수도 있기 때문에 함수형 프로그래밍 구현이 가능해진다.

 

다음 예제와 같은 특징을 가지고 있어야 1급 객체로 취급된다.

//변수에 할당
var sum = function(a, b) {
	return a + b;
}

var sum2 = sum;

//인자로 전달

var sum3 = function(func) {
	return func();
}

// return 값으로 전달할 수 있다.
sum3(function a, b, c) {return a + b + c});

 

다음은 1급 함수순수 함수를 충족하는 예제이다.

function sum(a) {
	return function(b) {
    	return a + b;
    }
}

var sum1 = sum(1);
var sum2 = sum(3);

console.log(sum1(3)); // 4
console.log(sum2(3)); //6

이 예제에서는 클로저(closure)의 개념도 들어있다. 이전 포스팅 글에서 클로저의 개념을 볼 수 있다.

2022.10.06 - [개발/Javascript] - [JavaScript] 클로저(Closure)

 

[JavaScript] 클로저(Closure)

클로저(Closure) 클로저는 함수내에서 함수가 선언된 어휘적 환경의 조합이다. 클로저를 이해하기 위해선 우선 자바스크립트의 변수의 유효 범위의 지정을 먼저 이해해야 한다. 어휘적 범위 지정(

ijw9209.tistory.com

 

 

4. 고차 함수(Higher-order functions)

고차 함수의 특징은 다음과 같다.

 

- 함수를 인자로써 전달할 수 있어야 한다.

- 함수의 리턴 값으로 또 다른 함수를 사용할 수 있어야 한다.

 

// 함수를 인자로 전달받고, 함수를 리턴하는 경우
function addOne(num) {
	return num + 1; 
}

//addOneSubtractor함수는 고차함수이다.
function addOneSubtractor(subtract , func) {
	const addedOne = func(subtract);
    return function (num) {
    	return num - addedOne;
    }
}

addOneSubtractor(1, addOne)(5); // 3

함수형 프로그래밍은 높은 수준의 추상화와 함수 단위로 쪼개기 때문에 프로그래밍의 유지 보수가 쉬워진다. 

그리고 프로그래밍이 어떻게 동작할지 예측할 수 있다는 장점이 있지만,

이러한 순수 함수를 구현하는데 코드의 가독성이 좋지 않을 수도 있고, 순수 함수로 구현해야 하기 때문에 코드를 구현하는데 어려움이 있다는 단점도 있다.

위 사항을 잘 지켜야 하는데 코드가 복잡해지면, 구현하기 어려울 수도 있겠다는 생각을 하였다.

하지만 코드를 잘 구현한다면 정말 좋은 프로그램이 만들어질 수도 있을 것 같다.

 

 

 

 

 

도움이 된 글

- https://ko.wikipedia.org/wiki/함수형_프로그래밍

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

- https://jongminfire.dev/함수형-프로그래밍이란

- https://soeunlee.medium.com/javascript에서-왜-함수가-1급-객체일까요-cc6bd2a9ecac

 

 

반응형

댓글