Home C++20 기능 정리 - 서론
Post
Cancel

C++20 기능 정리 - 서론

서론

C++는 과거 C++9X 시절과 달리, C++11에서 대격변을 맞이하였다고 흔히들 말합니다. C++11 이전의 버전은 C의 표준안을 근간으로 하기 때문에 Class, Templates 이나 STL 을 제외하면 C 언어와 큰 차이가 없다고 생각했습니다.

그러나 2005년 C++ 기술 보고서 1, 통칭 TR1이 발표되는데, 여기서 정규식, 해시 테이블과 더불어 가장 많이 사용하는 기술 중 하나인 스마트 포인터가 추가됩니다.

그리고 2011년, 다음 패치인 C++11에서 TR1의 신규 컴포넌트 뿐만 아니라 constexpr, thread API, 그리고 template의 마성을 이을 R-Value 가 추가되면서 C++11 은 기존 C++와 전혀 다른 새로운 언어처럼 느껴지며, 우리는 이 시점부터 Modern C++ 라는 명칭을 사용합니다.

C++ 20은?

이후 등장한 C++14, C++17 역시 개인적으로 많이 사용하는 기법 중 하나인 람다(Lambda)filesystem 이 등장하고, 완벽하진 않지만 Python이나 Javascript와 같이 타입이 지정되지 않고도 값을 담을 수 있는 변수. variant, any 등이 추가됩니다.

하지만 여기까진 그저 C++11에 기능이 강화된 버전으로 생각되며, Modern C++의 일환으로 여겨집니다.

이러한 상황에서 C++20 이 발표되는데 C++11의 뒤를 잇은 차세대 대격변 표준안이라는 말이 있었고, 이 과정에서 흥미를 느껴 본 포스트를 작성하게 되었습니다.

주요 기능

그렇다면 왜 C++20이 차세대 대격변 패치라고 불리는지, 대표적인 4가지 기능을 보겠습니다.

  1. Concepts

    C 언어에 포인터가 있다면, C++ 에는 템플릿이 있습니다. 입문자들이 첫 번째 벽을 느끼는 구간이 C 언어에서는 포인터였다면, C++ 에선 템플릿이라는 말입니다.

    Concept 이란 Named sets of requirements, 다시 말해 명명된 요구 사항들의 집합 이라고 번역되는데 Named Requirements에 대해서는 여기서 더 자세히 알 수 있습니다.

    새로 추가된 개념이 아니라 기존의 우리가 알던 rvalue, lvalue, iterator, container 등이 모두 그것입니다.

    그러나 다음 포스트에서 더 자세히 다루겠으나, Concept의 등장으로 우리는 템플릿에 대한 제약 조건을 더욱 강하게 지정할 수 있고, 이 제약 조건들은 컴파일 시점에 평가되어 런타임 간 오류를 줄여주는 효과를 가져옵니다.

  2. Ranges

    코딩테스트를 풀다보면 간혹 복잡한 반복문을 파이썬과 같은 일부 언어에서 람다와 슬라이싱, 기타 문법 등을 활용하여 한 줄로 간결하게 표현하는 것을 볼 수 있습니다.

    그러나 우리 C++ 유저들은 반복을 위해선 어찌되었건 for 또는 while 문을 기반으로 코드가 작성되어야 했습니다.

    하지만 <ranges> 라이브러리를 사용하면 코드가 매우 간결해지고, 불필요한 연산량이 줄어들 수 있습니다.

    하지만 여전히 간결한 코드와 가독성이 좋은 코드는 다르다고 생각합니다.

  3. Coroutine

    코루틴은 현대 많은 프로그래밍 언어들, 대표적으로 C# 또는 Javascript에서 이미 지원되던 개념으로 간단히 설명하면 완전한 비동기 함수라고 표현할 수 있습니다.

    물론 async 개념은 이미 존재하였지만 컨셉이 다릅니다.

    기존 C 기반 함수들은 Foo() 함수를 호출하면 이 함수가 끝나기 전 까지 다른 작업을 할 수 없다. 하지만 코루틴을 적용하면 Foo 함수의 특정 시점에서 함수를 중단할 수 있습니다.

    다른 포스트에서 설명하겠지만, C 스타일의 컨셉에 답게 제공되는 자유와 사용자의 의무는 비례합니다. 즉.. 복잡합니다..

  4. Module (import)

    개인적으로 생각했을 때 C언어부터 고수해왔던 C, C++ 스타일에 가장 큰 변화를 제공하는 기능이라 생각합니다.

    이것 역시 신개념 기능이 아닙니다. Python, JavaScript를 개발해 본 사람이라면 당연하다 생각했던 기능이지만 뒤 늦게 추가된 것입니다.

    하지만 C언어 하면 #include <stdio.h>가 떠오르던 수 많은 프로그래밍 입문자들이 있기 때문에 Module 하나만으로도 이번 패치가 대격변이라 불리는 이유가 아닐까 생각합니다.

    물론 아직 커스텀 모듈 위주로 사용이 가능하며 std와 같은 표준에 대한 지원은 아직 불가하며(C++23 한정) gcc 버전에 제약이 있습니다. 필자가 테스트하는 환경에서 이 부분은 테스트가 불가능합니다.

여기까지가 C++20에 추가된 대표적인 4가지 기능이며, 이 외 람다의 변화나 소위 말하는 우주선 연산자, span 등이 추가되었으며, 다음 포스트부터 이 기능들을 하나씩 정리해 볼 예정입니다.

This post is licensed under CC BY 4.0 by the author.

다중 클라이언트 서버 - 2

C++20 기능 정리 - Conecpt