1. 명령형 프로그래밍


// 배열을 파라미터로 받으며, 각 요소에 1을 더해서 새로운 배열을 반환해주는 함수
function addOne (arr) {
    let results = [];
    for(let i=0; i<arr.length; i+=1){
        results.push(arr[i]+1);
    }
    return results;
}

위의 코드는 다음과 같이 말한다.

"나는 addOne 이라는 함수로, arr 배열을 파라미터로 받을꺼야. 우선, results라는 새로운 배열을 선언 한 뒤, arr의 배열 원소들에 1을 더해서 results 배열에 push, 그리고 그 값을 리턴할꺼야"

위의 설명을 보면, 정말 어떻게 할꺼구나! 라는 것을 더욱 느낄 수 있다. 어떤 인자를 어떻게 요리할 것 인지, 그 요리한 값이 어떻게 나오는지.... 가벼운 생각으로 보다보면, '이렇게 하는 코딩 말고 또 뭐가 있는데...?' 란 생각이 들기도 했다.

그렇다면 두번째, 지향하고자 하는 프로그래밍 방식인 선언형 프로그래밍에 대해 알아보자.

2. 선언형 프로그래밍


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

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

위의 설명을 읽어보면 가장 중요한 점은 명령형 프로그래밍 언어와 대비된다 라는 점과, 프로그래머가 실행될 알고리즘을 명시 해주어야 한다, 라는 것이다.

즉 앞선 명령형 프로그래밍은 "HOW" 였다면, 선언형 프로그래밍은 **"WHAT"**이라는 것이다.

위와의 비슷한 예제를 살펴보자.

// 배열을 파라미터로 받으며, 각 요소에 1을 더해서 새로운 배열을 반환해주는 함수
function addOne (arr) {
    return arr.map((i) => i+1);
}

filter, map, reduce 메서드가 어떤 로직으로 구현되는지 우리는 알 필요가 없다. 이미 메서드 안에 서술되어 있기 때문에 우리는 구체적인 절차는 신경쓰지 않고, 추상화된 메서드를 사용하고 싶을 때 선언만 하면 되는 것이다.

따라서 선언형으로 작성된 코드는 영어를 할 수 있다면 의도를 쉽게 파악할 수 있다.