프로그래밍 패러다임에 대해(선언형 vs 명령형)

황준승·2022년 10월 30일
3
post-thumbnail

📌 프로그래밍 패러다임에 대해

프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할 지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서 새로운 방식으로 생각하는 법을 배우고, 이를 바탕으로 코드를 작성한다.

최근 프로그래밍 패러다임은 크게 명령형 프로그래밍, 선언형 프로그래밍으로 구분지을 수 있다.

📌 명령형과 선언형 프로그래밍에 대해

명령형 프로그래밍이란?

프로그래밍의 데이터와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 데이터와 상태를 어떻게 바꿀지 정의하는 프로그래밍 방법이다.
...
프로그래밍 언어는 어떻게 계산을 할지보다는 무엇이 계산될 것인지를 정의한다는 생각으로 작성된다. ...위키피디아

선언형 프로그래밍이란?

프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 선언형이라고 한다.
...
간단히 말하여, 명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.

글만 봐서는 자세히 감이 오질 않으니 예를 통해서 자세한 설명을 해보도록 하겠다.

📌 예시

부모님이 나에게 양치를 하라고 하는 상황을 예시로 한 번 들어보자.

1. 명령형 프로그래밍 예시(HOW)

"화장실로 가서 칫솔을 들고 치약을 칫솔에 묻힌 다음 칫솔에 물을 묻히고 이를 닦을 때는 윗몸부터 아래로 이를 쓸듯이 닦으렴"

2. 선언형 프로그래밍(WHAT)

"준승아 양치 좀 해!!"

위의 예시에서도 알 수 있듯이 명령형 프로그래밍의 경우 양치를 하는 순서, 즉 양치를 어떻게 하는지가 중요하지만 선언형 프로그래밍의 경우 양치를 하는 행위의 결과에 집중한다.

📌 재사용성

명령형 프로그래밍과 선언형 프로그래밍에 대해 다시 한 번 살펴보자.

이번에는 부모님이 나 말고 다른 사람들에게 양치를 시키는 상황에 대해서 한번 생각해보자. 아래 목록은 저희 부모님께서 양치를 시키실 대상이다. (이때 이와 틀니는 다르다고 정의하자.)

  1. 누나
  2. 어금니를 모두 발치해버린 아랫집 총각
  3. 이가 없으셔서 틀니를 끼고 계시는 윗집 할아버지

먼저 명령형 프로그래밍 관점에서 한 번 살펴보자.

  1. 누나 : 부모님께서 명령형 프로그래밍으로 누나에게 양치를 시켜도 아주 충실히 이행할 수 있다.
  2. 아랫집 총각 : 몇 개 없는 이를 가지고도 부모님께서 명령형 프로그래밍으로 아랫집 총각에게 시킨 양치를 아주 충실히 이행할 수 있다.
  3. 윗집 할아버지 : 이가 없으시기 때문에 부모님께서 명령형 프로그래밍으로 시킨 양치는 수행할 수 없다.

이처럼 명령형 프로그래밍 관점에서 보았을 때
부모님의 명령을 들은 사람 중 화장실, 칫솔, 치약, 물, 잇몸 이라는 상태가 주어짖 않는다면 해당 명령을 수행할 수 없게 된다.


다음은 선언형 프로그래밍 관점에서 한 번 살펴보자.

  1. 누나 : 알아서 자율적으로 양치를 잘 수행할 수 있다.
  2. 아랫집 총각 : 알아서 자율적으로 양치를 잘 수행할 수 있다.
  3. 윗집 할아버지 : 이가 없으시더라고 사용하신 틀니를 씻는 행위를 통해서 양치를 충실히 수행할 수 있다.

선언적 프로그래밍 명령을 들은 사람들은 자율적으로 양치(이을 깨끗하게 하는 행위)를 하면 되기 때문에 재사용적인 측면에서 아주 좋습니다. (제약 조건이 명령형 프로그래밍 보다 훨씬 낮다.)

📌 코드

1. 명령형 프로그래밍

// 배열에 파라미터로 받고 각 요소들의 값에 2를 곱하는 함수
function imperative(arr){
  let result = [];
  
  for(let i = 0; i < arr.length; i++){
    result.push(arr[i] * 2);
  }
  return result;     
}
  • 위의 예제에서도 보면 알 수 있듯이 명시적으로 배열을 반복하거나 원하는 기능을 수행하는 방법에 대한 단계(HOW)를 설명하고 있습니다.

  • 위의 for문 예시에서는 모두 상태의 일부를 변경하고 있습니다. result -> 가변적 데이터

  • 위의 코드들은 읽기가 쉽지 않습니다. 즉, 코드의 동작과정을 이해하기 위해서는 순차적으로 어떻게 동작하고 있는지 확인을 해야 정확히 이해할 수 있습니다.

2. 선언형 프로그래밍

function declarative(arr) {
  return arr.map(v => v * 2);
}

javascript의 고차함수 map은 앞서 명령형 프로그래밍 방식이 for문을 추상화한 것입니다.

따라서 우리는 선언형 프로그래밍을 통해서 가변적 데이터로 인한 사이드 이팩트 문제를 발생시키지 않을 수 있고 map함수를 사용함으로써 새로운 배열을 리턴 받을 것이라는 것도 쉽게 이해할 수 있습니다.

📌 마치며

유지보수적인 측면을 고려하여 선언형 프로그래밍이 굉장히 좋다고 생각이 든다. 그리고 특히 개발을 할 때에는 가독성과 재사용적인 측면에서 선언적 프로그래밍을 사용했을 때 엄청난 이점을 가질 수 있을 것이라고 생각한다.

profile
다른 사람들이 이해하기 쉽게 기록하고 공유하자!!

4개의 댓글

comment-user-thumbnail
2023년 2월 21일

재사용성에서 예시가 너무 재밌어요ㅋㅋ
코드로 보니 이해가 쉽네요!! 잘 읽었습니다!

1개의 답글
comment-user-thumbnail
2023년 2월 21일

너무 재미있게 잘 봤어요! 저도 이제 명령형과 선언형을 설명할 수 있을 것 같아요

1개의 답글