C++11이란?
C++11은 표준 C++ 언어의 주요 버전 중 하나로, 2011년 8월 12일 국제표준화기구(ISO)의 공식 승인을 받았습니다. 이후 C++14와 C++17이 연이어 발표되었으며, C++11은 핵심 언어 자체에 수많은 기능과 개선 사항을 추가한 중요한 업데이트로 평가받고 있습니다.
그렇다면 C++11에서는 어떤 새로운 변화가 도입되었을까요? 대표적인 변경 사항을 하나씩 살펴보겠습니다.
1. nullptr
기존에는 널 포인터를 나타낼 때 정수 값 0을 사용했으며, 이로 인해 정수 타입으로 암묵적으로 변환되는 문제가 있었습니다. C++11에서는 std::nullptr_t 타입의 nullptr 리터럴이 새롭게 도입되어 이러한 암묵적 변환 문제를 해결했습니다.
2. 람다(Lambda) 표현식
람다 표현식은 함수를 지역적으로 정의할 수 있게 해주는 기능입니다. 이름 없는 익명 함수라고도 불리며, std::function 같은 함수 객체가 필요한 곳이라면 어디서든 활용할 수 있어 코드를 간결하게 작성하는 데 큰 도움이 됩니다.
3. 스마트 포인터(Smart Pointers)
과거에는 auto_ptr이 유일한 스마트 포인터였지만, 현재는 사용이 권장되지 않습니다(deprecated). C++11에서는 메모리 관리를 더욱 안전하게 해주는 세 가지 스마트 포인터가 새로 추가되었습니다.
- shared_ptr : 여러 포인터가 소유권을 공유
- unique_ptr : 단독 소유권만 허용
- weak_ptr : 소유권 없이 객체를 참조
4. auto 키워드
이전 버전에서는 변수를 선언할 때 반드시 타입을 명시해야 했습니다. 하지만 C++11부터는 auto 키워드를 사용하면 컴파일러가 초기화 값을 기반으로 타입을 자동으로 추론하기 때문에, 타입을 직접 지정하지 않고도 변수를 선언할 수 있습니다.
5. override와 final
C++11에서는 두 가지 새로운 식별자가 도입되었습니다. override는 해당 메서드가 기반 클래스의 가상 함수를 재정의한다는 것을 명시적으로 나타내며, final은 파생 클래스에서 더 이상 해당 가상 함수를 재정의하지 못하도록 제한합니다. 이를 통해 실수로 인한 버그를 컴파일 시점에 잡아낼 수 있습니다.
6. 삭제된 함수와 기본 함수(Deleted & Defaulted Functions)
=delete; 문법을 사용하면 객체 복사와 같은 특정 동작을 의도적으로 차단할 수 있어, 복사를 방지해야 하는 클래스 설계에 유용합니다. 반대로 =default;를 사용하면 컴파일러에게 함수의 기본 구현을 자동으로 생성하도록 지시할 수 있습니다.
7. 범위 기반 for 루프(Range-based for Loops)
C++11은 컬렉션을 순회하기 위한 범위 기반 for 루프를 도입했습니다. C 스타일 배열을 포함한 다양한 컨테이너를 'foreach' 방식으로 간편하게 순회할 수 있게 되었습니다.
8. 강력한 형식의 열거형(Strongly-typed Enums)
전통적인 enum은 열거자(enumerator)들이 주변 스코프로 노출되는 문제가 있었습니다. C++11에서는 enum class 키워드를 통해 열거자가 외부 스코프로 새어 나가지 않도록 하여, 더욱 안전하고 명확한 열거형 사용이 가능해졌습니다.
9. static_assert와 타입 특성(Type Traits)
static_assert는 컴파일 시점에 조건을 검사하는 기능입니다. 조건이 참이면 아무런 출력이 없지만, 거짓일 경우 컴파일 오류 메시지를 표시하여 런타임 이전에 문제를 발견할 수 있도록 도와줍니다.
10. 새로운 C++ 알고리즘
C++11 표준 라이브러리는 all_of(), any_of(), none_of()와 같은 새로운 알고리즘을 추가했습니다. 이를 통해 컬렉션의 요소들을 조건에 따라 손쉽게 검사할 수 있습니다.
마무리
C++11은 현대 C++ 프로그래밍의 기반을 마련한 기념비적인 표준입니다. nullptr, 람다, 스마트 포인터, auto 등 소개된 기능들은 지금도 실무 개발에서 필수적으로 활용되고 있으므로, C++ 개발자라면 반드시 숙지해야 할 내용입니다.