Imperative vs Declarative Paradigm

Declarative? Imperative? 많이들 사용되는데 그 뜻은 대체 뭘까? Vue.js는 jQuery보다 declarative하다는데 대체 무슨 의미일까? Declarative Paradigm과 Imperative Paradigm에 대해 간단히 알아보자

위키백과에 따르면 선언형 프로그래밍(Declarative Programming)은 두가지 뜻이 있다.

프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 "선언형"이라고 한다. 예를 들어, 웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사하는 것이지 "어떤 방법으로" 컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니기 때문이다. 이것은 전통적인 포트란과 C자바와 같은 명령형 프로그래밍언어와는 다른 접근방식인데, 명령형 프로그래밍 언어는 프로그래머가 실행될 알고리즘을 명시해주어야 하는 것이다. 간단히 말하여, 명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.

두번째 정의는 다음과 같다고 한다.

프로그램이 함수형 프로그래밍 언어, 논리형 프로그래밍 언어, 혹은 제한형 프로그래밍 언어로 쓰인 경우에 "선언형"이라고 한다. 여기서 "선언형 언어"라는 것은 명령형 언어와 대비되는 이런 프로그래밍 언어들을 통칭하는 것이다.

(2개 인용구 출처: 위키백과-선언형 프로그래밍)

2가지 정의는 겹치는 부분도 있고 서로 다른 부분도 있다고 하는데, 오늘 내가 궁금했던 질문은 첫번째 정의에 가까우므로 “How”보다 “What” 에 집중한다는 첫번째 정의에 입각해 설명해 보고자 한다.

Imperative Paradigm (명령형 패러다임)

절차지향/객체지향 프로그래밍은 명령형 프로그래밍에 해당한다. Java, C, C++ 등 많은 언어들이 명령형 프로그래밍에 해당한다.

컴퓨터에게 일을 시키기 위해 알고리즘을 작성하는 것이 여기에 해당하고, 보통 제어문, 클래스와 인스턴스, 변수 등 우리가 익숙한 프로그래밍 방법이 동원된다.

for i in range(10):
    i * 10
    print(i)

10부터 100까지 10의 배수를 출력하는 예이다.

직접 숫자를 곱하고 출력하는 등 프로그래머가 작성한 알고리즘대로 프로그램은 작동한다.

Declarative Paradigm (선언형 패러다임)

로직, 함수형, 도메인 특화 언어들은 선언형 프로그래밍에 해당한다. HTML, XML, CSS, SQL 등이 해당한다.

Declarative code는 How 보다는 What에 집중한다.

예를들어, HTML로 이미지 태그를 만드는 과정을 생각해보면 이해가 쉽다.

<img src="/image.jpg" />

HTML은 어떤 주소의 이미지를 보여줘야 하는지를 명시하지만, 실제로 그 이미지가 어떤 과정을 통해 화면에 그려질지 구체적인 코드로 묘사하진 않는다.

“이 쯤에 이미지를 넣어줘” 라고 표현하지만, 실제 어떻게 화면에 이미지를 넣을지는 브라우저가 직접 결정하고 진행하는 것이다. 즉 절차적인 알고리즘은 브라우저의 코드가 수행하며, 우리는 단지 “무엇”이 원하는 결과인지 언급하는 식이다.

SQL도 살펴보자.

SELECT COUNT(*) FROM users;

users 테이블의 레코드 수를 세라고 명령했지만, 구체적으로 레코드를 세는 로직을 구현하지는 않고 있다. 실제 레코드를 세는 알고리즘은 DB 소프트웨어에 포함되어 있으며 우리는 어떤 결과만을 명시할 뿐, 실제 절차를 명시하진 않는다.

결론

물론 이 두 분류가 완벽하진 않다. 개인적인 생각을 조금 첨언하자면 이 분류는 상대적인 것 같다.

예를들어, python의 print 함수는 숫자를 콘솔에 출력하지만 구체적인 출력 방법을 프로그래머가 하나하나 규정하고 있지는 않다.

python이 이미 내부적으로 운영체제에서 제공하는 출력 함수를 이용하도록 구현해두었기 때문이다. 어찌 보면 ‘선언형’ 느낌 아니냐는 생각이 들기도 한다. 결국 우리는 콘솔에 숫자가 출력된 ‘결과’만을 명시할 뿐, 운영체제가 모니터의 드라이버에 명령을 하는 단계까지 제어하고 있진 않기 때문이다.

하지만, SQL은 python을 이용한 코딩 스타일에 비하면 확실히 선언형에 가깝다. HTML도 그렇다.

그렇다면, React는 어떠한가? 그렇게 선명하게 어느쪽이라고 말하기는 어려울 것 같다. 하지만 jQuery에 비교한다면 선언형에 가까울 것 같다.

결국 나는 imperative/declarative는 상대적인 개념이라고 이해했다. 비교대상이 있을 때 보다 유의미해지는 표현이 아닌가 싶다.

참고자료 & 볼거리, 읽을거리