선언형 프로그래밍 알아보기
About declarative programming
https://speakerdeck.com/cozzin/seoneonhyeong-peurogeuraeming-alabogi
Combine에 대한 첫 번째 영상을 보다가 ‘declarative’ 라는 말에 호기심이 생겼습니다. SwiftUI에 대한 설명에서도 본적있어서, 선언적(declarative)이라는 것이 이번 변화의 큰 흐름일 수도 있겠다는 생각이 들었습니다. 반대 의미인 명령형 프로그래밍을 함께 보면서 개념을 정리하겠습니다.
Combine에 대한 첫 번째 영상을 보다가 ‘declarative’ 라는 말에 호기심이 생겼습니다. SwiftUI에 대한 설명에서도 본적있어서, 선언적(declarative)이라는 것이 이번 변화의 큰 흐름일 수도 있겠다는 생각이 들었습니다. 반대 의미인 명령형 프로그래밍을 함께 보면서 개념을 정리하겠습니다.
Example
실생활
정자역에서 네이버로 갈 때를 예를 들어보겠습니다. 두가지 방법으로 접근할 수 있습니다.
- 명령형
횡단보도까지 약 99m 이동(성남대로331번길) ,
횡단보도를 이용하여 경기성남분당경찰서 방면으로 횡단,
횡단보도까지 1개의 횡단보도를 지나 약 612m 이동,
횡단보도를 이용하여 메르세데스벤츠코리아더클래스효성분당전시장 방면으로 횡단,
네이버까지 약 50m 이동(불정로). - 선언형
출발: 경기도 성남시 분당구 성남대로 333,
도착: 네이버 주소는 경기도 성남시 분당구 불정로 6.
명령형은 어떻게 할 것인지 설명하고 있고(how), 선언형은 무엇을 할 것인지 정의합니다(what). 선언형에서는 구체적인 문제 해결 방법이 나와있지 않습니다. 위의 예제에서 선언형의 경우 GPS 같은 것을 가지고 있어서, 목적지까지 가는 방법을 알고 있을 것을 가정합니다. 선언을 해두면, 명령형 layer가 접근할 것임을 내포하고 있습니다.
프로그래밍
<article>
<header>
<h1>Declarative Programming</h1>
<p>Sprinkle Declarative in your verbiage to sound smart</p>
</header>
</article>
여러 설명글에서 HTML을 사용한 프로그래밍을 선언형 프로그래밍의 대표적인 예로 들고 있습니다. HTML로 선언해두면, 브라우저의 알고리즘을 통해 화면을 그려줍니다.
- 명령형: C, C++, Java
- 선언형: SQL, HTML
- 혼합: JS, C#, Python
그렇다면 명령형 언어를 사용할 때는 선언적인 프로그래밍을 할 수 없을까? 다행히 명령형 언어에서도 선언형 프로그래밍이 가능합니다. 비선언형 부분을 캡슐화 해서 선언적인 방식으로 만들 수 있습니다. DSL(Domain-specific language)의 형태로 자주 사용됩니다. 전체 시스템을 선언적이라 할 수는 없지만, 상위 레이어로 갈 수록 선언적인 특징을 가질 수 있습니다.
장단점 비교
단점
선언형 프로그래밍 자체의 단점은 아직 발견하지 못했습니다. 다만 DSL을 직접 작성해서 사용할 때의 단점은 있습니다. 기존 언어를 특성화 시켜서 사용한 것이기 때문에 필요한 기능 추가, 수정이 발생할 때마다 작업을 해줘야 합니다. 그리고 잘못된 방식으로 설계할 경우, 오히려 기존 언어를 사용할 때보다 더 복잡해지는 단점이 있습니다.
장점
- 가독성
- 재사용성
- 오류 복구: 특정 부분만 오류 체크할 수 있음
- 참조 투명성: 다른 시스템에 영향을 주지 않음
- 대체 가능성
결론
명령형 언어를 사용하고 있더라도, 레이어의 분리를 통해 선언형 프로그래밍을 추구할 수 있습니다. 특별히 이번 WWDC 2019 에서 발표된 SwiftUI, Combine도 선언적인 특징을 가지고 있다고 합니다. 적극적인 도입을 통해서 유지보수하기 좋은 코드를 얻을 수 있으면 좋겠습니다. 추가적으로 Combine의 선언적인 특징은 다른 글에서 다루도록 하겠습니다.