클로저 (Clojure)
, 스칼라 (Scala)
, 하스켈 (Haskell)
등이 있고, 최근 Javascript
, Kotlin
, Python
에도 문법이 추가되었다.Java
의 stream()을 사용하여 구현할 수 있다.부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.
아래의 변화 / 변화가 발생하는 작업
다음의 것들이 가능한 객체
if
,switch
,for
등 명령문을 사용하지 않고 함수형 코드로 사용해야한다.위의 부수 효과들을 제거한 함수들
함수형 프로그래밍에서 사용하는 함수
동일한 입력에는 항상 같은 값을 반환하는 함수
- 예를 들어, a를 입력으로 받았을 때 전역 변수인 b를 참조하여 연산한다면 전역 변수의 값에 따라 다른 값을 출력하기 때문에 순수 함수가 아니다?
함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
console.log(sum(1+2));
높은 수준의 추상화를 제공한다
함수 단위의 코드 재사용이 수월하다
불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다
순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다
함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다
순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다
public class WordProcessTest {
private final List<String> words = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");
@Test
void wordProcessTest() {
String result = words.stream()
.filter(w -> w.length() > 1)
.map(String::toUpperCase)
.map(w -> w.substring(0, 1))
.collect(Collectors.joining(" "));
assertThat(result).isEqualTo("T H A N K");
}
}