🔖 INDEX
초기화 목록 (Initializer Lists)
C++11에서 도입된 초기화 목록(Initializer Lists)은 중괄호 {}를 사용하여 여러 값으로 객체를 초기화할 수 있게 해주는 문법입니다. 이를 통해 배열, 컨테이너, 사용자 정의 타입 등의 객체 초기화가 간결하고 명료하게 이루어집니다.
기본 사용 방법
배열
int arr[] = {1, 2, 3, 4, 5};
STL 컨테이너
std::vector<int> vec = {1, 2, 3, 4, 5};
사용자 정의 타입
class MyClass {
private:
int x, y;
public:
MyClass(int a, int b) : x(a), y(b) {}
};
MyClass obj = {3, 4}; // MyClass의 생성자를 사용하여 초기화
std::initializer_list 타입
C++11에서는 std::initializer_list라는 템플릿 클래스가 도입되었는데, 이는 초기화 목록으로 전달되는 값들을 저장합니다. 사용자 정의 타입에서 초기화 목록을 받아들이려면 std::initializer_list를 사용하면 됩니다.
#include <initializer_list>
class IntArray {
private:
std::vector<int> data;
public:
IntArray(std::initializer_list<int> list) : data(list) {}
void print() {
for (int val : data) {
std::cout << val << " ";
}
}
};
int main() {
IntArray arr = {1, 2, 3, 4, 5};
arr.print(); // 1 2 3 4 5 출력
}
장점
- 간결성: 초기화 목록을 사용하면 객체 초기화 코드가 더욱 간결해집니다.
- 타입 안정성: 컴파일 타임에 초기화 데이터의 타입을 검사하여 타입 불일치 오류를 줄입니다.
- 범용성: 다양한 타입의 객체에 대해 일관된 초기화 방식을 제공합니다.
주의사항
초기화 목록과 생성자 오버로드 간의 충돌이 발생할 수 있으므로 주의가 필요합니다. 초기화 목록이 우선적으로 고려되기 때문에 생성자의 정의와 초기화 목록을 혼동하지 않도록 주의해야 합니다.
템플릿 형식 추론 및 decltype
C++에서 템플릿은 코드의 재사용성을 극대화하기 위한 강력한 도구입니다. 특히, 템플릿 형식 추론과 decltype은 C++11에서 도입된 기능으로, 코드의 표현력과 유연성을 높여줍니다.
템플릿 형식 추론
템플릿 함수가 호출될 때, 컴파일러는 전달된 인수를 기반으로 템플릿 매개변수의 타입을 추론합니다.
template <typename T>
void print(const T& value) {
std::cout << value << std::endl;
}
int main() {
int a = 5;
double b = 3.14;
print(a); // T는 int로 추론됨
print(b); // T는 double로 추론됨
}
decltype
decltype은 표현식의 타입을 추론하여 그 타입을 반환하는 키워드입니다. 주로 템플릿 코드 내에서 연산의 결과 타입을 결정할 때 유용하게 사용됩니다.
template <typename T, typename U>
auto add(const T& a, const U& b) -> decltype(a + b) {
return a + b;
}
int main() {
int a = 5;
double b = 3.14;
auto result = add(a, b); // decltype(a + b)는 double로 추론됨
std::cout << result << std::endl; // 8.14 출력
}
decltype과 auto의 조합
C++14부터는 반환 타입 추론을 위해 decltype과 auto를 조합해서 사용할 수 있습니다.
template <typename T, typename U>
auto add(const T& a, const U& b) {
return a + b; // 반환 타입은 'a + b'의 타입으로 자동 추론됨
}
장점
- 코드 유연성: 특히, 복잡한 템플릿 코드에서 다양한 타입에 대응할 수 있게 됩니다.
- 타입 안정성: decltype을 활용하면 연산 결과의 타입을 정확하게 추론할 수 있어, 예기치 않은 타입 변환 오류를 방지할 수 있습니다.
템플릿 별칭 (Template Aliases)
C++11부터는 "템플릿 별칭"이라는 기능이 도입되었습니다. 템플릿 별칭은 기존에 있는 타입에 대해 새로운 이름을 지정해주는 기능입니다. 특히 복잡한 템플릿 타입에 대해서 간결한 이름을 부여할 수 있어, 코드의 가독성이 크게 향상됩니다.
기본 사용 방법
템플릿 별칭을 정의할 때에는 using 키워드를 사용합니다.
template <typename T>
using Vec = std::vector<T>;
Vec<int> intVector; // std::vector<int>와 동일
Vec<double> doubleVector; // std::vector<double>와 동일
복잡한 타입에 대한 별칭
템플릿 별칭은 복잡한 템플릿 타입, 예를 들어, 함수 포인터나 맵 등에 대한 별칭을 제공하는데 특히 유용합니다.
template <typename Key, typename Value>
using MyMap = std::map<Key, std::pair<Value, bool>>;
MyMap<std::string, int> exampleMap;
위 예제에서 MyMap은 std::map에 대한 별칭으로, 값의 타입으로 std::pair<Value, bool>을 사용하게 됩니다.
템플릿 별칭의 장점
- 가독성 향상: 복잡한 템플릿 타입을 간결하게 표현하여 코드의 가독성을 크게 향상시킵니다.
- 타입 정의의 일관성: 같은 타입에 대해 여러 부분에서 반복해서 사용할 때, 템플릿 별칭을 통해 일관된 타입 정의를 유지할 수 있습니다.
- 코드 유지 보수: 타입을 수정해야 할 경우, 별칭을 정의한 한 곳만 수정하면 되므로 코드의 유지 보수가 용이해집니다.
'프로그래밍 > C++' 카테고리의 다른 글
C++11 주요 업데이트 : std::forward_list, std::unordered_map, std::unordered_set (0) | 2023.10.03 |
---|---|
C++11 주요 업데이트 : override, final, std::thread, std::array (0) | 2023.09.30 |
C++11 주요 업데이트 : auto, nullptr, 람다 식 (0) | 2023.09.30 |
C++의 메모리 관리 : 동적 할당, 스마트 포인터 (0) | 2023.09.29 |
C++ 함수 포인터 (Function Pointer) (0) | 2023.09.29 |
댓글