[programmers] TIL_DAY-12

김민기·2022년 4월 1일
0

Programmers_TIL

목록 보기
12/21
post-thumbnail

🗒목차

  1. 명령형 프로그래밍

  2. 선언형 프로그래밍

  3. 정리

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

위키백과에서 정의하는 명령형 프로그래밍은 다음과 같다.

컴퓨터 과학에서 명령형 프로그래밍(命令型 프로그래밍, 영어: imperative programming)은 선언형 프로그래밍과 반대되는 개념으로, 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 자연 언어에서의 명령법이 어떤 동작을 할 것인지를 명령으로 표현하듯이, 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이다.

[위키백과]명령형 프로그래밍

 무슨말인지 모르겠다, 다시 한번 살펴본다. 명령형 프로그래밍에 대해서 검색을 하다보면 선언형 프로그래밍과 비교해서 항상 다음과 같은 정의를 찾을 수 있다.

명령형 프로그래밍은 무엇을 어떻게(How) 할 것인가?, 무엇을 어떻게(How) 구현하는가에 초점을 맞춘다.

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

 어떤 요리의 레시피가 있다고 생각했을 때, 그 레시피는 요리의 완성을 위한 단계마다 지시 사항들이 있다. 그리고 요리의 상태는 원재료부터 시작해서 완성된 요리로 변화한다.
요리의 레시피를 프로그램으로 생각하면, 프로그램의 실행을 위한 단계별 지시사항이 있고, 프로그램의 상태는 초기부터 단계를 거치며 완성의 상태로 변화한다.

즉, 어떻게 구현할 것인가?! 이것이 명령형 프로그래밍의 관심사이다.

선언형 프로그래밍

선언형 프로그래밍에 대해서 위키백과에서 검색하면,

한 정의에 따르면, 프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 "선언형"이라고 한다.
예를 들어, 웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사하는 것이지 "어떤 방법으로" 컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니기 때문이다.
이것은 전통적인 포트란과 C, 자바와 같은 명령형 프로그래밍 언어와는 다른 접근방식인데, 명령형 프로그래밍 언어는 프로그래머가 실행될 알고리즘을 명시해주어야 하는 것이다.
간단히 말하여, 명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.

[위키백과]선언형 프로그래밍

 역시나 이해하기 힘들다...좀 깔끔하게 정의해주면 안되나요

마찬가지로 선언형 프로그래밍을 검색하면 다음과 같은 정의를 찾을 수 있다.

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

 위키 백과에서 나오는 웹 페이지는 HTML을 말한다. HTML은 대표적인 선언형 프로그래밍 방식이다. (프로그램 언어 X)

 웹 문서에서 우리가 작성하는 태그가 랜더링 되는 과정은 우리가 알 필요가 없다. 그저 원하는 태그를 작성하면(선언) 브라우저가 알아서 랜더링한다. 즉, 우리가 원하는 태그(목표)를 명시하고 브라우저가 랜더링하는 동작(알고리즘)은 명시하지 않는다.

즉, 선언형 프로그래밍은 무엇(What)을 할 것인가에 초점을 맞춘다.

 HTML예시 뿐만아니라 아까의 요리 레시피로 돌아가서, 선언형 프로그래밍일 경우, 우리는 간단히 우리가 어떤 요리(What)를 만들 것인지 선언하고, 그 요리의 조리과정은 알지 못한다.

📍 주의할 점은, 우리가 선언형 프로그래밍 방식을 사용한다고 해서 그 처리 과정을 몰라도 된다는 뜻은 아니다. 또한 단순히 고차함수를 사용한다고 해서 선언형 프로그래밍 방식이 되지 않는다. 명령형 프로그래밍과 선언형 프로그래밍은 사고 방식의 전환이 필요하기 때문에 고차함수를 사용함으로써 처리 방법을 모른채로 코드를 작성한다고 선언형 프로그래밍 방식이 되지는 않는다.

📍 고차함수에 없는 동작(알고리즘)은 어떻게 처리할 것인가? 필요하다면 알고리즘을 작성해서 원하는 동작이 발생하도록 만들어야한다. 이 과정에서 고차함수를 사용했다는 것이 중요한게 아니라 어떤 목적을 달성하기 위해 프로그램의 목적을 달성하기 위해서 사고 방식을 선언적으로 사용하는 것이 중요하다.

자바스크립트로 비교하기

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

// 선언형
function doulbe(arr) {
  return arr.map((item) => item * 2);
}

 두 방식을 비교해보면 명령형의 경우 결과의 상태를 저장하기 위한 배열을 사용하고, for문을 수행하면서, 결과의 상태가 변화하고 최종적으로 그 결과를 반환한다.

 반면 선언형의 경우 map 함수를 사용해서 새로운 배열을 만들고,배열을 순회하면서 배열의 값들을 두배로 만들고 새로운 배열에 저장한다.

 만약 조건이 추가된다면, 명령형의 for문은 조건문이 추가될 것이고 선언형은 조건에 맞는 함수를 추가할 것이다.

명령형은 수행할 단계를 나열하고, 선언형은 무엇을 하고 싶은지 나열한다.

정리

 벌써 2주가 지났다. 늘어난게 살뿐이다... 오늘 배운 명령형과 선언형 프로그래밍 방식을 배우며 왜 검색했을 때 명확한 결과가 나오지 않는지 조금은 이해하게 되었다. 결과적으로 사고방식의 전환이며, 프로그램의 자세한 단계를 설명하지 않는다고 선언형이 될 수 없고 선언형으로 프로그래밍 할 수 있도록 코드를 작성하는 능력을 키워야 한다는 것을 느꼈다.

0개의 댓글