함수형 프로그래밍에 대해 설명해 주세요.
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 방법이다.
최근 프로그래밍 패러다임은 크게 아래와 같이 구분할 수 있다.
명령형 프로그래밍 : 무엇(
What)을 할 것인지 나타내기보다 어떻게(How)할 건지를 설명하는 방식절차지향 프로그래밍 : 수행되어야 할 순차적인 처리 과정을 포함하는 방식(C, C++)
객체지향 프로그래밍 : 객체들의 집합으로 프로그램의 상호작용을 표현(C++, Java, C#)
선언형 프로그래밍 : 어떻게(
How)할 건지를 나타내기보다 무엇(What)을 할 건지를 설명하는 방식함수형 프로그래밍 : 순수 함수를 조합하고 소프트웨어를 만드는 방식(클로저, 하스켈, 리스프)
함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.
함수형 프로그래밍의 특징
부수효과(Side Effect)
부수효과란 다음과 같은 변화 또는 변화가 발생하는 작업을 의미한다.
변수의 값이 변경됨
자료 구조를 제자리에서 수정함
객체의 필드값을 설정함
예외나 오류가 발생하며 실행이 중단됨
콘솔 또는 파일 I/O가 발생함
순수 함수
위와 같은 부수 효과들을 제거한 함수들을 순수 함수라고 부르며, 함수형 프로그래밍에서 사용하는 함수는 이런 순수 함수들이다.
Memory or I/O 관점에서 Side Effect가 없는 함수
함수의 실행이 외부에 영향을 끼치지 않는 함수
순수 함수의 장점
함수 자체가 독립적이며 Side Effect가 없기 때문에 Thread에 안전성을 보장받을 수 있다.
Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행할 수 있다.
1급 객체(First-Class Object)
1급 객체란 다음과 같은 것들이 가능한 객체를 의미한다.
변수나 데이터 구조 안에 담을 수 있다.
파라미터로 전달할 수 있다.
반환값으로 사용할 수 있다.
할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.
함수형 프로그래밍에서 함수는 1급 객체로 취급받기 때문에 함수를 파라미터로 넘기는 등의 작업이 가능하다. 또한 일반적으로 알고 개발했던 함수들은 함수형 프로그래밍에서 정의하는 순수 함수들과는 다르다는 것을 인지해야 한다.
참조 투명성
동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.(Immutable Data)
명령형 프로그래밍과 함수형 프로그래밍에서 사용하는 함수는 부수효과의 유무에 따라 차이가 있다.
그에 따라 함수가 참조에 투명한지 안한지 나뉘어 지는데, 참조에 투명하다는 것은 함수를 실행해도 어떠한 상태의 변화 없이 항상 동일한 결과를 반환하여 항상 동일하게(투명하게) 실행 결과를 참조(예측)할 수 있다는 것을 의미한다.
예를 들어 함수
f()에 인자x를 넣고f(x)를 실행하게 되면f()는 입력된 인자에만 의존하므로 항상f(x)라는 동일한 결과를 얻게 되는 것이다.부작용을 제거하여 프로그램의 동작을 이해하고 예측을 용이하게 하는 것은 함수형 프로그래밍으로 개발하려는 핵심 동기 중 하나이다.
그리고 이러한 부분은 병렬 처리 환경에서 개발할 때
Race Condition에 대한 비용을 줄여줄 수 있다. 왜냐하면 함수형 프로그래밍에서는 값의 대입이 없이 항상 동일한 실행에 대해 동일한 결과를 반환하기 때문이다.
참고
Last updated