컴퓨터 과학에서 명령형 프로그래밍은 선언형 프로그래밍과 반대되는 개념으로, 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 자연 언어에서의 명령법이 어떤 동작을 할 것인지를 명령으로 표현하듯이, 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이다.
설명만으로는 매우 난잡해 보이는데 요약하자면 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이다. 이는 "어떻게 구현하는가"
를 디테일하게 기술하는 것이 관점이다.
아침에 일어나 커피를 마시기 까지의 과정을 예시로 들어보자면
아침에 눈을 뜨고 일어나서 몇 걸음 지나 부엌에 들어가면 커피포트 버튼을 누르고 컵에
커피를넣고....(생략)
이처럼 하나의 일을 어떤 과정을 거쳐서 진행되는가를 풀어 쓴것과 동일하다고 생각된다.
한 정의에 따르면, 프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 선언형
이라고 한다.
예르르들어, 웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 무엇
이 나타나야 하는지를 묘사하는 것이지 어떤 방법으로
컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니기 때문이다.
이것은 전통적인 C, Java 와 같은 명령형 프로그래밍 언어와는 다른 접근 방식으로
명령형 프로그래밍 언어는 프로그래머가 실행될 알고리즘을 명시해주어야 하는 것이다.
간단히 말하면, 명려형 프로그램은 알고리즘을 명시하고 목표를 명시하지 않는 데 반해
선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.
대표적인 선언형 프로그래밍 방식으로는 HTML이 있다.
이는 HTML의 태그에서 쉽게 찾을 수 있는데 우리는 태그를 사용할때 어떤 과정을 코드로 작성하지 않는다. 다만, 무엇
이 나타나야 하는지 만을 작성한다.
배열을 입력받고 요소값에 두배를 적용하는 새로운 배열을 출력해보자
(단, 입력에는 숫자 이외의 값이 있을 수 있다.)
// 명령형 프로그래밍
function double(arr) {
let results = [];
for (let i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number") {
results.push(arr[i] * 2);
}
}
return results;
}
console.log(double([1, 2, 3, "", null, undefined, 11])); // [ 2, 4, 6, 22 ]
우리는 보통 for문
을 통해 "어떻게"
처리하는지에 대해 묘사를 한다.
이는 for문
안에 로직이 점점 쌓이게 만들고 코드의 맥락을 보려면 쌓인 코드 전부를 확인해야한다.
이처럼 규칙성 없는 코드를 작성하다보면 유지보수가 힘들어 진다.
// 선언형 프로그래밍
function double(arr) {
return arr
.filter((element) => typeof element === "number")
.map((number) => number * 2);
}
console.log(double([1, 2, 3, "", null, undefined, 11])); // [ 2, 4, 6, 22 ]
map이라는 메소드의 정해진 규칙에 의해서 현재 배열에서 새로운 배열을 만드는데
"어떤 과정"
을 거쳐서 만들지만 정했다. 즉, "무엇"
을 원하는지에 대한 묘사를 한다.
이처럼 arr
에 있는 값들로 해야 할 작업들을 끊어서 연결하면 명령형 프로그래밍보다 간단하고 명료하게 작성할 수 있다.