본문 바로가기

CS

선언형 프로그래밍과 절차형 프로그래밍

1. 프로그래밍 패러다임

  프로그래밍을 하는 데 있어서의 한 관념이나 체계를 이르는 말이다.

프로그래머에게 프로그래밍의 한 관점을 가지게하며 결정하게 하는 역할을 하게된다. 예시를 하나 들자면 객체지향 프로그래밍은 개발자에게 프로그램을 상호작용하는 객체들의 집합으로 바라보게 한다. 기본적으로 각 언어들은 하나 이상의 패러다임을 지원한다.

 

2. 선언형 프로그래밍

  선언형 프로그래밍은 이론적으로 주로 두 가지로 이야기 되곤 한다.

 

- 프로그램을 어떻게(How) 해야하는지 나타내기보단 무엇과(What) 같은지 표현하는 프로그래밍

- 함수형, 논리형, 제한형 프로그래밍 형태로 작성된 프로그램

 

  즉 어떻게 작동하는지에 대한 부분은 추상화시켜 처리하고 '무엇을'에 집중하는 프로그래밍이 선언형 프로그래밍이라고 할 수 있다.

 

  흔한 예제로 배열 하나는 파라미터로 받아 각 값을 처리하는 함수가 있다.

function add (arr) {
	return arr.reduce((prev, current) => prev + current, 0)
}

 

3. 절차형 프로그래밍

  사실 선언형과 반대되는 개념으로 명령형 프로그래밍을 얘기한다. 명령형 프로그래밍은 선언형과 반대로 무엇(What)보다는 어떻게(How)에 집중하여 프로그래밍한다. 

 

  절차형 프로그래밍은 명령형 프로그래밍과 동의어로 쓰이는 경우가 종종 있지만, 명령형 프로그래밍의 한 종류로 함수의 호출을 통해 추상화와 재사용성을 얻어내는 프로그래밍을 뜻한다. 대표적으로 C언어 있다.

 

  흔히 객체지향 언어와 반대되는 개념으로 생각하는데 이는 조금 틀린말이다. 같은 명령형 프로그래밍의 일종으로 지향하는 점이 다를 뿐이다. 절차형 프로그래밍은 '데이터를 중심으로 함수'를 만들어 쓰고 객체지향 프로그래밍은 '데이터와 함수를 묶어 객체'를 만들어 쓸 뿐이다.

 

  각설하고 사실 이 작성글에서는 절차형과 명령형을 비교하려하기에 절차형 프로그래밍이라고 썼지만 명령형에 대해 좀 더 이야기 해보자.

 

  선언형에서 이야기 했던 예제의 명령형 버전을 가져와 보면 아래와 같은 형태가 된다.

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

 

4. 선언형 vs 명령형

  A에서 B로 간다 가정할 때 명령형은 가는 방법을 일일이 설명한다. 어디서 어떻게 꺾어라, 얼만큼 직진하다가 어디서 뭘 해라 방법을 하나하나 지정하는 것이다. 선언형은 그냥 B의 주소를 알려주고 가라고 하는 형태다.

 

그런데 그렇게 이해하고 위의 예제 코드들을 보면 뭔가 이상하다. 결국 for문의 내용을 함수하나로 처리했을 뿐인데 선언형과 명령형으로 나뉜다고?  사실 이해하기에는 조금 적절치 못한 예제일 수 있다. 그러나 단순히 for문으로 어떻게 할 지 설명한 코드를 함수로 추상화해서 무엇을 할지 정하는 코드로 바뀌었다는 관점으로 보면 차이가 이해될 수 있다.

 

 

-- 참조

https://code-lab1.tistory.com/244

 

[프로그래밍 언어론] 명령형(Imperative)프로그래밍과 선언형(Declarative)프로그래밍

명령형(Imperative) 프로그래밍 명령형 프로그래밍이란 프로그램의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 쉽게 설명하자면, 컴퓨터가 수

code-lab1.tistory.com

https://ko.wikipedia.org/wiki/%EC%84%A0%EC%96%B8%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

선언형 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 선언형 프로그래밍(宣言型 프로그래밍, 영어: declarative programming)은 두 가지 뜻으로 통용되고 있다. 한 정의에 따르면, 프로그램이 어떤 방법으로 해야 하는지를

ko.wikipedia.org