프로그래밍 패러다임이란 프로그래머에게 프로그래밍에 대한 관점을 가지게 하고 결정하는 역할을 한다. 다양한 패러다임이 존재하고, 현직에서 또한 다양한 패러다임들이 사용되고 있다. 대표적으로 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 "명령형 프로그래밍"의 종류에는 "절차 지향 프로그래밍", "객체 지향 프로그래밍" 등이 있다. 하지만 오늘은 어떻게 할것인가 보다는 무엇을 할것인가를 표현하는 "선언형 프로그래밍"의 하나인 "함수형 프로그래밍"에 대해서 정리해보고자 한다.
"함수형 프로그래밍 패러다임"은 "객체지향 프로그래밍 패러다임"과 함께 현재 가장 중요하게 여겨지는 패러다임이다. 이 둘은 불변성, 참조투명성, 객체화 등을 내세워서 안전하고 명확한 개발의 방향과 비전을 제시한다. 특히나 "함수형 프로그래밍"을 통해서 객체단위의 설계를 넘어선 함수 단위의 사고를 익힐 수 있다.
일반적인 프로그래밍은 그냥 생각하면 되는 것이고, 함수형 프로그래밍은 기존과 다르게 생각하는 방법을 알려줄 것이다. 그러므로 당신은 아마도 예전의 방식으로 절대 돌아가지 못할 것이다.
함수형 프로그래밍(Functional Programming)
자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
- 모든 것을 순수 함수로 나누어서 문제를 해결하는 기법
- 함수를 타입으로 지정할 수 있다
- 함수를 인자값으로 넘길 수 있다.
- 함수를 리턴값으로 받을 수 있다.
- 순수한 함수를 작성하고, 공유된 상태와 변경 가능한 데이터, 부작용을 피하면서 소프트웨어를 작성한다.
💡 함수도 객체처럼 변수나 함수의 인자로 사용하면서 리터럴하게 다룰 수 있다.
함수형 프로그래밍의 장점
- 가독성이 높다.
- 유지보수가 용의하다.
- 상태, 가변데이터를 멀리하기 떄문에 오류 발생이 적다.
함수형 프로그래밍의 특징
부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.
부수효과(Siede Effect)
변화가 있거나, 변화를 발생시키는 작업
- 변수의 값이 변경된다.
- 자료구조를 제자리에서 수정한다.
- 객체의 필드값을 설정한다.
- 예외나 오류가 발생해서 실행이 중단된다.
- 콘솔, 파일 I/O가 발생한다.
순수 함수(Pure Function)
어떤 외부 상태에 의존하지도 않고 변경시키지도 않는, 즉 부수 효과(Side Effect)가 없는 함수
- Memory 나 I/O 관점에서 Side Effect가 없는 함수
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
- 외부상태에 의존하지 않고, 동일한 인수가 전달되면 동일한 값을 반환한다.
- 외부상태를 변경하지 않는다.
- 오직 함수의 입력만이 함수의 결과에 영향을 준다.
순수 함수의 장점
- 함수 자체가 독립적이며 Side-Effect가 없기 때문에 Thread에 안전성을 보장받을 수 있다.
- Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행할 수 있다.
순수 함수 사용법
- 순수함수를 제작하기 위해서 데이터 불변성을 유지하는 것이 중요하다
- 함수의 전달인자로 참조 자료형이 전달 될 경우에, 의도하지 않게 객체 자체가 바뀌기도하고, 데이터의 불변성이 손상된다.
- 배열의 불변성을 보장하기 위해서 map, filter, reduce를 많이 사용한다.
1급 객체(First-Class Object)
다음과 같은 작업이 가능한 객체
- 변수나 데이터 구조 안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환값으로 사용할 수 있다.
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.
참조 투명성(Referential Transparency)
함수를 실행하여도 어떠한 상태의 변화 없이 항상 동일한 결과를 반환하여 항상 동일하게(투명하게) 실행결과를 참조(예측)할 수 있는 것
- 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
- 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.(Immutable Data)
- 부작용을 제거해서 프로그램의 동작을 이해하고 예측하기에 편하게 한다.
👉 함수형 프로그래밍의 핵심
[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?
[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?
1. 함수형 프로그래밍(Functional Programming)에 대한 이해 [ 프로그래밍 패러다임(Programming Paradigm) ] 프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를
mangkyu.tistory.com
람다 계산 (Lamda Calculus)
추상화를 통해서 함수형 프로그래밍을 구현하기 위해서 반드시 필요한 계산법이다.
👉 람다 계산식 기본 형태
함수형 프로그래밍을 위한 람다 대수 입문 번역
A Tutorial Introduction to the Lambda Calculus 번역
studyingeugene.github.io
불변성 (Immutable)
- 함수 외부에서 데이터를 수정하지 않는다.
- 함수안에서 계산이 수행되는 동안 할당된 값들이 절대 바뀌지 않는다.
- 심볼의 값이 변경되지 않는다.
- 가변 변수를 사용하지만, 심볼에 값이 할당되면 값은 변경되지 않는다.
고차 함수(High order function)
- 함수를 다루는 함수
- 함수의 인자로 함수 전달 가능
- 함수의 리턴 값으로 함수 사용 가능
익명 함수(Anonymous function)
- 이름이 없는 함수
- 람다식으로 표현되는 함수 구현
게으른 평가(Lazy evaluation)
- 코드 실행 즉시 값을 평가하지 않고, 필요한 시점에만 평가한다.
클로저(clousre)
함수형 프로그래밍 언어에서 사용되는 중요한 특성
💡 자신이 생성 될 때의 당시의 환경을 기억하는 함수
- 생명 주기가 끝난 외부 함수의 변수에 접근할 수 있는 내부 함수
- 현재 상태를 기억하고 변경된 최신 상태를 유지하게 해준다.
클로저 특징
- 람다 계산식으로 구현한다.
- 이름 없는 함수로 리터럴하게 작성 가능하다.
- 선언된 범위에서 접근 가능한 변수를 캡처해서 저장하고 닫힌다.
- 캡처한 변수를 참조 한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures
클로저 - JavaScript | MDN
클로저는 주변 상태(어휘적 환경)에 대한 참조와 함께 묶인(포함된) 함수의 조합입니다. 즉, 클로저는 내부 함수에서 외부 함수의 범위에 대한 접근을 제공합니다. JavaScript에서 클로저는 함수 생
developer.mozilla.org
https://enjoydev.life/blog/javascript/6-closure
JavaScript의 클로저(Closure)란? (feat. React의 useState)
JavaScript의 클로저의 원리를 쉽게 배워보고 어떤 상황에 사용되는지 알아보도록 하겠습니다.
enjoydev.life
함수형 프로그래밍, 람다 표현은 이해 할 수 있었지만💪... 클로저에 대해서는 개념은 이해가 되지만 직접적으로 코드를 작성하는 과정을 겪으면서 더 학습해 봐야 겠다...😂😂