중괄호 초기화 - 1. 사용 용도
목차
- 01. Intro
- 02. 중괄호 초기화
- 중괄호 초기화란?
- 장&단점
- 사용 예시
- 03. 마무리
- 04. 연관 내용
01. Intro
오늘은 C++11에서 추가된 새로운 초기화 기법인 [중괄호 초기화]에 대해 알아보겠습니다.
02. 중괄호 초기화
중괄호 초기화란?
중괄호 초기화는 C++11에 추가된 새로운 초기화 방식입니다.
기존에는 초기화할 수 있는 방식이 2가지가 있었습니다.
1. [=]를 이용한 초기화 방식
int x = 100;
2. 생성자 스타일의 초기화 방식
int y(200);
여기에서, 중괄호를 사용한 초기화 방식은 아래와 같습니다.
int z{ 300 };
int w = { 400 };
중괄호 안에 아무런 값을 넣지 않으면, 기본값으로 초기화됩니다.
int i{};
double d{};
그래서, 위 코드에서의 변수 i는 0으로 변수 d는 0.0으로 초기화됩니다.
중괄호 초기화는 vector과 같은 컨테이너나 구조체에서 초기화할 때, 유용하게 사용됩니다.
참고로, 배열은 C++11 이전 버전에서도 중괄호 초기화를 사용할 수 있었습니다.
- vector에서 초기화
vector<int> vec{ 100, 200, 300, 400, 500 };
- 구조체에서 초기화
#include <iostream>
#include <vector>
using namespace std;
struct Info
{
int x = 0;
int y = 0;
int z = 0;
};
int main()
{
Info info{ 100, 200, 300 };
cout << "x : " << info.x << ", y : " << info.y << ", z : " << info.z << "\n";
return 0;
}
구조체에서도 중괄호 초기화를 사용할 수 있습니다.

클래스의 멤버 변수처럼, 구조체도 가장 먼저 선언된 변수부터 낮은 메모리 주소에 누적됩니다.


그래서, 100, 200, 300은 각각 구조체 멤버 변수의 x, y, z에 대입됩니다.
추가로, 구조체에서도 중괄호 안에 아무런 값을 넣지 않으면, 구조체 멤버 변수 타입의 기본값으로 초기화됩니다.
int main()
{
Info info{};
cout << "x : " << info.x << ", y : " << info.y << ", z : " << info.z << "\n";
return 0;
}

장&단점
장점
1. 배열과 같은 container나, 구조체에서 초기화하기 편합니다.
2. 축소 변환(좁은 변환 = Narrowing Conversion)을 방지합니다.
즉, 컴파일러가 데이터를 자동으로 변환하는 것을 방지합니다.
int main()
{
int i = 100.0;
return 0;
}
기존에는 위 코드처럼 초기화를 진행할 경우, 컴파일러가 자동으로 double형에서 int형으로 변환한 뒤에 초기화를 했습니다.
int main()
{
int i{ 100.0 };
return 0;
}
하지만, 중괄호 초기화로 진행할 경우, 컴파일러 시, 에러 메시지가 출력됩니다.

double형에서 int형으로 변환하려면, 좁은 변환을 요구해 변환을 할 수 없다고 합니다.
단점
vector처럼 클래스도 Initialize_list를 통해서 중괄호 초기화를 할 수 있습니다.
클래스의 Initialize_list 생성자는 다른 종류의 생성자를 모두 무효화시킬 정도로 강력한 생성자가 됩니다.
그래서, 기존 생성자보다 우선순위가 높아 같은 형태여도 Initialize_list 생성자가 호출됩니다.
이는 추후에 자세히 알아보도록 하겠습니다.
사용 예시
알고리즘 문제를 해결할 때, 특히 커스텀 구조체나 pair 구조체를 사용하는 경우가 많습니다.
그래서, 이러한 상황에서 중괄호 초기화를 사용할 경우 편리합니다.
중괄호 초기화를 알기 전에는, 다익스트라나 최소 스패닝 트리 문제에서 아래 코드처럼 구조체를 사용했습니다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Line
{
int x = 0;
int y = 0;
int cost = 0;
// 구조체 생성자
Line() = default;
Line(int x, int y, int cost) : x(x), y(y), cost(cost) {}
bool operator<(const Line& other) const
{
return cost > other.cost;
}
};
int main()
{
// 우선순위 큐
priority_queue<Line> pq;
pq.push(Line(1, 5, 10));
pq.push(Line(2, 4, 50));
pq.push(Line(3, 4, 30));
pq.push(Line(4, 1, 40));
pq.push(Line(5, 4, 20));
// 출력
while (pq.empty() == false)
{
Line line = pq.top();
pq.pop();
cout << "x : " << line.x << ", y : " << line.y << ", cost : " << line.cost << endl;
}
return 0;
}
구조체의 생성자를 작성하고, 우선순위 큐에 넣을 Line 객체를 생성하기 위해 Line()를 사용했습니다.
하지만, 중괄호 초기화를 알게 된 후부터는, 아래 코드처럼 간략하게 사용할 수 있었습니다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Line
{
int x = 0;
int y = 0;
int cost = 0;
bool operator<(const Line& other) const
{
return cost > other.cost;
}
};
int main()
{
// 우선순위 큐
priority_queue<Line> pq;
pq.push({ 1, 5, 10 });
pq.push({ 2, 4, 50 });
pq.push({ 3, 4, 30 });
pq.push({ 4, 1, 40 });
pq.push({ 5, 4, 20 });
// 출력
while (pq.empty() == false)
{
Line line = pq.top();
pq.pop();
cout << "x : " << line.x << ", y : " << line.y << ", cost : " << line.cost << endl;
}
return 0;
}
구조체의 생성자 부분을 사용하지 않고, 우선순위 큐에 넣을 때, 구조체명인 Line을 더 이상 작성하지 않아도 됩니다.

위 코드를 실행하면, cost별로 오름차순 정렬되어 출력됩니다.
03. 마무리
오늘은 중괄호 초기화에 대해서 알아봤습니다.
중괄호 초기화를 사용하면서, 알고리즘 문제 중 구조체를 활용하는 부분에서 시간을 조금이나마 절약하게 되어 자주 사용하고 있습니다.
04. 연관 내용
- [C++] 중괄호 초기화 - 2.initializer_list
[C++] 중괄호 초기화 - 2. initializer_list
목차01. Intro02. initializer_listinitializer_list란?클래스 생성자에서 활용explicit 키워드와 활용주의점03. 마무리04. 연관 내용01. Intro오늘은 중괄호 초기화에서 사용하는 [initializer_list]에 대해 알아보겠습
epidemic-barcode.tistory.com
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 동적 할당 - new/delete (0) | 2025.03.21 |
|---|---|
| [C++] 중괄호 초기화 - 2. initializer_list (0) | 2025.03.20 |
| [C++] auto 키워드 (0) | 2025.03.18 |
| [C++] explicit 키워드 (0) | 2025.03.17 |
| [C++] static 키워드 (1) | 2025.03.16 |