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

명령형 프로그래밍과 선언형 프로그래밍을 찾아보며 어떤 의미인지 찾아봤다.

명령형? 선언형?

명령형 프로그래밍은 무엇을 어떻게 할 것인가에 가깝고,
선언형 프로그래밍은 무엇을 할 것인가에 가깝다.

이 설명은 핵심을 설명한 것이기 때문에 이해가 되었을 때 이 설명을 받아들일 수 있다. 조금 더 자세히 알아보자.


어떻게? 무엇을? 의 차이

1. 길 찾기

세 친구가 대화를 하고 있는데 한 친구가 백화점을 어떻게 가는지 물었다. 이 때 두 친구의 대답은 이렇다.
A : "이 카페에서 나가서 왼쪽으로 30미터 가면 버스 정류장이 나오는데 거기서 ##번 버스를 타고 5정류장을 가서 내려. 그 다음에 오른쪽으로 큰길 따라 50미터가면 백화점 입구야."
B : "백화점 주소는 서울특별시 OO구 O동 OOO로 ### 이야. 지도 어플로 찾아봐"
두 친구의 대답을 보면 A는 '어떻게'에 집중하고 있고 B는 '무엇을'에 집중하고 있다. 여기서 A는 명령형 방식이고 B는 선언형 방식이라고 말할 수 있다.

2. 수동 스틱 자동차와 오토매틱 자동차

수동 스틱 자동차는 직진의 속도를 1단부터 조정하고 후진도 스틱으로 직접 이동하여 운전한다.
오토매틱 자동차는 직진, 후진에 목적에 따른 스틱 이동으로 운전한다.
수동 스틱은 명령형에 가깝고 오토매틱은 선언형에 가깝다.

'어떻게', '무엇을'의 의미

1번 예시에서 B 친구의 주소 정보를 어플로 찾게 되면 어플에서는 명령형의 방법으로 알려준다. 선언형은 명령형으로 구현되어 있는 방법을 추상화한 방법이다. 선언형 방식이 제대로 동작하기 위해서는 명령형으로 "어떻게"가 구현된 것들이 추상화되어 있어야 한다. 명령형이 기반되지 않은 선언형은 성립할 수 없다. 각 방법이 어떻게 추상화 되어있는지 살펴보면
1번 길 찾기는 백화점주소를 입력하면 어플이 모든 명령형 단계를 알고 있다는 가정하고 있다.
2번 자동차는 오토매틱 스틱 운전이 기어 변속 기능을 추상화 한 것임을 가정하고 있다.


명령형 프로그래밍의 예

1. 전체 배열 요소의 합

function sum(arr) {
  let result = 0;
  for (let i = 0; i < arr.length; i++) {
    result = result + arr[i];
  }
  return result;
}

2. 각 배열 요소의 제곱

function squared(arr) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    result[i] = arr[i] * arr[i];
  }
  return result;
}

1번은 반복문으로 전체 배열 요소를 어떤 과정을 통해 더하여 반환하는지 2번은 반복문으로 각 요소를 어떤과정으로 제곱한 배열로 반환하는지 1,2 모두 '어떻게'를 설명하고 있다. 기능 수행의 방법을 단계별로 알 수 있다. 예시 코드는 간단한 코드이기 때문에 과정이 잘 보일 수 있지만 정말 복잡한 코드들의 경우는 단계별로 있어도 코드의 흐름을 파악하기 어려운 경우가 많다. 그렇다면 이 함수가 무슨 기능을 하는지 알기 어렵게 된다. 가독성이 좋지 않게 된다. 이런 점을 선언형으로 바꿔보자.

선언형 프로그래밍의 예

1. 전체 배열 요소의 합

function sum(arr) {
  return arr.reduce((acc, cur) => acc + cur, 0);
}

2. 각 배열 요소의 제곱

function squared(arr) {
  return arr.map(el => el * el);
}

1번은 reduce를 이용했고 2번은 map을 이용했다. reduce, map 모두 명령형의 단계를 추상화한 메소드다. 이런 과정이 선언형에서 중요하다. 이 함수가 어떻게 동작하는지에 보다는 어떤 기능을 하는가에 대해서 설명한다. '어떻게' 보다는 '무엇을' 에 집중한 방법이다. 가독성이 좋다는 장점이 있다.

선언형 프로그래밍의 장점

  1. 가독성이 좋다.
  2. 독립적이다.(현재 상태의 컨텍스트에 의존하지 않는다.)
  3. 재사용성이 좋다.

느낀점

선언형 프로그래밍이 객체 지향과 연관되어 있다는 생각이 어느정도는 맞지만 정확한 이해가 아니었다는 것을 알았다. 중요한 점은 작성하고 있는 코드가 어떤 의미를 가지는지 알고 있어야 한다는 점인 것 같았다. 때로는 명령형으로 작성해야 하는 경우가 있고 선언형으로 작성해야 할 경우가 있다. 현재 자신이 어떤 결과를 원하는지에 따라 방법이 달라질 수 있다. 이런 차이와 의미를 알고 있는 것은 더 좋은 개발을 할 수 있는 토대가 되는 것 같다.

참고자료 링크 : 박스여우

좋은 웹페이지 즐겨찾기