[C++] 중괄호 초기화 { }
👻 중괄호 초기화
이번 시간에는 변수 및 함수 초기화 시 중괄호를 이용한 초기화 방법에 대해 알아보자.
중괄호는
{ }
이다.
int a{ 0 };
Knight k{ k2 };
vector<int> v{ 1, 2, 3, 4 };
이렇게 변수명 바로 뒤에 중괄호를 사용해 초기화 할 값을 세팅해주면 쉽게 사용할 수 있다.
🌱 장점
중괄호 초기화도 C+11 이후에 나온 개념이며 해당 초기화 방법을 사용함으로써 생기는 장점 몇 가지가 존재한다.
-
초기화 문법의 일치화
어떠한 타입의 변수든 중괄호를 이용하여 작성하면 되기 때문에 중구난방이던 초기화 문법이 통일된다. -
축소 변환 방지
int x = 0;
double y{ x };
위와 같은 코드가 있다고 가정했을 때 데이터 손실이 생기는 축소 변환을 우려하여 프로젝트가 실행되지 않는다. 오버플로우 등을 방지할 수 있다는 장점이 있다.
- vector 등의 컨테이너와 잘 어울린다.
중괄호를 사용하면 컨테이너도 아주 간단하게 초기화할 수 있다.
🌱 단점
물론 단점도 존재한다. 기사 클래스에 초기화 리스트를 인자로 받는 생성자를 추가해보도록 하자.
class Knight {
public:
Knight() {
}
Knight(int a, int b) {
cout << "Knight(int, int)" << endl;
}
// 우선순위 짱
Knight(initializer_list<int> li) {
cout << "Knight(initializer_list)" << endl;
}
};
이렇게 된다면 int
타입의 인자를 두 개 받는 기사 클래스 선언부가 있다고 했을 때 어떤 생성자를 호출해야 할지 애매해진다는 단점이 있다.
Knight k{ 1, 2 };
중괄호를 사용하게 되면 무조건 초기화 리스트를 인자로 받는 생성자가 호출된다. 우선순위가 가장 높기 때문이다. int
타입의 인자 두 개를 받는 생성자를 호출하고 싶으면 일반 괄호를 사용해야 한다.
💡
initializer_list<int> li
를 인자로 받는 생성자를 통해 초기화 리스트에 접근할 수 있다.
🌱 괄호와 중괄호
괄호의 종류에 따라 코드 스타일을 두 가지로 나눌 수 있다.
- 괄호 초기화
( )
를 기본으로 간다.- 전통적인 C++ 문법이라 거부감이 없다.
- vector 등 특이한 케이스에 대해서만 중괄호 초기화를 사용하면 편리하다.
- 중괄호 초기화
{ }
를 기본으로 간다.- 초기화 문법을 일치화할 수 있다.
- 축소 변환을 방지해준다.
어떤 기준을 잡냐에 따라 개개인의 코드 스타일이 달라진다. 구글링을 좀 해보니 아무래도 현대 문법인 중괄호를 사용하여 예상 못한 버그를 미리 방지하는 식으로 생각하여 중괄호 초기화를 좀 더 선호하는 것 같다. 참고만 하자!!
👻 글을 마치며
이번 시간에는 중괄호 초기화에 대해 알아보았다. 예전부터 있었던 문법인 줄 알았는데 이 문법도 모던 C++ 문법인 걸 알고 새삼 신기했다. 아까 축소 변환이라는 말이 이해가 안 돼서 1시간 정도 헤맸던 것 같은데 결국 이해해서 기분이 좋다. 😋
Leave a comment