Profiles for Simplicity and Guarantees - Bjarne Stroustrup - CppCon 2026

원본 영상: Profiles for Simplicity and Guarantees - Bjarne Stroustrup - CppCon 2026
채널: CppCon

C++의 표현력을 유지하면서 사용을 단순하게 만들기

비야네 스트로스트룹은 프로파일의 목표를 특정 성질에 대한 보장과 사용의 단순함으로 설명한다. 개발자가 주의해야 할 오류를 도구가 확인할 수 있는 규칙으로 다루고, 그 보장을 바탕으로 C++를 더 쉽게 사용할 수 있게 하려는 구상이다.

출발점은 C++가 다양한 분야의 요구를 수용하는 언어라는 사실이다. 스트로스트룹은 모든 기능을 제한 없이 사용하면서 안전성을 보장하기는 어렵다고 말한다. 그러나 언어를 한 응용 분야에만 맞추거나 유연성과 성능을 크게 희생하는 방식도 C++에 적합하지 않다고 본다.

그는 현대적인 C++로 높은 안전성 요구에 대응할 수 있다고 설명하며, L2와 화성에서 실행되는 프로그램을 사례로 든다. 프로파일은 이러한 요구에 대응하면서 현대적인 C++의 사용과 교육을 돕기 위한 수단으로 제시된다.

프로파일: 일관된 보장들의 집합

스트로스트룹은 프로파일을 일관된 보장들의 집합으로 소개한다. 핵심은 C++의 성격을 유지하면서, 어떤 성질을 안전성과 단순함의 기준으로 삼을지 구체화하는 데 있다.

프로파일의 정의와 안전성·단순함을 설명하는 대목

강연의 사례는 초기화 상태, 객체를 가리키는 별칭, 소유권처럼 코드에서 추적해야 하는 관계로 이어진다. 각각의 사례는 “안전한 코드”라는 넓은 목표를 실제로 확인할 수 있는 문제로 좁혀 보여 준다.

초기화: 사용 가능한 객체인지 확인하기

초기화에 관한 핵심 보장은 모든 객체가 사용되기 전에 초기화되어야 한다는 것이다. 강연은 객체의 초기화와 파괴를 함께 다루며, 객체를 사용하는 시점에 필요한 상태가 갖추어져 있는지를 강조한다.

객체의 사용 전 초기화와 파괴에 관한 설명

초기화는 실행 경로마다 확인해야 한다

지연 초기화에서는 초기화 코드가 존재한다는 사실만으로 충분하지 않다. 사용 지점에 이르는 경로마다 초기화가 이루어졌는지가 중요하다.

강연의 분기 사례에서 X는 두 경로 모두에서 초기화되지만, Y는 한 경로에서만 초기화된다. 이 차이는 초기화 여부를 선언이나 개별 대입문만으로 판단할 수 없으며, 실행 경로와 함께 살펴야 한다는 점을 보여 준다.

분기 경로에 따라 초기화 여부가 달라지는 사례

벡터 내부에는 서로 다른 상태의 저장 공간이 공존한다

벡터의 저장 공간을 설명하는 대목에서는 앞부분에 이미 초기화된 객체들이 있고, 나머지에는 아직 초기화되지 않은 공간이 있는 구조를 다룬다. 같은 저장 영역 안에서도 객체가 존재하는 부분과 저장 공간만 마련된 부분을 구분해야 한다는 뜻이다.

벡터 내부의 초기화된 객체와 미초기화 저장 공간에 관한 설명

이 사례는 초기화 보장을 실제 컨테이너 구현에 적용할 때의 난점을 드러낸다. 메모리를 확보했는지와 그곳에 사용할 수 있는 객체가 있는지는 서로 다른 질문이다.

초기화 상태를 타입에 넣을 때 생기는 문제

스트로스트룹은 초기화 상태를 타입의 일부로 표현하는 방안에도 문제를 제기한다. 그 상태를 기준으로 오버로드할 수 있게 되면, 프로파일을 지원하는 환경과 그렇지 않은 환경에서 프로그램의 의미가 달라질 수 있다는 것이다.

초기화 상태를 타입에 포함할 경우의 오버로드 문제를 설명하는 대목

여기서 드러나는 설계상의 기준은 보장을 강화하면서도 기존 C++ 코드의 의미를 유지해야 한다는 점이다. 초기화 정보를 어떻게 표현할지는 검사 편의뿐 아니라 프로그램의 일관성과도 연결된다.

무효화: 별칭을 얻은 뒤의 연산까지 살펴보기

포인터 무효화 사례에서는 컨테이너의 원소를 가리키는 별칭을 얻은 뒤, 재할당 가능성이 있는 연산을 호출하는 상황을 다룬다. 스트로스트룹은 이미 할당된 원소를 가리키는 포인터를 확보하는 지점에 주목하며, 이후 연산과의 관계가 위험을 만들 수 있다고 설명한다.

원소의 별칭을 얻은 뒤 재할당 가능 연산을 호출하는 위험에 관한 설명

이 사례의 초점은 포인터를 얻는 순간에만 있지 않다. 그 포인터가 가리키는 대상에 영향을 줄 수 있는 후속 연산도 함께 살펴야 한다. 초기화가 사용 전 상태를 확인하는 문제라면, 무효화는 이미 얻은 참조 관계가 이후에도 유효한지를 확인하는 문제로 이어진다.

소유권: 별칭 생성과 해제 의무의 이전을 구분하기

소유권 설명에서는 대상을 가리키는 것과 그 자원의 해제를 책임지는 것을 구분한다. 강연에서 소유자를 비소유자에 대입하는 연산은 별칭을 만들 뿐, 소유권을 넘기지는 않는다.

소유자에서 비소유자로의 대입은 별칭을 만든다는 설명

따라서 포인터가 전달되었다는 사실만으로 자원 관리 책임까지 이전되었다고 볼 수 없다. 소유권 표기는 누가 자원을 해제해야 하는지, 그 의무가 어디로 전달되는지를 표현하기 위한 정보다.

강연이 제시하는 방향

강연의 사례들은 서로 다른 질문을 다룬다. 객체는 사용 전에 초기화되었는가, 원소를 가리키던 별칭은 이후에도 유효한가, 대상을 가리키는 것과 자원을 해제할 책임은 구분되어 있는가.

스트로스트룹이 제시하는 프로파일의 방향은 이러한 질문에 일관된 보장을 부여하는 것이다. 그 과정에서도 C++의 유연성, 효율성, 기존 프로그램의 의미를 유지해야 한다는 조건을 강조한다. 안전성과 단순함은 이 조건 아래 함께 추구하는 목표다.

출처

Profiles for Simplicity and Guarantees - Bjarne Stroustrup - CppCon 2026 — CppCon