TECH 으로 돌아가기
TECH HACKER NEWS 2026.10.27 04:04 8분 읽기 29 READS

C++26 마지막 관문 DIS 투표, 왜 '컨트랙트'가 끝까지 논쟁거리였을까

C++26 마지막 관문 DIS 투표, 왜 '컨트랙트'가 끝까지 논쟁거리였을까
SOURCE IMAGE · HACKER NEWS
C++26 마지막 관문 DIS 투표, 왜 '컨트랙트'가 끝까지 논쟁거리였을까

표준이 '완성'되기까지의 마지막 단계

C++은 3년마다 새 표준이 나오는데요, 위원회(WG21)가 기술적으로 문서를 확정했다고 바로 표준이 되는 건 아니에요. C++은 ISO 국제 표준이라서 마지막에 각 나라의 표준화 기구(National Body)가 투표를 해야 하거든요. 이 투표에 올라가는 문서를 DIS(Draft International Standard, 국제 표준안)라고 불러요. 원문은 C++26 DIS 투표 결과를 다루면서 특히 컨트랙트(Contracts)에 초점을 맞추고 있어요. 투표 수치나 나라별 의견 같은 세부 내용은 원문에서 직접 확인하시고, 여기서는 왜 하필 컨트랙트가 표준화 막바지까지 화두였는지를 풀어볼게요.

ISO 표준은 이렇게 만들어져요

흐름을 간단히 정리해 볼게요. 위원회가 기능을 모아 CD(Committee Draft, 위원회 초안)를 만들면 각국 기구가 여기에 코멘트를 달아요. 위원회는 이 코멘트를 반영해 문서를 다듬은 뒤 DIS로 넘기고, 각국이 DIS를 놓고 찬반 투표를 해요. ISO 규칙상 투표권을 가진 정회원(P-member) 표의 3분의 2 이상이 찬성하고, 반대표가 전체 투표의 4분의 1을 넘지 않아야 통과돼요.

중요한 건 DIS 단계에서는 기능을 넣거나 빼는 큰 수술이 사실상 어렵다는 점이에요. 그래서 어떤 기능에 반대하는 쪽은 이 투표에서 공식적으로 반대 의견을 남기는 방식으로 목소리를 내요. 컨트랙트가 바로 그런 기능이었어요.

컨트랙트가 뭐길래

컨트랙트는 쉽게 말해 함수가 지켜야 할 약속을 코드로 적어두는 기능이에요. "이 함수는 음수를 받으면 안 된다(사전 조건)", "이 함수는 항상 0 이상을 돌려준다(사후 조건)" 같은 걸 함수 선언에 직접 쓰는 거죠. 지금까지는 assert 매크로나 주석으로 처리하던 부분이에요.

int safe_sqrt(int x)
pre(x >= 0)
post(r: r >= 0);

void process(std::span<int> data) {
contract_assert(!data.empty());
}

pre는 함수에 들어갈 때, post는 함수에서 나올 때 검사돼요. contract_assert는 함수 본문 중간에 쓰는 단언문이고요. 매크로인 assert와 달리 언어가 직접 이해하는 문법이라서, 컴파일러나 정적 분석 도구가 이 정보를 활용할 수 있다는 게 큰 장점이에요.

그런데 왜 반대가 있었을까

C++26 컨트랙트(제안서 P2900)는 2025년 초 작업 초안에 들어갔지만, 그 뒤로도 반대 목소리가 꾸준히 나왔어요. C++을 만든 비야네 스트롭스트룹도 우려를 정리한 문서를 낸 적이 있어요. 쟁점을 쉽게 풀어보면 이래요.

첫째, '검사 안 함' 모드 논란. C++26 컨트랙트에는 검사를 어떻게 할지 고르는 평가 모드가 있어요. 무시하는 ignore, 위반을 기록만 하고 계속 실행하는 observe, 위반하면 프로그램을 끝내는 enforce와 quick_enforce예요. 모드는 보통 컴파일러 옵션으로 골라요. 그래서 "안전을 위한 기능인데 빌드 설정 하나로 통째로 꺼질 수 있다면 진짜 안전장치라고 할 수 있냐"는 비판이 나왔어요.

둘째, 모드를 섞어서 빌드할 때의 문제. 라이브러리는 enforce로, 내 코드는 ignore로 컴파일해서 링크하면, 같은 인라인 함수가 번역 단위(소스 파일)마다 다르게 동작할 수 있어요. C++의 고질적인 골칫거리인 ODR(같은 함수의 정의는 프로그램 전체에서 하나여야 한다는 규칙)과 얽히는 부분이에요.

셋째, 빠진 기능들. 첫 버전은 MVP(최소 기능 제품)라서 가상 함수에 컨트랙트를 붙이는 기능 등이 빠져 있어요. "반쪽짜리를 일단 넣으면 나중에 고치기 어렵다"는 우려와 "일단 넣고 키워가자"는 입장이 부딪혔죠.

찬성하는 쪽 논리도 분명해요. 컨트랙트는 20년 넘게 논의된 기능이고, C++20 초안에 들어갔다가 막판에 빠진 적도 있어요. 또 이번에 미뤄지면 최소 3년을 더 기다려야 하거든요.

C++26에는 컨트랙트만 있는 게 아니에요

C++26은 근래 가장 큰 업데이트로 꼽혀요. 컴파일 타임에 타입 구조를 들여다보는 정적 리플렉션, 비동기 실행의 표준 모델인 std::execution, 표준 라이브러리의 경계 검사를 켤 수 있는 하드닝(hardening)이 들어갔어요. 초기화되지 않은 변수를 읽는 동작도 '정의되지 않은 동작'에서 '잘못된 동작(erroneous behavior)'으로 바뀌었고요. 전체적으로 안전성이 큰 테마인데, 메모리 안전 언어를 쓰라는 업계와 정부 기관의 권고 흐름 속에서 C++이 내놓은 답이라고 볼 수 있어요.

한국 개발자에게 주는 시사점

게임 엔진, 금융 트레이딩 시스템, 임베디드, 자동차 소프트웨어처럼 한국에서 C++ 비중이 큰 분야라면 컨트랙트는 결국 만나게 될 기능이에요. 다만 GCC, Clang, MSVC가 모두 안정적으로 지원하고 사내 빌드 환경에 반영되기까지는 시간이 걸려요. 지금은 사전·사후 조건을 명시하는 습관을 assert나 사내 매크로로 먼저 들여두고, 나중에 표준 문법으로 옮기기 쉬운 형태로 정리해 두는 게 현실적인 준비예요.

마무리

한 줄 정리: C++26 컨트랙트는 '안전성'과 '유연성' 사이에서 표준 위원회가 마지막까지 줄다리기한 기능이에요.

여러분은 빌드 옵션으로 끌 수 있는 컨트랙트도 충분히 의미 있다고 보시나요, 아니면 반드시 강제돼야 진짜 안전장치라고 보시나요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://train-it.eu/blog/cpp26-contracts-the-ballot-result/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...