선언형 프로그래밍
본 서비스가 제공하는 내용 및 자료가 사실임을 보증하지 않습니다. 시스템은 언제나 실수를 할 수 있습니다. 중요한 의사결정 및 법리적 해석, 금전적 의사결정에 사용하지 마십시오.
선언형 프로그래밍은 컴퓨터 프로그램이 '어떤 방법으로' 작업을 수행할지보다 '무엇'이 나타나야 하는지를 설명하는 방식이다. 이는 실행될 알고리즘을 구체적으로 명시해야 하는 명령형 프로그래밍과 대비되는 개념으로, 목표를 명시하되 세부적인 제어 흐름은 직접 기술하지 않는다. 함수형 프로그래밍, 논리형 프로그래밍, 질의 언어 등이 이 범주에 속한다.
개요
선언형 프로그래밍은 크게 두 가지 정의로 통용된다. 첫째는 프로그램이 어떤 방법으로 동작해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우이다. 예를 들어 웹 페이지를 구성하는 HTML은 제목, 글꼴, 본문 등 '무엇'이 나타나야 하는지를 묘사할 뿐, 이를 화면에 출력하는 구체적인 방법은 명시하지 않는다. 둘째는 함수형, 논리형, 제한형 프로그래밍 언어로 작성된 프로그램을 통칭하는 의미로 사용된다.
명령형 프로그래밍이 알고리즘을 명시하고 목표를 명시하지 않는다면, 선언형 프로그래밍은 목표를 명시하고 알고리즘을 명시하지 않는다는 점에서 차이가 있다.
명령형 프로그래밍과의 비교
명령형 프로그래밍과 선언형 프로그래밍의 주요 차이점은 다음과 같다.
| 구분 | 명령형 프로그래밍 | 선언형 프로그래밍 |
|---|---|---|
| 초점 | 어떻게(How) 수행할 것인가 | 무엇(What)을 할 것인가 |
| 상태 변화 | 구문을 통해 프로그램 상태를 변화시킴 | 프로그램의 논리에 집중함 |
| 주요 요소 | 조건문, 반복문, 알고리즘 | 관계, 함수, 데이터의 기준 |
| 예시 언어 | C, C++, Java, PHP | SQL, HTML, Haskell, CSS |
주요 유형 및 언어
선언형 프로그래밍은 적용 분야에 따라 다양한 형태로 나타난다.
- 질의 언어(Query Languages): SQL이 대표적이다. 원하는 자료를 찾기 위한 기준만 제시하며, 데이터베이스가 실제로 자료를 찾는 방법은 명시하지 않는다.
- 마크업 언어(Markup Languages): HTML은 순서대로 일어나는 사건이 없으므로 전형적인 선언형 언어에 해당한다. 다만 자바스크립트가 추가되어 순차적인 화면 변화가 발생하면 순수성을 잃게 된다.
- 함수형 프로그래밍: 연산의 순서를 정의하기보다 함수의 입력과 출력을 연결하여 결과를 도출한다. Haskell, Lisp 등이 이에 속한다.
- 논리형 프로그래밍: 프롤로그(Prolog)와 같이 관계를 정의하고 질문을 통해 답을 구하는 방식이다.
특징 및 한계
선언형 프로그래밍은 명령형 코드에서 '어떻게'를 감추고 '무엇을'만 노출하는 추상화의 일종으로 볼 수 있다. 예를 들어 자바스크립트에서 반복문을 사용하여 배열 요소를 처리하는 대신 map 함수를 사용하는 것은 선언형 스타일을 적용한 사례이다.
그러나 선언형과 명령형의 구분은 항상 명확하지는 않다. 프롤로그는 재귀법이나 특정 연산자를 통해 명시적인 계산을 수행할 수 있으며, SQL 역시 데이터를 삽입하거나 삭제하는 명령형 성격을 포함하고 있다. 또한 많은 선언형 언어들이 내부적으로는 알고리즘을 설명하거나 상세 구현을 포함할 수 있어 엄밀한 의미의 선언형 정의에서 벗어나기도 한다.