Hacker News오픈소스 · 도구

C++26 계약(Contracts)으로 함수의 요구사항과 보장을 명시하기

원제 C++26 Contracts: Introduction to Preconditions and Postconditions

110 포인트댓글 106
Key Point

C++26 계약은 assert를 대체하는 표준화된 언어 기능으로, API 요구사항을 선언부에 명시하고 평가 의미를 선택할 수 있으므로 C++ 코드의 안전성과 가독성을 근본적으로 바꿀 것으로 예상된다.

핵심 요약

  • C++26에서 도입된 계약(Contracts)은 함수의 요구사항과 보장을 코드에 직접 표현하는 기능으로, 기존 assert의 한계를 극복한다.
  • precondition(pre)은 함수 진입 시 성립해야 할 조건을, postcondition(post)은 정상 반환 시 성립해야 할 조건을 명시하며, 함수 선언부에 작성할 수 있어 API 문서로도 기능한다.
  • 전통적 assert와 달리 계약은 선언부와 정의부에 분리 작성 가능하고, 첫 선언이 계약을 확립하므로 헤더 파일의 선언에서 모든 요구사항을 볼 수 있다.
  • C++26은 ignore, observe, enforce, quick-enforce 네 가지 평가 의미(evaluation semantics)를 정의하며, ignore일 경우 런타임 검사를 수행하지 않고, enforce일 경우 조건 위반 시 핸들러 호출 후 프로그램을 종료한다.
  • 파라미터가 pass-by-value인 경우 postcondition에서 사용되려면 반드시 const 타입이어야 하고, postcondition은 정상 반환만 검사하며 예외 발생 시에는 검사하지 않는다.
  • contract_assert(...)는 함수 내부의 특정 지점에서 속성을 검증하며, pre, post, contract_assert는 각각 함수 진입, 정상 반출, 함수 내부 지점을 다룬다.
  • 계약의 조건식에서 파라미터는 특수한 상수화 규칙이 적용되어 ++ 같은 뮤테이션이 컴파일 에러가 되지만, 전역 상태를 수정하는 함수 호출 같은 부수효과는 막을 수 없으므로 조건식이 프로그램 상태를 변경하지 않아야 한다.
  • 계약은 런타임 검사를 보장하지 않으므로 입력 검증이나 애플리케이션 경계의 에러 처리는 일반 제어 흐름(if 문 등)을 써야 하며, 계약은 프로그램이 예상하고 처리해야 할 오류를 다루지 않는다.
  • 2026년 10월 기준 GCC 16만 계약을 지원하며, -fcontracts -fcontract-evaluation-semantic=enforce 플래그로 컴파일하고, std::contracts::contract_violation 객체를 받는 커스텀 핸들러로 기본 위반 핸들러를 대체할 수 있다.
  • 계약은 함수 타입의 일부가 아니므로 오버로드 해석이 계약을 구별하지 않으며, 같은 함수의 이후 선언에서 계약을 생략하거나 반복 작성할 수 있지만 다른 계약을 도입할 수는 없다.
  • 전체 컬렉션 정렬 여부 확인처럼 비용 높은 조건식은 테스트 중에는 유용하지만 대표 워크로드에서의 성능 영향을 측정해야 한다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗