유니폼 초기화는 객체의 초기화를 보다 간단한 코드만으로 구현할 수 있는 기능입니다. 예를 들어 다음과 같은 Product라는 클래스가 있다고 할때 이 Product 클래스의 객체를 초기화하여 생성하는 경우를 예를 들어 보겠습니다.
#include "stdafx.h" #include#include using namespace std; class Product { private: string name; int cost; public: Product(const string& name, int cost) : name(name), cost(cost) {} }; int _tmain(int argc, _TCHAR* argv[]) { Product r("Apple", 100); return 0; }
이미 흔히 알고 있는 방식으로 18번 코드와 같이 객체를 초기화하면서 생성하고 있습니다. 이런 초기화 방식에 대해 C++11은 다음과 같은 방식도 지원합니다.
#include "stdafx.h" #include#include using namespace std; class Product { private: string name; int cost; public: Product(const string& name, int cost) : name(name), cost(cost) {} }; int _tmain(int argc, _TCHAR* argv[]) { Product r {"Apple", 100}; return 0; }
변경된 부분은 15번 코드입니다. 바로 () 대신에 {}를 사용해 초기화를 하고 있습니다. 여기까지는 별 것 없는 것 같습니다만 이러한 초기화 방식이 유니폼 초기화(Uniform Initializer)입니다. 이 별것 없을 것 같은 초기화 방식이 배열이나 콜렉션(Collection, Container)에서는 다음처럼 응용되어 사용할 수 있습니다.
#include "stdafx.h" #include#include #include using namespace std; class Product { private: string name; int cost; public: Product(const string& name, int cost) : name(name), cost(cost) {} }; int _tmain(int argc, _TCHAR* argv[]) { vector v { {"Apple", 100}, {"Orange", 200}, {"Grape", 300} }; return 0; }
유니폼 초기화를 이용하여 vector 컨테이너에 3개의 객체를 생성하고 있습니다. 이러한 방식을 이용하지 않고 3개의 객체를 초기화하여 컨테이너에 추가하는 기존의 코드를 생각해 본다면 이러한 유니폼 초기화 방식이 얼마나 직관적인지 쉽게 짐작해 볼 수 있습니다.