우연히 보게 된 짧은 영상에서 개발자로서 좀 더 좋은 프로그래밍을 위해서는 명령형(Imperative) 프로그래밍아 아닌 선언형(Declarative) 프로그래밍을 해야 한다는 내용을 보게 되었습니다. 갑작스러운 호기심으로 해당 내용을 살펴보니 프로그래밍 패러다임의 큰 줄기 가운데 하나인 것을 알게 되었습니다. 적어도 개념은 이해해야겠다는 생각으로 인터넷을 뒤져보니 좀 더 깊이 있는 내용들이 많이 있었습니다. 여기서는 간단하게 요약만 하고 좀 더 깊은 내용은 아래 첨부한 출처의 원문들을 차분히 읽어볼 것을 추천드립니다.
1. 선언형 프로그래밍, 명령형 프로그래밍이란?
선언형과 명령형에 대해서 명확하게 이해하는 것은 좀 더 많은 예제외 코드와 프로그램을 비교해봐야 가능할 것 같습니다. 좀 더 단순하고 빠르게 접근하려면 아래의 표를 읽어보며 양쪽을 좀 더 꼼꼼하게 비교하면서 이해하는 것이 좋다는 생각이 듭니다.
선언형 (Declarative) 프로그래밍 | 명령형 (Imperative) 프로그래밍 |
WHAT (무엇을) 할 것인가? | HOW (어떻게) 할 것인가? (무엇을) 어떻게 할 것인가? |
무언가를 작업하기 위한 방법을 (무엇) 정의 | 무언가를 작업하기 위해 어떻게 진행할 것인지를 (어떻게) 나열 |
현실적 예 | 현실적 예 |
식당에서 자리 찾기 - 네 명이 앉을자리를 부탁해요 |
식당에서 자리 찾기 - 저 쪽 테이블이 비어있네요. 우리는 저쪽으로 가 저 테이블에 앉겠습니다. |
초콜릿 케이크 만들기 1. 오븐을 180도로 예열해야 합니다. 2. 그릇에 마른 재료를 섞어야 합니다. 3. 마른 재료가 섞이면, 혼합물에 젖은 재료를 넣고 함께 섞어 케이크 반죽을 만듭니다. 4. 오븐과 반죽이 준비되면 반죽을 팬에 넣고 30분간 굽습니다. 5. 구운 후에는 오븐에서 팬을 꺼내 10분 동안 식혀야 합니다. 6. 마지막으로 팬에서 케이크를 꺼내 얼려야 합니다. 7. 준비 됬나요? 시작 |
초콜릿 케이크 만들기 1. 먼저 오븐을 켜서 180도로 예열합니다. 2. 다음으로 큰 볼에 밀가루, 설탕, 코코아 가루, 베이킹 소다, 소금을 넣고 패들로 저어줍니다. 3. 그런 다음 혼합물에 우유, 식물성 기름, 계란, 바닐라 빈을 넣고 잘 섞일 때까지 중속으로 섞어줍니다. 4. 큰 케이크 팬에 케이크 반죽을 골고루 뿌린 다음 약 30분간 굽습니다. 5. 냄비 홀더를 사용하여 오븐에서 팬을 제거하고 10분 동안 식힙니다. 6. 마지막으로 두드려서 팬에서 케이크를 꺼내고 초콜릿 프로스팅으로 고르게 프로스팅 합니다. |
마트에서 집까지 찾아가기 (WHAT) - 집 주소는 298 West Immutable Alley, Eden, Utah 84310 |
마트에서 집까지 찾아가기 (HOW) - 주차장 북쪽 출구로 나와서 좌회전 해 - 12번가 출구에 도착할 때까지 I-15 북쪽 도로를 타야해 - 거기서 IKEA에 가는 것처럼 출구에서 우회선을 해 - 거기서 직진하다가 첫 번째 신호등에서 우회전을 해 - 그 다음 나오는 신호등을 통과한 후 좌회전을 해 - 우리집은 #298이야 |
그림이 필요해 - 이런 그림을 그려주세요. |
그림이 필요해 - 이 그림을 그리려면 어떻게 해야해? |
선언형... | 명령형... |
- 제어 흐름을 명시적으로 지정하지 않고 프로그램이 수행하는 작업을 설명 - 제어흐름을 설명하지 않고 계산 논리를 표현 |
- 프로그램의 상태를 변경하는 각 명령(또는 명령문)을 단계별로 명시적으로 지정하여 프로그램이 어떤 작업을 수행해야 하는지 설명 - 프로그램의 단계별 상태를 변경하는 명령문을 사용 |
많은 선언적(Declarative) 접근 방식들의 기반에는 일종의 '명령적(Imperativ) 추상화'가 존재한다. | |
선언적 언어 | 명령적 언어 |
SQL, HTML Javascript, C#, Python |
C, C++, JAVA Javascript, C#, Python |
2 선언형(Declarative) 프로그래밍 vs 명령형(Imperative) 프로그래밍 예제
2.1 선언형(Declarative) 프로그래밍 예제
-- SQL
SELECT * FROM user_table FROM country='Korea';
<!-- HTML -->
<article>
<header>
<h1>Declarative Programming</h1>
<p>Sprinkle Declarative in your verbiage to sound smart</p>
</header>
</article>
2.2 명령형(Imperative) 프로그래밍 예제
// Java
// 숫자 배열을 받아서 해당 배열의 모든 원소들을
// 더한 값을 반환하는 'add'함수 작성
public static int add (int[] arr) {
int result = 0;
for (int i = 0; i < arr.length; i++){
result += arr[i];
}
return result;
}
2.3 Javascript 프로그래밍 예제
javascript는 명령형 프로그래밍과 선언형 프로그래밍 두 가지 방법 모두 사용할 수 있습니다. 아래의 예제는 배열을 받아서 해당 배열의 모든 원소를 더한 값을 반환하는 단순한 함수의 예제입니다. 명령형의 경우 한 줄 한 줄 차례로 실행하는 코드를 작성한 반면, 선언형의 경우에는 코드의 길이도 줄어들고, 가독성이 좀 더 좋은 코드를 작성할 수 있습니다.
Javsscript Declarative Programming
// 숫자 배열을 받아서 해당 배열의 모든 원소들을
// 더한 값을 반환하는 'add'함수 작성
function add (arr) {
let result = 0
for (let i = 0; i < arr.length; i++){
result += arr[i]
}
return result
}
Javascript Imperative Programming
// 숫자 배열을 받아서 해당 배열의 모든 원소들을
// 더한 값을 반환하는 'add'함수 작성
function add (arr) {
return arr.reduce((prev, current) => prev + current, 0)
}
출처
함수형 프로그래밍 이해하기 (7부 시리즈 : 5부 선언형 vs 명령형)
https://dev.to/ruizb/declarative-vs-imperative-4a7l
선언형 vs 명령형 프로그래밍
https://ui.dev/imperative-vs-declarative-programming
https://iborymagic.tistory.com/73 (번역본)
선언형 프로그래밍과 명령형 프로그래밍 : 내가 React에 대해 생각했던 잘못된 방식
https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2
위키피디아 : Declarative Programming
https://en.wikipedia.org/wiki/Declarative_programming
명령형 프로그래밍 vs 선언형 프로그래밍 - 뚝딱뚝딱 프론트엔드
명령형 프로그래밍 vs 선언형 프로그래밍 - 박스여우
https://boxfoxs.tistory.com/430
'Dev. Handbook > Tech, Trend' 카테고리의 다른 글
[Design Pattern] 디자인 패턴 개요, 역사 및 종류 알아보기 (0) | 2022.06.02 |
---|---|
Web Server, WAS, CGI, Web Container, Java SE, Java EE, Jakarta EE (0) | 2022.05.29 |
댓글