함수형 프로그래밍

박동규·2021년 4월 13일
1

해당 글은 인프런 유인동님의 함수형 프로그래밍 강좌를 학습하며 정리한 내용입니다.

함수형 프로그래밍 개요

순수함수를 통해서 조합성을 강조하는 프로그래밍.

순수함수란?

1급시민

1급시민

  • 변수에 저장할 수 있으며
  • 함수의 리턴값일 수 있고
  • 다른 함수에 파라미터로 전달할 수도 있다.

1. 객체지향 프로그래밍에서는 클래스가 1급시민이 되고,

  • 클래스 디자인과 객체들 간의 관계를 중심으로 코드가 작성된다.
  • 상태, 멤버변수, 메서드 등이 긴밀한 관계를 가지고 있다.
  • 멤버변수가 가지고 있는 상태에 따라 결과가 달라진다.

2. 함수형 프로그래밍에서는 함수가 1급 시민의 특성을 가진다는 것이 가장 큰 특징이다.

  • 상태 값을 지니지 않는 함수들의 연속으로 볼 수 있다.
  • 값의 연산 및 결과 도출 중심으로 코드가 작성된다.
  • 함수는 인자로 받은 값을 별도로 저장하지 않고,
    단지 처리하고 매핑하는데 주 목적을 둔다.
    (여기서 생기는 단점을 상쇄하기 위해 클로저라는 개념이 있다.)

매개변수로 동일한 값이 넘어 올 때, 외부에 영향을 끼치지 않고(부수효과) 항상 동일한 결과를 리턴하는 함수.

순수함수


동일한 인자를 넣었을 때, 같은 결과값이 리턴된다.

순수함수가 아닌 경우(결과값이 달라질 때)


외부의 요인에 의해서 c 값이 변경될 경우, 동일한 인자를 넣어도 결과값이 달라지게 된다. 이는 순수함수가 아니다.

순수함수가 아닌 경우(부수효과가 있는 함수)


결과값 외에 다른 방식으로 외부의 상태에 직접 관여를 하고 있다.

순수함수가 아닌 경우(부수효과가 있는 함수(객체))


들어온 인자의 값을 직접 변경하는 함수.

함수형 프로그래밍에서는 객체를 다루는 방식이 객체지향 프로그래밍과 조금 다르다. 객체를 변경하고 싶을 경우, 객체의 값은 그대로 두고, 새로운 객체를 하나 더 만들어서 복사한 뒤 리턴하는 방식으로 사용함.

다시 순수 함수




함수형 프로그래밍은 순수함수의 평가시점을 다루는걸 통해 다양한 로직, 이점들을 만들고자 하는 컨셉을 가지고 있다.

순수함수의 중요한 특징 중 한 가지는, 순수함수는 평가시점이 중요하지 않다는 것이다. 이 것이 함수형 프로그래밍이 가능한 중요한 이유이고, 함수형 프로그래밍에서 중시하는 개념이다.

예를 들어,
add2 함수의 경우, 순수함수가 아니기 때문에 평가시점이 굉장히 중요하다. 평가시점이 어느 시점이냐에 따라 로직이 정해지게 된다.

반면, 순수함수는 언제 실행해도 항상 동일한 결과를 리턴하기 때문에, 순수함수가 아닌 함수보다 훨씬 조합성을 강조시킬 수 있다. (평가시점을 개발자가 다룰 수 있게 되어 다양한 로직들을 만들 수 있다. 다른 함수의 인자로 넘긴다던지, 서로 다른 쓰레드나 공간에서 함수를 평가시켜도 동일한 결과를 리턴하기 때문에 안전하고 다루기 쉬운 함수가 된다.)

일급 함수

자바스크립트의 함수는 일급 함수이다. 함수를 값으로 다룰 수 있는 함수를 일급 함수라 한다.

변수에 함수가 담길 수 있다.

함수를 인자로 받는 함수f3를 만들고, 체크한 부분의 로직을 살펴보자.

인자로 넣은 함수 f는 리턴값에서 해당 함수의 형태로 들어가게 되고, 이 부분에서 평가를 통해

10이 리턴되게 된다.

즉, f3은 인자로 함수를 받기 때문에 어떤 함수를 받느냐에 따라 리턴값을 결정되게 될 것이다.

이러한 일급함수의 개념과 순수함수의 특징을 함수의 조합성을 높여나가는 것이 함수형 프로그래밍이다. 언제 평가해도 상관없는 순수함수들을 많이 만들고, 그 순수함수들을 값으로 들고 다니며 그 순수함수들을 가장 적절한 시점마다 평가를 하면서 이러한 방식으로 다양한 로직을 만들어 나가는 것이 함수형 프로그래밍이다.

add_maker 함수 예제를 통해 살펴보자. 이 함수는 일급함수와 클로저, 순수함수의 개념이 적용된 함수이다.
해당 부분은

이 scope에서 a라는 변수의 값을 기억하고 있는데,

이 부분이 클로저의 개념이다. 이 함수는 a를 기억하는 클로저가 된다. 또한 순수함수이기도 하다.

a의 값을 기억하고 있다가, 나중에 인자 b의 값이 들어오게 되면 10 + b의 값을 리턴해준다.

따라서 해당 부분을 실행하여 10 + 20의 값인 30이 리턴된다.

또 다른 예제


0개의 댓글