명령형 프로그래밍과 선언적 프로그래밍 비교

박현상(HyunSang Park)·2020년 10월 9일
5

JavaScript

목록 보기
1/1
post-thumbnail
post-custom-banner

안녕하세요, Learning React을 통해서 React.js를 공부하고 있습니다.

선언적(declarative programming) 프로그래밍이란?

함수형 프로그래밍은 선언적 프로그래밍(declarative programming)이라는 더 넓은 프로그래밍 패러다임의 한 가지입니다.
선언적 프로그래밍은 필요한 것을 달성하는 과정을 하나하나 기술하는 것보다 필요한 것이 어떤 것인지 기술하는 데 방점을 두고 애플리케이션의 구조를 세워 나가는 프로그래밍 구조 입니다.

선언적 프로그래밍을 이해하기 위해 명령형 프로그래밍(imperative programming)과 비교해 보겠습니다.

명령형 프로그래밍(imperative programming)이란?

명령형 프로그래밍은 코드로 원하는 결과를 달성해 나가는 과정에만 관심을 두는 프로그래밍 스타일입니다. 어떤 문자열을 URL에서 사용할 수 있게 만드는 일반적인 작업을 살펴 보겠습니다.
공백은 URL에서 사용할 수 있는 문자가 아니므로 문자열을 URL에서 사용할 수 있게 (URL 친화적으로) 만들려면 모든 공백( )을 하이픈(-)으로 바꿔야 합니다. 우선 명령형 프로그래밍를 어떻게 달성할 수 있는지 예제를 통해서 살펴 보겠습니다.

명령형 프로그래밍 예제

var string = 'THis is the midday show with Cheryl Waters';
var urlFriendly = "";

for(var i=0; i<string.length; i++){
    if(string[i] === " "){
        urlFriendly += "-";
    }else{
        urlFriendly += string[i];
    }
}

console.log(urlFriendly);

이 예제는 문자열의 모든 문자를 루프를 돌면서 공백을 만날 때마다 그 공백을 -로 바꿉니다. 이런 구조의 ㅡ로그래밍은 우리가 원하는 것을 달성하는 방법에만 신경을 씁니다. for루프와 if문을 사용하고 대입연산자(+=)를 사용해 값을 설정합니다. 코드 자체를 간단히 살펴보는 것만으로는 우리가 즉시 알 수 있는 것이 많지 않ㅆ습니다. 명령형 프로그래밈에서 코드 안에서 벌어지는 일을 읽는 사람이 더 잘 이해하도록 돕는 주석을 많이 달아 주어야 합니다.

선언적 프로그래밍 예제

명령형 프로그래밍 예제에서 선언적 프로그래밍 예제로 바꾸어 보겠습니다.

const string = 'This is the midday show with Cheryl Waters';
const urlFriendly = string.replace(/ /g, '-');

console.log(urlFriendly);

여기서 string.replace와 정규식을 사용해서 모든 공백을 하이픈으로 변경합니다.
string.replace를 사용하면 모든 공백이 하이픈으로 변경되어야 한다는 사실을 기술할 수 있습니다.
모든 공백을 하이픈으로 변경하는 자세한 방법은 replace 함수 안에 들어가고, 구체적 절차 대신 replace(치환)라는 함수를 사용해 추상적인 개념을 표현합니다. 선언적 프로그래밍의 코드 구문은 어떤 일이 발생해야 하는지 기술하고, 실제로 그 작업을 처리하는 방법은 추상화로 아랫단에 감추어집니다.

선언적 프로그램은 코드 자체가 어떤 일이 벌어진지 설명하기 때문에 좀 더 추론하기 쉽습니다. 다음 에제는 API에서 멤버를 가져온 다음 어떤 일을 해야 하는지 자세히 기술하겠습니다.

API에서 멤버를 가져온 다음 어떤 일을 해야할까요?

const loadAndMapMembers = compose(
    combineWith(sessionStorage, "members"),
    save(sessionStorage, "members"),
    scopeMembers(window),
    logMemberInfoToConsole("name.first"),
    countMemberBy("location.state"),
    prepStatesForMapping,
    save(sessionStorage, "map"),
    renderUSMap
);

getFakeMembers(100).then(loadAndMapMembers);

선언적 접근 방식이 더 읽기 쉽고, 그래서 더 추론하기 쉽습니다. 각 함수가 어떻게 구현 되었는지는 함수라는 추상화 아래에 감춰집니다. 각각의 작은 함수에는 그 함수가 하는 일을 잘 설명하는 이름을 붙어 있고, 그런 함수들이 조합된 방식을 보면 멤버 데이터를 불러와서 맵에 저장하고 출력하는 과정이 잘 드러납니다. 그리고 그런 과정을 설명하기 위한 주석은 따로 필요 없다. 근본적으로 선언적 프로그래밍은 추론하기 쉬운 애플리케이션을 만들어내며, 애플리케이션에 대한 추론이 쉬우면 그 애플리케이션의 규모를 확장하는 것도 더 쉽기 마련입니다.

참고

profile
🧑🏻‍💻 다양한 소프트웨어를 개발하고 있습니다
post-custom-banner

0개의 댓글