태그: C++20
41편
-
C++ 함수형 프로그래밍 심화 — 고차 함수·모나드·Ranges
C++에서 고차 함수·클로저, 커링, Ranges 지연 평가, optional/expected 모나드 체이닝, 프로덕션 FP 관용구를 객체 모델과 함께 정리합니다. 함수형 프로그래밍(FP)은 값과 함수의 조합으로 프로그램을 구성하고, 부작용을 경계에 모으는 사고방식입니다.
-
C++20 std::views: filter·transform·take 지연 평가와 ranges::to로 구체화하기
C++20 std::views의 filter, transform, take, drop을 파이프로 연결하면 중간 컨테이너 없이 지연 평가되는 원리를 설명합니다. 뷰가 원본을 소유하지 않아 생기는 댕글링, 재평가와 캐싱 문제, ranges::to로 결과를 컨테이너로 만드는 방법을 다룹니다.
-
C++20 템플릿 람다: auto 람다와 차이, Concepts로 타입 제한하기
C++20 템플릿 람다의 명시적 템플릿 매개변수 문법과 Concepts를 이용한 타입 제약, 여러 매개변수·파라미터 팩·제네릭 팩토리 패턴 등 실전 활용법과 자주 발생하는 컴파일 에러 해결법을 코드로 정리합니다.
-
C++20 삼원 비교 연산자 <=>: strong·weak·partial_ordering 고르는 기준과 = default
C++20 <=> 연산자 하나로 <, <=, >, >=를 생성하는 방법과 strong·weak·partial_ordering 중 반환 타입을 고르는 기준을 설명합니다. = default의 사전식 비교, 대소문자 무시 같은 커스텀 비교, ==가 따로 생성되는 규칙도 다룹니다.
-
C++20 stop_token·stop_source·stop_callback: jthread와 협력적 취소 구현
C++20 std::stop_token·stop_source·stop_callback과 std::jthread로 협력적 취소를 구현하는 방법입니다. 워커 루프, condition_variable_any 연동, 콜백 수명 주의점을 실전 코드와 함께 설명합니다.
-
C++20 ranges::subrange: 반복자 쌍을 범위로 묶기와 std::span과의 차이
반복자 두 개를 따로 넘기던 코드를 C++20 std::ranges::subrange 하나로 묶어 ranges 알고리즘과 뷰에 그대로 넘기는 방법을 설명합니다. 벡터를 복사 없이 둘로 나누기, 알고리즘 결과를 범위로 받기, 청크 처리 예제와 std::span과의 차이를 다룹니다.
-
C++20 std::span: 배열·vector·array를 하나의 비소유 뷰로 받기
배열, std::vector, std::array를 받는 함수를 따로 만들지 않고 C++20 std::span 하나로 받는 방법을 설명합니다. span이 포인터와 길이만 가진 비소유 뷰라서 복사가 싸다는 점, 부분 범위와 2D 배열 다루기, 수명과 const 관련 실수를 예제로 봅니다.
-
C++20 std::span 심화: 정적·동적 extent, subspan, 읽기 전용 뷰
C++20 std::span의 동적 크기와 정적 크기(extent) 차이, subspan·first·last로 부분 범위를 자르는 법, span<const T>로 읽기 전용 뷰를 만드는 법을 행렬 연산·슬라이딩 윈도우·이미지 처리 예제로 익힙니다. 임시 객체로 생기는 댕글링 span도 짚습니다.
-
string_view와 span: 복사 없이 넘기기, SSO와의 관계, mdspan, 댕글링 방지
C++ std::string_view와 std::span 정리. 복사 없이 문자열과 배열을 넘기는 방법, SSO와의 관계, mdspan, 댕글링 참조가 생기는 경우와 방지법, 성능 비교를 다룹니다.
-
C++ constexpr 고급 가이드 | constexpr 컨테이너·알고리즘·문자열·new/delete 실전
C++20 constexpr std::vector·std::string·알고리즘, constexpr new/delete, 컴파일 타임 컨테이너·알고리즘 완전 예제. 문제 시나리오, 자주 발생하는 에러, 베스트 프랙티스, 프로덕션 패턴.
-
SFINAE 패턴 정리: enable_if, void_t, Detection Idiom과 Concepts로 옮길 시점
C++ SFINAE 정리. enable_if, void_t와 표현식 검사, Detection Idiom과 is_detected, 템플릿 오버로드 분기, 레거시 SFINAE 코드를 C++20 Concepts로 옮기는 기준을 다룹니다.
-
C++20 range adaptor: views::filter·transform 파이프라인의 지연 평가와 댕글링 함정
views::filter와 views::transform을 | 로 이어 붙인 파이프라인이 결과를 즉시 만들지 않고 순회할 때 계산되는 원리를 설명하고, 원본보다 오래 사는 뷰의 댕글링, 조건자 중복 호출, 어댑터 순서에 따른 비용 차이 같은 함정을 예제로 짚습니다.
-
C++20 std::ranges 알고리즘: projection으로 중복 줄이기와 concept 기반 에러
C++20 std::ranges 알고리즘을 다룹니다. std::sort 대비 안전성, projection으로 코드 중복 줄이기, concept 기반 컴파일 에러, subrange 반환까지 실전 예제로 정리합니다.
-
C++20 ranges의 개념 계층: range 요건, input·forward·random_access_range, CPO 설계
begin()과 end()만 있으면 range가 되는 최소 요건부터 input_range, forward_range, random_access_range로 계층이 나뉜 이유, std::ranges::begin이 평범한 함수가 아닌 커스터마이제이션 포인트 객체로 설계된 까닭을 C++20 코드로 설명합니다.
-
C++20 counting_semaphore·binary_semaphore: 동시 사용 수 제한과 스레드 간 신호
C++20 counting_semaphore로 연결 풀이나 워커 슬롯의 동시 사용 수를 제한하고, binary_semaphore로 스레드 간 신호를 보내는 방법을 생산자-소비자 예제로 설명합니다. release 누락, 초기값 실수, try_acquire로 대기 없이 시도하는 법도 다룹니다.
-
C++17·20·23 주요 기능 정리: 구조화 바인딩부터 Concepts·Ranges·std::print까지
C++17의 구조화 바인딩, if constexpr, optional, variant, filesystem부터 C++20의 Concepts, Ranges, 코루틴, 모듈, <=> 연산자, C++23의 std::print와 다차원 첨자까지 각 기능이 기존 코드의 어떤 불편을 줄이는지 예제로 비교합니다.
-
C++20 std::jthread: 자동 join과 stop_token으로 스레드 협조적 중단하기
C++20 std::jthread가 소멸 시 자동으로 join하는 방식과 stop_token·stop_source·stop_callback으로 스레드를 협조적으로 중단하는 방법을 std::thread와 비교하고, 중단 체크 누락이나 detach 같은 실수를 예제로 짚습니다.
-
C++ 제네릭 람다: auto 매개변수와 C++20 템플릿 람다
제네릭 람다의 auto 매개변수·템플릿 연역, 클로저와 operator() 모델, 완벽 전달, SFINAE·requires, 프로덕션 패턴과 STL 활용까지 정리합니다. 제네릭 람다(generic lambda)는 C++14에서 도입된 기능으로, 람다의 매개변수에 auto를 사용해 여러 타입에 대해 같은 본문을 재사용할 수 있게 합니다. 내부적으로는 클로저 타입의 operator()가 함수 템플릿이 됩니다.
-
C++20 날짜 파싱과 서식: std::format·chrono::parse·zoned_time 사용법
C++20 std::format과 std::chrono::parse로 날짜·시간을 출력하고 파싱하는 방법. 서식 지정자, 파싱 실패 처리, zoned_time 시간대 변환, 로그 타임스탬프 예제까지 정리합니다.
-
C++20 Constraints 실전: requires 절, 커스텀 Concept, 오버로드 선택과 에러 메시지
C++20 Concepts와 Constraints로 타입 제약을 거는 방법. 기본 사용법, 커스텀 concept, requires 절, 오버로드 해석과의 관계, 실무 사례와 트러블슈팅을 정리합니다.
-
C++ 상수 초기화: constexpr·constinit으로 정적 초기화 순서 문제 피하기
C++ 정적 변수가 컴파일 타임에 초기화되는 상수 초기화와 런타임에 초기화되는 동적 초기화를 구분하고, constexpr 변수와 C++20 constinit으로 상수 초기화를 보장하는 방법, 정적 초기화 순서 문제를 예제로 설명합니다.
-
C++ 분기 예측: likely·unlikely 속성과 분기 없는 코드로 성능 개선하기
CPU 파이프라인에서 분기 예측이 실패할 때 생기는 비용을 설명하고, C++20 [[likely]]·[[unlikely]] 힌트, 조건문을 산술 연산으로 바꾸는 branchless 코드, 데이터 정렬 효과, 룩업 테이블과 PGO 적용 방법을 다룹니다.
-
C++20 달력과 시간대: year_month_day와 zoned_time 사용법
C++20 chrono의 year_month_day로 날짜를 표현하고 weekday로 요일을 계산하며, zoned_time으로 시간대를 변환하는 방법을 다음 영업일 계산, 회의 시간 변환, 반복 일정 예제로 설명합니다.
-
C++20 std::barrier와 std::latch: 스레드 동기화 지점 만들기
C++20 std::latch로 여러 스레드의 준비 완료를 한 번 기다리고, std::barrier로 단계마다 반복 동기화하며 완료 콜백을 실행하는 방법을 병렬 초기화, 파이프라인, 게임 프레임 동기화 예제로 설명합니다.
-
C++ Iterator 카테고리 이해하기: begin/end부터 성능 비교까지
순회 중 erase 후 크래시가 나는 문제에서 출발해 반복자 카테고리별 지원 연산, 반개구간 [begin, end), reverse_iterator의 base() 변환, back_inserter 같은 어댑터를 예제로 설명합니다. std::advance와 distance 사용법도 다룹니다.
-
C++ Generator로 지연 시퀀스 만들기: co_yield, 무한 수열, filter·map·take 파이프라인
C++20 코루틴으로 Generator를 구현하는 방법. co_yield와 promise_type, 지연 평가와 무한 시퀀스, filter·map·take 조합, 수명(dangling) 오류, vector 대비 성능, 파일 스트리밍 예제를 다룹니다.
-
C++20 Modules: import·export 문법, 컴파일러 지원 현황, 빌드 시간
include가 쌓여 컴파일이 느려지는 문제를 C++20 모듈로 푸는 기본기를 다룹니다. export module과 import 문법, 전역 모듈 fragment로 기존 헤더 쓰기, 파티션 구성, GCC·Clang·MSVC·CMake 빌드 설정과 module not found 에러 대처를 설명합니다.
-
C++ 기존 프로젝트를 Module로 전환 | 단계별 마이그레이션 [#24-2]
헤더 기반 프로젝트를 한 번에 갈아엎지 않고 의존성이 적은 유틸부터 모듈로 옮기는 전환 절차를 보여줍니다. include와 import 공존, export 범위 결정, 인터페이스·구현 유닛 분리, MSVC .ixx를 포함한 CMake 설정과 증분 빌드 효과를 다룹니다.
-
C++20 코루틴 기초: co_await·co_yield와 Generator 구현
값을 하나씩 만들어 주는 제너레이터와 콜백 없이 쓰는 비동기 Task를 C++20 코루틴으로 직접 구현합니다. co_yield·co_await·co_return의 동작, promise_type 필수 메서드, coroutine_handle 수명 규칙과 dangling 참조 같은 실수를 짚습니다.
-
C++ 비동기 작업과 Coroutine | co_await로 콜백 지옥 탈출하기 [#23-3]
C++20 코루틴으로 비동기 작업을 co_await하고, Task 타입을 설계하며, Asio와 연동하는 기본 패턴을 다룹니다. 콜백 지옥 해결, 에러 처리, 수명 관리, 성능 비교, 베스트 프랙티스, 프로덕션 패턴까지 실전 가이드.
-
C++20 Concepts: SFINAE를 대체하는 제약 문법과 Subsumption
난해한 템플릿 에러 메시지를 C++20 Concepts로 바꾸는 방법을 enable_if 코드와 나란히 비교합니다. requires 절과 requires 표현식, 표준 concept 계층, subsumption으로 오버로드 우선순위가 정해지는 원리와 흔한 제약 에러도 다룹니다.
-
C++ 커스텀 Concepts 작성 | 도메인에 맞는 제약 조건 정의하기 [#22-2]
표준 concept만으로는 원하는 타입만 받기 어려울 때 Serializable, Hashable 같은 도메인 concept를 직접 정의하는 방법을 다룹니다. requires 표현식의 반환 타입·noexcept 검사, &&와 || 조합, ADL과 swap 문제, 순환 정의 같은 흔한 오류도 설명합니다.
-
모던 C++ (C++11~C++20) 핵심 문법 치트시트 | auto·람다
C++11부터 C++20까지 버전별로 자주 쓰는 문법을 모았습니다. auto와 람다, 스마트 포인터, 구조화된 바인딩과 optional·variant, if constexpr, Concepts·Ranges·코루틴·삼원 비교 연산자를 짧은 예제로 바로 찾아볼 수 있습니다.
-
래퍼 함수에서 인자가 복사될 때: 유니버설 참조와 std::forward로 완벽한 전달 구현하기
C++ 완벽한 전달(Perfect Forwarding) 정리. 래퍼 함수에서 인자가 복사되는 문제, 유니버설 참조, std::forward, 참조 축약 규칙, emplace 계열 함수와 성능 비교를 다룹니다.
-
C++20 코루틴과 Asio | 콜백 지옥 탈출 [#6]
C++20 코루틴과 Boost.Asio의 awaitable, co_await, use_awaitable로 콜백 중첩 없이 비동기 읽기·쓰기를 작성하는 방법과, 예외 기반과 redirect_error를 이용한 error_code 기반 에러 처리, 타이머를 이용한 취소·타임아웃을 코루틴 Echo 서버 예제로 설명합니다.
-
C++20 Ranges: views 파이프라인, projection, 성능 특성
begin/end를 반복해 넘기고 람다로 멤버를 비교하던 STL 코드를 std::ranges 알고리즘과 프로젝션으로 줄이는 방법을 보여줍니다. filter·transform·take로 view 파이프라인을 만들고 벡터로 구체화하는 법, range concept 요구 사항, view 수명 함정도 다룹니다.
-
C++ Ranges Views와 파이프라인 | 지연 연산으로 효율적으로 다루기 [#25-2]
중간 벡터를 여러 개 만드는 루프 코드를 C++20 Ranges view 파이프라인(filter·transform·take·split·join)으로 바꾸고, 지연 평가가 동작하는 방식과 dangling view·조건부 파이프라인 타입 같은 함정을 정리합니다.
-
C++ 커스텀 Range 작성 | range 개념을 만족하는 타입 만들기 [#25-3]
직접 만든 컨테이너나 래퍼를 범위 기반 for와 std::ranges 알고리즘에 그대로 넣으려면 무엇이 필요한지 정리합니다. 반복자 요구 사항, random_access 반복자, sentinel, 직접 만드는 filter 어댑터, 수명 문제를 C++20 기준 예제로 다룹니다.
-
constexpr 기초부터 C++26까지: constexpr 함수·생성자, const와의 차이, 확장된 규칙
C++ constexpr 정리. constexpr 변수와 함수, 생성자, const와의 차이, C++14/20 확장, C++26에서 추가되는 기능(void* 캐스트, placement new, 리플렉션)과 성능·빌드 시간 영향을 다룹니다.
-
C++ 입문 개요 | 역사, 현대 C++의 변화, 실무에서 쓰이는 분야
C++의 역사(C with Classes부터 C++26까지)와 표준화 흐름, 게임·금융·임베디드·시스템 소프트웨어에서 왜 여전히 C++가 선택되는지, 그리고 학습 로드맵과 커리어 경로까지 다룹니다.
-
C++ std::thread와 jthread: 스레드 풀 구성과 성능 비교
std::thread에 함수, 람다, 인자를 넘기는 법과 std::ref가 필요한 이유, join과 detach로 수명을 관리하는 법, 예외가 나도 스레드를 정리하는 ThreadGuard와 C++20 jthread, mutex와 condition_variable 기초까지 멀티스레딩의 첫 단계를 다룹니다.