- 무명의 리터럴로 생성할 수 있다. (함수 이름 없이)
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환 값으로 사용할 수 있다.
-
명령형 프로그래밍(절차지향 프로그래밍, 객체지향 프로그래밍 등...)
: 프로그램은 명령의 수행. how to에 초점.
어떻게 구현해 낼까?
-
선언형 프로그래밍**(함수형 프로그래밍)**
: 프로그램은 함수의 계산이다. what에 초점.
무엇을 이어붙이면 이게 구현이 될까?
함수형 프로그래밍 언어
- Haskell, F#, OCaml, Erlang
함수형 프로그래밍을 지원하는 언어
-
JS, Kotlin, Go, Python, Rust, Java(new), C++(new), Scala
-
특징
-
순수함수(Pure function)
함수에서 외부의 상태값을 참조하거나 변경하지않는 함수.
동일한 인자에 대해서는 항상 같은값을 반환
언제 선언했는지는 함수에 영향주지 않아야함
-
비상태(Stateless), 불변성(Immutability)
함수의 인자로 전달된 데이터를 변경하지 않아야함
새로운 오브젝트를 만들어 결과값으로 전달해야함
→ 함수를 호출하면 외부의 상태가 변경되거나 예상하지 못한 에러가 발생하는 등의 side effect를 방지할 수 있음
여러 동시다발적 멀티쓰레딩 환경에서도 안정적으로 동작
Object.freeze() ⇒ 불변성으로 만들어주는 함수
-
if, for, switch등을 사용하지 않음(Expressions Only)
ex) for을 쓰는 대신에 배열함수를 쓴다던지..
Q. 이과 학생중 상위 3명 추려서 이름(학과) 출력하는 코드로 구현하려면?
-
일급함수(First-class), 고차함수(higher-order funtions)
일급함수 : 일급객체인 함수
고차함수 : 함수 자체를 인자로 전달하거나 함수에서 또 다른 함수를 리턴하는 함수
-
-
장점
개발자가 프로그램을 읽기 좋다. 가독성이 높다
상태를 바꾸지 않으므로 스레드 안정성이 높다
Lock을 쓰지않아 병목현상 없다
코어가 많아질수록 유리하다
-
함수형 프로그래밍은 새로운 개념일까?
1958년에 LISP라는 최초의 함수형 프로그래밍 언어가 나옴
-
함수형 프로그래밍에서 사용하는 타입들 Monad, Semigroup, Applicative, Monaid, Functor, Disjunction, ... (매우어려움)