본문 바로가기

CPP61

Modern C++ : std::any (17) std::any 개요std::any는 C++17부터 도입된 기능으로, 모든 타입의 값을 안전하게 저장하고 추출할 수 있는 타입 안전(type-safe) 컨테이너입니다. 특정 타입에 국한되지 않고 다양한 타입의 객체를 하나의 변수에 담아야 할 때 유용하게 사용됩니다. C++ 버전별 주요 키워드 도입 시기C++17: std::any가 표준 라이브러리에 처음 도입되었습니다. 내용 설명std::any는 내부에 어떤 타입의 값이든 저장할 수 있는 클래스 템플릿입니다. void*처럼 타입을 완전히 잃어버리는 것과 달리, std::any는 저장된 값의 타입을 기억하고 있어 타입 안전성을 보장합니다.주요 멤버 함수는 다음과 같습니다.any_cast(): std::any 객체에 저장된 값을 특정 타입 T로 캐스팅하여 반.. 2025. 9. 30.
Modern C++ : std::variant (17) std::variant 개요std::variant는 타입 안전(type-safe) 공용체(union)로, C++17 표준 라이브러리에 추가된 기능입니다. 주어진 여러 타입 중 하나의 값을 가질 수 있으며, 현재 어떤 타입의 값을 저장하고 있는지 항상 기억합니다. 기존 C 스타일 공용체와 달리 타입 정보가 없어 발생할 수 있는 오류를 컴파일 또는 런타임에 방지할 수 있습니다. C++ 버전별 주요 키워드 도입 시기C++17: std::variant가 처음 도입되었습니다. 내용 설명std::variant는 템플릿 인자로 명시된 타입들 중 하나의 인스턴스만 저장할 수 있는 컨테이너입니다. 예를 들어 std::variant은 int, double, std::string 중 하나의 값만 가질 수 있습니다.주요 기능.. 2025. 9. 29.
Modern C++ : std::optional (17) std::optional 개요std::optional은 C++17부터 도입된 기능으로, 값이 있을 수도 있고 없을 수도 있는 상황을 명시적으로 표현하는 데 사용되는 템플릿 클래스입니다. 함수가 유효한 값을 반환하지 못하는 경우, 이전에는 nullptr나 특별한 값(예: -1)을 반환하여 실패를 알렸습니다. std::optional은 이러한 상황을 더 안전하고 명확하게 처리할 수 있는 방법을 제공합니다. C++ 버전별 주요 키워드 도입 시기C++17: std::optional 도입 내용 설명std::optional 객체는 타입 T의 값을 포함하거나, 아무 값도 포함하지 않는 두 가지 상태를 가질 수 있습니다. 값이 없는 상태는 std::nullopt를 사용하여 표현합니다.주요 멤버 함수는 다음과 같습니다... 2025. 9. 28.
Modern C++ : Type Traits 2 (11, 14, 17, 20) Type Traits 2개요타입 특성(Type Traits)은 컴파일 시간에 타입에 대한 정보를 얻거나 타입을 변환하는 데 사용되는 템플릿 기반의 메커니즘입니다. 헤더에 정의된 클래스 템플릿들을 통해, 특정 타입이 정수형인지, 포인터인지, 혹은 두 타입이 동일한지 등을 확인할 수 있습니다. 이를 활용하면 템플릿 프로그래밍에서 타입에 따른 조건부 컴파일, static_assert를 이용한 타입 제약, 오버로드 해석 제어(SFINAE) 등을 효과적으로 구현할 수 있습니다.C++ 버전별 주요 키워드 도입 시기C++11: 헤더와 함께 대부분의 핵심 타입 특성들이 도입되었습니다. (std::is_same, std::is_integral, std::enable_if, std::conditional 등)C++14.. 2025. 9. 27.
Modern C++ : Variadic Templates and Fold Expressions (11, 17) Variadic Templates and Fold Expressions 개요C++에서 템플릿은 강력한 제네릭 프로그래밍 도구입니다. Variadic Templates는 임의의 개수의 템플릿 인자를 받을 수 있게 하여 템플릿의 유연성을 극대화합니다. 이를 통해 printf와 같이 가변 인자를 받는 함수를 타입에 안전하게 구현할 수 있습니다.Fold Expressions는 C++17부터 도입된 기능으로, Variadic Template의 파라미터 팩(parameter pack)을 매우 간결하고 직관적인 방식으로 처리할 수 있게 해주는 구문입니다.이 문서에서는 Variadic Templates의 기본 개념과 재귀를 이용한 고전적인 처리 방식, 그리고 C++17의 Fold Expressions를 활용한 현대적인.. 2025. 9. 26.
Modern C++ : std::concepts (20) std::concepts 개요C++ Concepts는 템플릿 파라미터에 대한 제약 조건을 명시적으로 표현하는 기능입니다. 템플릿이 특정 요구사항(예: 특정 멤버 함수나 연산자를 지원)을 만족하는 타입에 대해서만 인스턴스화되도록 강제할 수 있습니다. 이를 통해 컴파일 타임에 타입 요구사항을 검증하고, 의도에 맞지 않는 타입이 사용될 경우 훨씬 명확하고 이해하기 쉬운 에러 메시지를 생성할 수 있습니다. C++ 버전별 주요 키워드 도입 시기C++20: concept, requires 키워드가 도입되어 Concepts 기능이 표준으로 채택되었습니다. 내용 설명Concepts는 concept 키워드를 사용하여 정의하며, requires 절을 통해 템플릿 파라미터가 만족해야 할 제약 조건을 기술합니다. 여러 Con.. 2025. 9. 25.
Modern C++ : Type Traits 1 (11, 14, 17, 20) Type Traits 1 개요Type traits는 C++ 템플릿 메타프로그래밍의 핵심 기능 중 하나로, 컴파일 시간에 타입에 대한 정보를 질의하거나 타입을 변환하는 데 사용되는 템플릿 클래스 집합입니다. 헤더 파일에 정의되어 있으며, 이를 통해 코드의 유연성과 안정성을 크게 향상시킬 수 있습니다.주요 용도는 다음과 같습니다.타입 검사: 특정 타입이 정수형, 부동소수점형, 클래스 등 특정 카테고리에 속하는지 확인합니다.타입 속성 확인: 타입이 const 한정자를 가졌는지, 포인터인지 등을 확인합니다.타입 관계 확인: 두 타입이 동일한지, 한 타입이 다른 타입으로 변환 가능한지 등을 확인합니다.타입 변환: 타입에 const를 추가하거나 포인터를 제거하는 등의 변환을 수행합니다.특히 static_asser.. 2025. 9. 24.
Modern C++ : 템플릿 특수화 (Template Specialization) (98, 11, 17) 템플릿 특수화 (Template Specialization) 개요템플릿 특수화(Template Specialization)는 특정 타입에 대해 일반적인 템플릿 구현과 다르게 동작하는 특별한 버전을 제공하는 C++ 기능입니다. 이를 통해 특정 타입에 최적화되거나 특별한 동작을 수행하는 코드를 작성할 수 있습니다. 예를 들어, 일반 템플릿 함수가 모든 타입에 대해 동일한 로직을 수행하지만, 특정 타입(예: std::string)에 대해서는 다른 로직을 수행해야 할 때 유용하게 사용됩니다. C++ 버전별 주요 키워드 도입 시기C++98: 템플릿(Template) 개념과 함께 템플릿 특수화(Template Specialization)가 표준에 도입되었습니다.C++11: extern template 키워드가 도입.. 2025. 9. 23.
Modern C++ : 복사 및 이동 의미론 (Copy and Move Semantics) (98, 11) 복사 및 이동 의미론 (Copy and Move Semantics) 개요C++에서 객체를 다룰 때, 객체의 데이터를 복사하거나 소유권을 이전하는 방식은 매우 중요합니다. 특히 동적 할당된 메모리와 같은 리소스를 관리하는 클래스의 경우, 이러한 동작을 어떻게 정의하느냐에 따라 프로그램의 성능과 안정성이 크게 달라집니다.복사 의미론(Copy Semantics): 기존 객체의 내용을 그대로 복사하여 새로운 객체를 생성하거나 다른 객체에 대입합니다. 원본과 사본은 독립적인 리소스를 가집니다.이동 의미론(Move Semantics): 기존 객체(주로 임시 객체)의 리소스 소유권을 새로운 객체로 '이동'시킵니다. 불필요한 데이터 복사를 피할 수 있어 성능이 크게 향상됩니다. 원본 객체는 리소스를 잃고 비어 있는(v.. 2025. 9. 22.