변환의 전파와 데이터 흐름과 관련된 선언전 프로그래밍 패러다임이다.
이렇게 설명하면 정확하게 이해되지 않는다.
명령형 프로그래밍과 선언형 프로그래밍의 차이를 코드를 예로들어보자
List<Integer> numbers = List.of(1, 3, 21, 10, 8, 11);
int sum = 0;
for (int number : numbers) {
if (number > 6 && (number % 2 != 0)) {
sum += number;
}
}
명령형 프로그래밍은 구체적인 알고리즘을 명시하면서 합을 계산한다.
int sum = numbers.stream()
.filter(number > 6 && (number % 2 != 0))
.mapToInt(number -> number)
.sum();
선언형 프로그래밍은 명령형 프로그래밍과 달리 구체적인 알고리즘을 명시하지 않고 선언만을 사용해 해결할 수 있다.
이것도 어찌보면 똑같아 보일 수 있지만, 다르다.
if
나 for
같은 구체적인 제어문들을 직접적으로 사용하지 않고, 최소한의 조건만을 지정해준 뒤 나머지 작업은 filter()
메서드에게 맡기는 것이다.
filter()
나 mapToInt()
를 보면 함수를 전달하고 있다.
자바에서 이렇게 람다 표현식을 사용해서 함수형 인터페이스를 전달하는 것을 함수형 프로그래밍이라고 부른다.
Reactive Programming을 위해 알아야 될 것
Observable
: 데이터 소스리액티브 연산자(Operators)
: 데이터 소스를 처리하는 함수스케쥴러(Scheduler)
: 스레드 관리자Subscriber
:Observable
이 발행하는 데이터를 구독하는 구독자함수형 프로그래밍
: RxJava에서 제공하는 연산자(Operator) 함수를 사용