C++11부터 도입된 균일 초기화(Uniform Initialization)는 변수와 객체를 초기화할 때 하나의 일관된 문법을 사용할 수 있게 해주는 기능입니다. 기본 자료형(int, double 등)부터 배열, 클래스 객체에 이르기까지 모든 타입에 동일한 방식을 적용할 수 있습니다.
핵심은 중괄호 초기화(brace-initialization)입니다. 말 그대로 중괄호 {}를 사용해 초기화 값을 감싸는 방식으로, 코드의 가독성을 높이고 초기화 문법의 혼란을 줄여줍니다.
기본 문법
type var_name{argument_1, argument_2, .... argument_n}예를 들어 다음과 같이 작성할 수 있습니다.
int a{10}; // int형 변수 초기화
double d{3.14}; // double형 변수 초기화
int arr[3]{1, 2, 3}; // 배열 초기화동적 할당 배열 초기화하기
균일 초기화는 new로 동적 할당한 배열도 간결하게 초기화할 수 있게 해줍니다.
예제 (C++)
#include <bits/stdc++.h>
using namespace std;
int main() {
int* pointer = new int[5]{ 10, 20, 30, 40, 50 };
cout << "배열의 내용: ";
for (int i = 0; i < 5; i++)
cout << pointer[i] << " ";
}출력 결과
배열의 내용: 10 20 30 40 50
C++11 이전에는 동적 할당 배열의 요소를 하나씩 대입해야 했지만, 균일 초기화를 사용하면 한 줄로 모든 값을 설정할 수 있습니다.
클래스의 배열 멤버 초기화하기
클래스 생성자의 멤버 초기화 리스트에서도 중괄호 문법을 활용해 배열 멤버를 손쉽게 초기화할 수 있습니다.
예제
#include <iostream>
using namespace std;
class MyClass {
int arr[3];
public:
MyClass(int p, int q, int r) : arr{ p, q, r } {}
void display() {
cout << "배열의 내용: ";
for (int c = 0; c < 3; c++)
cout << *(arr + c) << ", ";
}
};
int main() {
MyClass ob(40, 50, 60);
ob.display();
}출력 결과
배열의 내용: 40, 50, 60,
생성자 본문에서 배열 요소를 하나씩 대입하는 번거로운 방식 없이, 멤버 초기화 리스트에서 바로 배열 전체를 초기화할 수 있다는 점이 큰 장점입니다.
반환 값 암시적 초기화
함수에서 객체를 반환할 때도 중괄호만으로 반환 객체를 암시적으로 생성하고 초기화할 수 있습니다.
예제
#include <iostream>
using namespace std;
class MyClass {
int p, q;
public:
MyClass(int i, int j) : p(i), q(j) {}
void display() {
cout << "(" << p << ", " << q << ")";
}
};
MyClass func(int p, int q) {
return { p, q }; // 암시적으로 MyClass(p, q) 생성
}
int main() {
MyClass ob = func(40, 50);
ob.display();
}출력 결과
(40, 50)
return { p, q } 구문은 컴파일러가 자동으로 MyClass(p, q) 임시 객체를 만들어 반환하도록 처리합니다.
함수 매개변수 암시적 초기화
마찬가지로 함수 호출 시 인자 목록에 중괄호를 사용하면 해당 클래스 타입의 매개변수가 암시적으로 생성되어 전달됩니다.
예제
#include <iostream>
using namespace std;
class MyClass {
int p, q;
public:
MyClass(int i, int j) : p(i), q(j) {}
void display() {
cout << "(" << p << ", " << q << ")";
}
};
void func(MyClass p) {
p.display();
}
int main() {
func({ 40, 50 }); // 암시적으로 MyClass(40, 50) 생성
}출력 결과
(40, 50)
정리
균일 초기화는 C++11이 제공하는 강력하고 편리한 기능으로, 다음과 같은 상황에서 유용하게 활용됩니다.
- 모든 타입에 동일한 문법 적용 — 기본형, 배열, 클래스 객체까지 중괄호 하나로 통일
- 동적 할당 배열 초기화 —
new로 할당한 배열을 한 번에 초기화 - 클래스 배열 멤버 초기화 — 생성자 멤버 초기화 리스트에서 배열을 직접 초기화
- 암시적 객체 생성 — 함수의 반환값과 매개변수를 중괄호로 간결하게 표현
또한 중괄호 초기화는 좁히기 변환(narrowing conversion)을 금지하기 때문에, 의도치 않은 데이터 손실을 컴파일 시점에 잡아주는 안전성 이점도 함께 제공합니다.