함수형 프로그래밍이란?
'선언형' 프로그래밍으로, 애플리케이션의 상태는 순수 함수를 통해 전달된다.
애플리케이션의 상태가 일반적으로 공유되고 객체의 메서드와 함께 배치되는 OOP(객체 지향 프로그래밍)와는 대조되는 프로그래밍 방식이다.
상태변화와 변경가능한 데이터는 가능한 피하면서 작성하는 프로그래밍
명령형 프로그래밍(절차지향, 객체지향)
- 상태와 상태를 변경시키는 관점에서 연산을 설명하는 방식이다.
- 알고리즘을 명시하고, 목표는 명시하지 않는다.
- '어떻게' 할지 표현한다.
선언형 프로그래밍
- '어떻게' 보다는 '무엇' 을 설명하는 방식이다.
- 알고리즘을 명시하지 않고 목표만 명시한다.
- '무엇'을 할 것인지 표현한다.
함수형 코드는 명령형 프로그래밍이나 OOP 코드보다 더 간결하고 예측가능하여 테스트하는 것이 쉽다.
함수형 프로그래밍은 프로그래밍 언어나 방식을 배우는 것이 아닌, 함수로 프로그래밍하는 사고를 배우는 것이다.
즉, 기존의 사고방식을 전환하여 프로그래밍을 더 유연하게 문제해결 하도록 접근하는 것이다.
장점
- 명료함
- 효율성
- 테스트 용이성
- 병렬처리
파이썬 함수형 프로그래밍 예제
일급함수
조건
- 변수나 데이터 구조 내부에 할당 가능
- 파라미터로 전달 가능
- 반환값으로 사용 가능
- 할당에 사용된 이름과 무관하게 고유하여 구별이 가능
def factorail(n):
if n == 1:
return 1
# 반환값으로 사용됨
return n * factorial(n-1)
# 변수로 할당
fac = factorial
>>> <function factorial at 0x10d30eb10
# 인수로 전달
[fac(i) for i in range(1, 6 if i % 2]
>>> [1, 6, 120]
클로저
외부 함수에 접근할 수 있는 내부 함수 또는 원리를 말한다.
사용에 따라 내부 함수 범위에서 외부 함수 범위의 변수에 접근이 가능하지만 반대로의 실현이 불가능하다.
즉, 외부 함수는 외부 함수의 지역변수를 사용하는 내부 함수가 소멸될 때 까지 소멸되지 않는다.
사용 가능한 메모리 공간이 한정되어 있어 여러 자원이 접근 시 교착상태(dead lock)가 발생할 수 밖에 없는데 이를 위해 동시성 제어가 필요하고 이때 클로저가 유용하게 쓰인다.
def closure_example():
lists = []
def average(v):
lists.append(v)
return sum(lists) / len(lists)
return average
ce = closure_example()
ce(10)
>>> 10
ce(20)
>>> 15
ce(20)
>>> 16.666...
Python의 스코프 규칙(scope rule)
Local -> (enclosed) -> Global -> Built in
고차 함수
일급함수의 부분집합으로 볼 수 있다.
- 함수에 함수를 인수로 전달 가능
- 함수의 반환값으로 함수 사용 가능
순수 함수
함수형 프로그래밍에 꼭 필요한 개념이다.
- 동일한 입력에는 항상 동일한 결과를 반환한다.
- 함수의 시행이 프로그램 전체 실행과는 무관하다. (사이드 이팩트가 없다.)
함수형 프로그래밍은 단순히 함수를 선언해서 데이터를 내가 원하는 방향으로 처리해나가는 함수형 프로그래밍 방식을 볼 수 있다. 한눈에 보더라도 함수형 프로그래밍은 무엇을 구현했는지 명확히 알 수 있다.
객체 지향 프로그래밍 vs 함수형 프로그래밍
- OOP
- 캡슐화를 통해 사이드이펙트를 제어
- FP
- 사이드이펙트를 아예 배제
- No Object 변수를 최대한 지양
'CS' 카테고리의 다른 글
[자료구조] 트리 & 트라이 Tree & Trie (0) | 2023.02.16 |
---|---|
[자료구조] 연결 리스트 Linked list (0) | 2023.02.13 |
HTTP의 GET과 POST (1) | 2023.02.03 |
정규화 Normalization (0) | 2023.02.02 |
13913. 숨바꼭질4 [BAEKJOON / Python] (0) | 2023.01.27 |