명령형 프로그래밍과 선언형 프로그래밍

1. 상황으로 보는 명령형, 선언형 프로그래밍

1-1. 레스토랑

일행과 함께 레스토랑에 도착했다. 문을 열고 들어서니 종업원에게 인사를 한 뒤 아래와 같이 말한다.

  • 명령형 방식: "저기 창가 쪽 자리가 비었네요. 저 자리로 걸어가서 앉을게요."

  • 선언형 방식: "두 명 앉을 자리 부탁해요."

간단한 첫번째 상황이다. 명령형 방식은 어떻게(How) 앉을 것인지에 대해서, 선언형 방식은 무엇을(What) 원하는지를 말한다.

1-2. 길묻기

누군가가 당신에게 롯데타워는 어디에있나요? 그러자 아래와 같이 말한다.

  • 명령형 방식: "쭉 직진 후 사거리에서 우회전 하세요. 그대로 직진하다가 세븐일레븐 편의점이 보이면 좌회전을 하면 됩니다."

  • 선언형 방식: "서울 송파구 올림픽로 300에 있습니다."

두번째 상황 역시 간단하다. 명령형 방식은 롯데타워에 어떻게(How) 가는지에 대해서, 선언형 방식을 어떤(무엇/What) 곳에 가야하는지를 말했다.


2. 명령형(Imperative) 프로그래밍

명령형 프로그래밍은 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 일상에서 명령이라는 것이 어떤 동작을 할 것인지를 표현하듯이, 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓는 것이다.

쉽게 생각해 어떻게(How) 그것을 해결할 것인가에 초점을 둔 프로그래밍이다.


3. 선언형(Declarative) 프로그래밍

선언형 프로그래밍은 두 가지 뜻으로 사용된다.

  1. 프로그램이 어떤 방법으로 해야 하는지를 나타내기 보다는 무엇과 같은지를 설명하는 경우에 선언형이라고 한다.

    • 웹 페이지는 대표적인 선언형이다. 웹 페이지는 어떤 방법으로 컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니라 제목, 글꼴, 본문, 그림과 같이 무엇이 나타나야 하는지를 묘사한다.

  2. 프로그램이 함수형 프로그래밍 언어, 논리형 프로그래밍 언어, 혹은 제한형 프로그래밍 언어로 쓰인 경우 선언형이라고 한다.

3-1. 선언형 프로그래밍과 추상화

위의 예시로 돌아가보자.

첫번째 예시에서 종업원은 자리를 안내할 방법을 알고 있어야 한다. 그리고 두번째 예시에서 길을 물어본 사람은 내비게이션을 가지고 있어야 한다. 그래야 주소만 알려줘도 잘 찾아갈 수 있기 때문이다. 하지만 우리(프로그래머)는 이를 신경을 쓰지 않아도 된다.

이렇듯 많은 선언형 접근 방식은 명령형으로 구현된 것들이 추상화되어 있어야 한다.

다양한 배열의 고차 함수를 생각해보자. 우리는 각각의 고차 함수들이 내부에서 어떤 동작을 하는지에 대해서 큰 관심이 없다. 다만 필요한 상황에 맞게 알맞은 고차 함수를 사용하면 그만이다.

무엇을 원하는지에 집중하자. 그리고 명령형 방법으로 추상화 된 것(예를들면, 배열의 여러 메서드)을 적절히 사용하여 원하는 것을 해결하자.


4. 코드로 살펴보는 명령형, 선언형 프로그래밍

배열을 인자로 받고 각 요소들의 값에 2를 곱하는 함수를 선언형 방식과 명령형 방식으로 구현해보자.

4-1. 명령형 방식의 코드

function double(arr) {
  let results = [];
  for (let i = 0; i < arr.length; i++) {
    results.push(arr[i] * 2);
  }
  return results;
}

명령형 방식의 코드를 보면 어떻게 배열의 각 요소들의 값에 2를 곱하는지를 설명하는 식으로 작성되었다.

4-2. 선언형 방식의 코드

function double(arr) {
  return arr.map((item) => item * 2);
}

선언형 방식의 코드를 보면 배열의 각 요소들에 2를 어떻게 곱하는지 보다는 "map() 메서드를 실행한다." 라는 것과 같이 무엇을할지만 작성되었다. 우리는 map() 메서드의 내부가 어떻게 되어있는지 모르지만, 그것을 신경 쓸 필요없다. 마치 우리는 해야 할일만 나열할 뿐, 나머지는 내장 메서드가 도와주는 것 같다.


5. 선언형 언어의 장점

  1. 가독성이 높다.

  2. 재사용성이 높다.

  3. 작동 순서를 구체적으로 작성하지 않아서 오류가 적다.


6. Conclusion

현재 나는 자바스크립트의 내장 메서드를 사용하느냐 하지 않느냐에 따라 선언형 방식, 명령형 방식으로 나눈다고 이해했다. 이렇게 간단하게 정의를 내리는 것보다 더 큰 의미가 있다고 생각한다. 이를 우테코 기간에서 알아가보자. 많은 코드를 고민하고 여러 피드백을 받으면 자연스럽게 습득할 수 있지 않을까? 우테코 미션을 생각해본다면 난 주로 선언형 방식으로 코드를 작성한 것 같다. 자동차 경주 미션에 for문이 존재하는데 이를 2차 미션에서 선언형으로 바꾸어 볼려고 한다. 공부를 하면 할수록 더욱 심오한 프로그래밍 세계로 가는 것 같아 즐겁다!


참고

위키백과 - 명령형 프로그래밍 위키백과 - 선언형 프로그래밍 [프로그래밍 언어론] 명령형(Imperative)프로그래밍과 선언형(Declarative)프로그래밍 [프로그래밍 언어] 선언형 언어


📅 2023-02-11

Last updated