"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

★철학으로 보는 코딩

명령형? 선언형? 언제 어떻게 쓰는거지?

허민영 2025. 1. 31. 15:48

명령형 프로그래밍과 선언형 프로그래밍: 도메인 분석을 통한 최적화 접근

프로그래밍을 처음 접했을 때 대부분의 개발자는 명령형 프로그래밍(Imperative Programming) 방식으로 사고합니다. 이는 컴퓨터에게 어떻게(how) 동작해야 하는지를 단계적으로 설명하는 방식입니다. 예를 들어, 리스트의 모든 요소를 더하는 코드를 명령형으로 작성하면 다음과 같습니다:

int sum = 0;
foreach (num in numbers)
{
    sum += num;
}

반면, 선언형 프로그래밍(Declarative Programming)은 무엇(what) 을 원하는지를 설명하는 방식입니다. 같은 기능을 선언형으로 작성하면 다음과 같습니다:

using Linq

int sum = numbers.Sum();

명령형 프로그래밍은 수행해야 하는 작업을 명확히 기술하는 반면, 선언형 프로그래밍은 구현 세부 사항을 추상화하고 의도를 강조하는 장점이 있습니다.

 

도메인 분석과 선언형 프로그래밍의 효과

소프트웨어 설계에서 도메인을 분석하면 크게 로우레벨(low-level)과 하이레벨(high-level) 로 나눌 수 있습니다.

  1. 로우레벨(Low-Level) 최적화
    • 명령형 프로그래밍이 필요한 경우는 하드웨어와 직접 맞닿아 있는 시스템 프로그래밍, 실시간 처리, 드라이버 개발과 같은 영역입니다.
    • 하지만 현대의 고수준 언어에서는 이러한 작업도 선언형으로 표현할 수 있도록 점점 발전하고 있습니다. 선언형으로 작성된 코드는 병렬연산에 더 적합합니다. 자세한 내용은 닷넷의 병렬프로그래밍 항목을 참고하시면 됩니다. (https://learn.microsoft.com/ko-kr/dotnet/standard/parallel-programming/)
 

.NET의 병렬 프로그래밍: 설명서 가이드

.NET의 병렬 프로그래밍에 대한 문서 목록.

learn.microsoft.com

  •    2. 하이레벨(High-Level) 비즈니스 로직
    • 기업용 애플리케이션, 데이터베이스, 웹 서비스, 머신러닝 모델과 같은 도메인은 선언형 스타일이 더 효과적입니다.
    • 예를 들어, SQL을 생각해 봅시다. SQL은 "고객 테이블에서 특정 조건을 만족하는 행을 검색하라"는 무엇(what) 을 기술하지만, 내부적으로 어떤 인덱스를 사용할지, 어떤 순서로 데이터를 검색할지는 명시하지 않습니다.
    • 웹 개발에서도 React, Vue와 같은 프레임워크는 상태를 선언적으로 관리 하도록 유도합니다. 예전에는 직접 DOM을 조작해야 했지만, 현재는 상태(state)를 변경하면 자동으로 UI가 업데이트됩니다.
 

선언형 프로그래밍을 활용할 때의 이점

선언형 접근 방식은 데이터와 이벤트를 체계적으로 모델링하여 코드의 복잡도를 줄이고 유지보수성을 높이는 것이 핵심입니다. 이를 통해 개발자는 보다 직관적이고 확장 가능한 시스템을 구축할 수 있습니다.

  1. 가독성과 유지보수성 향상
    • 선언형 프로그래밍은 의도(intention) 를 명확하게 표현하므로 코드가 더 읽기 쉽고, 유지보수가 쉬워집니다.
  2. 병렬 처리 및 최적화
    • 선언형 스타일은 내부적으로 병렬 최적화 가 가능하게 만듭니다. SQL, Spark, TensorFlow 등이 이를 잘 보여주는 예입니다.
  3. 테스트 및 디버깅의 용이함
    • 명령형 프로그래밍에서는 사이드 이펙트(Side Effect)를 관리하기 어렵지만, 선언형 접근 방식에서는 불변성(Immutability)과 순수 함수(Pure Function)를 활용하여 이를 줄일 수 있습니다.
  4. 비즈니스 로직과 구현의 분리
    • 선언형 스타일을 사용하면 핵심 비즈니스 로직을 보다 명확하게 표현할 수 있습니다. 이는 애플리케이션을 모듈화하고 유지보수를 쉽게 만드는 중요한 요소입니다.

결론

프로그래밍에서 명령형과 선언형 방식은 서로 대립하는 개념이 아니라, 서로 보완하는 패러다임 입니다. 개별 프로젝트 한정의 로직과 컨텐츠는(더 정확히는 시퀀스와 프로시저 중심의 도메인) 명령형 프로그래밍으로 작성되는 것이 좋지만, 보편적이고 일반적인 로직과 컨텐츠(이벤트, 데이터 중심의 도메인)는 도메인 분석을 통해 선언형 스타일을 적극 활용하는 것이 추천됩니다.

현대 소프트웨어 개발에서는 선언형 프로그래밍이 점점 더 중요해지고 있으며, 이를 적극적으로 도입하면 코드의 유지보수성과 확장성이 크게 향상됩니다. 특히 데이터 중심, 이벤트 중심의 애플리케이션에서는 선언형 접근 방식이 매우 적합합니다.