functional programming 은 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나입니다.

함수형 프로그래밍

functional programming의 특징은 아래와 같습니다.

  • 순수 함수 (pure function)
  • 익명 함수 (anonymous function)
  • 고계도 함수 (high order function)

순수 함수

순수한 함수는 부작용이 없는 함수 입니다. 외부 요인에 영향을 받지 않고 입력값에 따라 그에 맞는 결과 값을 반환하는 함수를 말합니다.
아래의 예에서는 queue 의 상태 값에 따라 다양한 결과가 반환할수 있습니다. addByQueue method 는 순수 함수가 아닙니다.

public int addByQueue(){
	int x = queue.pop();
	int y = queue.pop();

	return x + y;
}

add() method 는 x, y 입력값에 따라서 항상 일정한 값을반환하는 순수 함수입니다.

add(2, 2) // 4 return add(3, 5) // 8 return

public int add(x, y){
	return x + y;
}

## 익명 함수

javascript 익명 함수의 예입니다.

(() => console.log('annonymous function!'))

이러한 함수를 이름값 없이 표현한 함수 입니다.

var f = function hello(){
	console.log('non-annonymous function!');
}
(x: Int) => x + 1
(x: Int, y: Int) => "x + y = " + (x+y) + "."

고계 함수 고계 함수는 입력값과 반환값을 함수로 입력하고 반환받을 수 있는 형태의 함수를 말합니다. 즉, 함수 또한 value로 여깁니다.

고계도 함수의 javascript 예입니다. map() 의 parameter로 value => console.log(\value +2 : ${value + 2}`) );` 형태의 함수형 parameter가 대입되었습니다.

[1, 3, 5, 7, 9].map(value => console.log(`value + 2 : ${value +2}`) );

고계도 함수의 java 예입니다. java 에서는 java8 부터의 @FunctionalInterface를 이용해 고계함수의 표현이 가능해 졌습니다.

filters -> s > 2 , maps -> s * s, forEachs -> System.out.println(s)

java method 에 익명함수가 대입되었습니다.

IntStream.of(1, 2, 3, 4, 5)
		.filter(s -> s > 2)
		.map(s -> s*s)
		.forEach(s ->System.out.println(s));

java Function<T, R> interface로 함수를 반환 받을 수 있습니다.

Function<Integer, String> f = (s) -> "[" + s + "]";

f.apply(3); // return "[3]"
f.apply(12); // return "[12]"

출처