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