노트

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

Declarative Programming

CS · 연결된 개념 12개

쉽게 말하면

선언형은 택시에서 '강남역 가 주세요'만 말하는 방식이고, 명령형은 '직진하다 두 번째 신호에서 우회전'처럼 길을 하나하나 지시하는 방식이에요. 과정을 맡기면 원하는 결과가 한눈에 보여요.

비유가 깨지는 곳 맡긴 과정도 누군가는 명령형으로 처리해요. React는 상태에 맞는 화면만 받아 DOM을 어떻게 고칠지는 스스로 계산해요. 포커스·스크롤처럼 직접 지시가 필요한 곳은 useRef와 Effect를 탈출구로 써요.

명령형(Imperative)·절차적(Procedural) 프로그래밍은 결과에 도달하는 방법(how)을 단계별로 지시하고, 선언형 프로그래밍(Declarative Programming)은 원하는 결과(what)만 기술하고 과정은 도구에 맡긴다. 길 안내로 치면 "직진하다 두 번째 신호에서 우회전"이 명령형, "강남역 가 주세요"가 선언형이다.

// 명령형: 반복과 누적을 직접 관리
const evens = []
for (let i = 0; i < nums.length; i++) if (nums[i] % 2 === 0) evens.push(nums[i])
 
// 선언형: 무엇을 원하는지만
const evens2 = nums.filter(n => n % 2 === 0)
  • SQL(Structured Query Language), HTML(HyperText Markup Language), CSS(Cascading Style Sheets)가 대표적인 선언형 언어다. 컬렉션을 다룰 때 반복문을 파이프라인으로 바꾸는 것도 같은 방향이다(반복문을 파이프라인으로 바꾸기)
  • 함수형 프로그래밍(Functional Programming)은 선언형의 한 갈래로, 부수 효과 없는 순수 함수를 조합해 프로그램을 만든다(부수 효과와 Effect)

React가 선언형인 이유

바닐라 JS(JavaScript)로 카운터를 만들면 버튼을 만들고, 이벤트를 달고, 값이 바뀔 때마다 어느 DOM(Document Object Model)을 어떻게 고칠지 모두 적어야 한다. React에서는 "count가 이 값일 때 화면은 이렇다"만 적으면 무엇을 고칠지는 React가 계산한다(Virtual DOM, 재조정(Reconciliation)). 상태와 UI의 관계가 한곳에 드러나서 예측하기 쉽다. 컬렉션 가상화도 훅으로 "이런 목록을 원한다"고 선언하는 방식이다(리스트 가상화).

다만 포커스 이동, 스크롤, 외부 라이브러리 연동처럼 명령형이 꼭 필요한 곳은 useRef와 Effect를 탈출구로 쓴다(useEffect와 useLayoutEffect).

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 커맨드 패턴

    요청이나 작업을 실행 가능한 객체로 포장하는 패턴. 작업을 값처럼 저장·전달·대기열에 넣을 수 있게 되고, 되돌리기 같은 부가 연산을 붙일 수 있다.

  • React 엘리먼트와 JSX

    React 엘리먼트(React Element)는 "화면에 무엇을 그릴지"를 설명하는 불변의 평범한 JavaScript 객체다. JSX(JavaScript XML)는 이 객체를 만드는 문법이고, 컴파일하면 createElement(새 JSX 변환에서는 jsx()) 호출이 된다.

  • 명령-질의 분리

    함수를 값을 돌려주는 질의(query)와 상태를 바꾸는 명령(command) 중 하나로만 만들라는 원칙. 질의 함수는 겉으로 관찰되는 부수 효과(Side Effect)가 없어야 한다.

  • Svelte

    컴포넌트를 빌드할 때 DOM(Document Object Model)을 직접 바꾸는 JS(JavaScript)로 컴파일하는 UI 프레임워크. React처럼 런타임에 가상 DOM(Virtual DOM)을 비교하지 않고, 어떤 값이 바뀌면 어떤 DOM을 고칠지 컴파일러가 미리 코드로 만들어 둔다. 앱 프레임워크는 SvelteKit이다.

  • Vue 3와 React 대응표

    React에 익숙한 개발자가 Vue 3(Composition API, script setup)를 빠르게 읽을 수 있게 짝지어 본 표. 가장 큰 차이는 Vue는 반응성(Reactivity)을 자동으로 추적해서 의존성 배열(Dependency Array)이 없다는 점이다.

보기 옵션