C++26 Contracts, assert를 대체하는 계약 프로그래밍

C++26 Contracts: Introduction to Preconditions and Postconditions

C++26 Contracts, assert를 대체하는 계약 프로그래밍

C++26에 도입된 Contracts는 함수 선언에 pre와 post로 사전조건과 사후조건을 명시해 API 요구사항을 코드에 드러낸다. 기존 assert와 달리 선언부에 계약을 노출하고, ignore·observe·enforce·quick-enforce 네 가지 평가 시맨틱을 지원한다. 현재 GCC 16만 -fcontracts 플래그로 사용 가능하며, 계약 위반 시 핸들러를 교체할 수 있다. 단, 계약은 입력 검증이 아니며 predicate 내 상태 변경은 피해야 한다.

중요한 점은 Contracts의 이러한 측면 때문에 계약 단언이 오류 처리와 입력 검증에 사용되어서는 안 된다는 것입니다. 함수가 특정 이벤트를 오류로 보고해야 하는 계약 내 요구사항을 가진다면, 그 처리는 선택 사항이 아닌 표준 C++ 제어문으로 수행해야 하며, 결코 계약 단언으로 해서는 안 됩니다.
  1. cogman10

    나는 이게 마음에 안 든다.

    계약을 걸어서 런타임 에러를 컴파일 타임 에러로 바꿀 수 있다면야 적극 찬성이다. 그런데 이건 그냥 런타임 에러를 더 만드는 것처럼 보인다. 그 지점에서 이건 `assert`보다 나을 게 없어 보인다. 정말로 assert하겠다고 약속한다는 점(아마도)만 빼면 말이다.

    이 글은 또한 큰 문제 하나를 지적하는데, 바로 "중요한 점은, Contracts의 이런 측면 때문에 계약 단언을 에러 처리와 입력 검증에 사용해서는 안 된다는 것이다. 어떤 함수가 특정 이벤트를 에러로 보고해야 한다는 계약 내 요구사항을 가지고 있다면, 그 처리는 선택 사항이 아닌 표준 C++ 제어문으로 해야 하며, 결코 계약 단언으로 해서는 안 된다."라는 부분이다.

    계약이 무엇에 쓰이는 건지에 대한 이런 흐릿한 정의는 십중팔구 혼란을 불러올 것이다. 입력 검증은 아니고, 매개변수 검증이다.. 그런데 진짜 검증은 아니고 에러를 내는 검사다, 그런데 우리가 만들어내는 에러는 아니다.

  2. WalterBright

    나는 예전에 계약의 열렬한 팬이었고, 90년대에 Zortech C++ 컴파일러에서 실제로 구현하기도 했다:

    https://www.digitalmars.com/ctg/contract.html

    D에서도 구현했다. 하지만 결국 그다지 유용하지 않다는 게 드러났다.

  3. ZuLuuuuuu

    이걸 보니 Eiffel 프로그래밍 언어의 "Design by Contract" 개념이 떠오른다:

    https://en.wikipedia.org/wiki/Design_by_contract

    https://www.eiffel.com/values/design-by-contract/introductio...

  4. Surac

    그럼 대체 뭐가 좋다는 거야, 입력을 검증하는 데 쓰지도 못한다면? 매개변수 범위를 편하게 적어두는 방법. 그 이상도 이하도 아니다

  5. gavinray

    재미난 얘기 하나: 이게 표준에 들어가기를 기다리면서 몇 년 전에 C/C++에 Contracts를 추가하는 GCC 컴파일러 플러그인을 작성했었다

    https://gavinray97.github.io/blog/adding-invariant-to-cpp-de...

    결과적으로 그 글은 GCC 플러그인 작성 입문서로서가 제일 유용했던 걸로 드러났지만, 적어도 재미는 있었다

  6. tsukikage

    이 글은 최적화 활용 사례를 전혀 언급하지 않는다. 혹시 누군가 이미 답을 꿰뚫고 있고 내가 답을 찾아 헤매기 전에 말인데, 여기 의도 중 일부는 이것들이 최적화 단계에 정보를 주는 것, 어쩌면 if (!(some_condition)) { __builtin_unreachable(); } 관용구가 달성할 수 있는 것과 비슷하게 하는 것도 포함되나?

  7. MetaverseClub

    이걸 설계할 때 그들이 머릿속에 그린 사용 사례가 뭔지 궁금하다.

    런타임 단언과 문서화라면, 그래, 작동하겠지만 계약 없이도 논란의 여지 없이 괜찮게 작동한다.

    형식 검증이라면, 설계가 완전히 빗나갔다.

  8. randyrand

    나만 그런지 모르겠지만, C++처럼 거대하고 복잡한 언어는 그 어느 때보다 매력 없어 보인다.

    코드를 손으로 작성할 거라면, 아름답고 쾌적한 언어에 대한 요구가 그 어느 때보다 커졌다.

이 날의 다른 글

2026-10-15