객체지향도 어려운데, 반응형, 선언형, 함수형은 대채 뭐야? - 작성중...
흔히 프로그래밍을 처음 접하게 되면 “Hello world” 를 print 하면서 시작한다. 그런 다음 절차적 프로그래밍(procedural programming) 을 시작으로 객체지향 프로그래밍(object oriented programming)으로 넘어간다
객체지향 프로그래밍도 제대로 적용하려면 SOLID 를 지키면서 적절한 요구사항에 적절한 디자인 패턴(Design pattern)이 적용될수 있도록 많은 고민과 검토가 필요하다
이것만 해도 복잡하고 알아야 할게 많은데, 요즘 반응형, 선언형, 함수형 프로그래밍들도 여러 언어나 플랫폼에서 화두로 떠오르고 있다.
안드로이드의 경우 Compose, Databinding 으로 ui 구성 요소를 선언형으로 지원하고 MVVM 구조로 data 의 흐름을 LiveData 나 Flow, RxJava 등을 사용해서 반응형으로 ui 값들을 업데이트 하는 방향을 추천하고 있다.
이를 위해 Kotlin 을 기본 언어로 사용하며, Kotlin 에선 Flow 가 반응형 프로그래밍으로 선언형 프로그래밍을 지원할수 있도록 도와준다.
옛날에는 객체지향 프로그래밍만 하면 뭐든 만사 ok 였는데, 뭐가 이리 종류가 많아 졌을까? 그리고 이게 다 뭐지?
이번 글에선 안드로이드 code base 로 선언형, 반응형 프로그래밍이 대체 무얼 이야기 하는지 알아보려고 한다
프로그래밍 패러다임
프로그래밍 패러다임(이론적인 체계나 틀)은 프로그래머에게 프로그래밍의 관점을 갖게 해 주고, 결정하는 역할을 한다
예를 들어 객체지향 프로그래밍은 프로그래머들이 프로그램을 상호작용하는 객체들의 집한으로 볼수 있게 하고, 함수형 프로그래밍은 상태값을 지니지 않는 함수값(순수 함수)들의 연속으로 생각할수 있게 해준다
스몰토크와 JDK 1.8 이전의 Java가 객체지향 프로그래밍을 지원하고, 하스켈과 스킴은 함수형 프로그래밍을 지원한다
여러가지 패러다임을 지원하는 경우도 있는데, JDK 1.8 이후의 Java 및 요즘 새로 만들어진 언어인 Swift, Go, Kotlin 등이 그 예다.
Java 는 원래 명령형, 객체지향 프로그래밍 패러다임을 따르기도 유명했는데, JDK 1.8 부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 참조, 메서드 참조를 도입했고 선언형 프로그래밍의 장려를 위해 Stream과 같은 표준 API 도 추가했다. 그러나 태생부터 함수형 패러다임을 지원하는 여타 언어들과 달리 여전히 함수를 일급 객체(first class)로 취급하지 않는다 Java 에서 람다식은 함수형 인터페이스를 구현하는 익명클래스의 인스턴스를 생성하며, 좀 더 간단한 표현을 위해 컴파일러의 타입 추론이 동원된다
반응형 프로그래밍, 선언형 프로그래밍, 함수형 프로그래밍은 서로 어떤 연관관계를 갖고 있을까?
먼저 반응형 프로그래밍을 살펴보자.
반응형(Reactive) 프로그래밍
사전적 의미를 찾아보면
컴퓨팅에서 반응형 프로그래밍은 데이터 스트림 및 변경에 대한 전파와 관련된 선언적 프로그래밍 패러다임이다.
이 패러다임을 사용하면 array 같은 정적 데이터 스트림 이나 event emitter 같은 동적 데이터 스트림을 쉽게 표현할수 있으며 연결된 실행 모델 내에 추론된 의존성을 전달하여 데이터 흐름의 자동 전파를 용이하게 합니다.
라고 하는데, 쉽게 말하면 data 의 변경을 observer 패턴으로 각 의존성이 있는 모듈에게 전파하도록 구현하는 방법이다.
수도코드로 비교해 보면 명령형 프로그래밍의 경우
val a = 1
val b = 2
val c = a + b
b = 10
log(c) // 여기서 3이 출력
반응형 프로그래밍의 경우는
val a = 1
val b = 2
// $= 는 a 나 b 의 값이 변경되면, 그 값이 c 에 할당되는 형태를 말함 (즉, 보통 데이터 변경 + 옵저버 패턴으로 전파의 구조이다)
val c $= a + b
b = 10
log(c) // 여기서 11이 출력
출처: https://en.wikipedia.org/wiki/Reactive_programming