공부/C++
C++ 변수 선언 (uniform initialization), preventing narrow
하나리나
2022. 1. 4. 22:29
반응형
개인공부를 위한 기록입니다. 잘못된 점에 대한 지적 감사드립니다.
C++11 부터는 중괄호와 등호를 이용하여 변수를 선언할 수 있습니다.
중괄호{}를 사용한 변수 선언은 일관된 초기화(Uniform Initialization)라고 합니다.
예시로 확인 하겠습니다.
1. 먼저, 등호를 사용한 초기화 입니다.
// 1. 등호를 사용한 초기화 Copy initialization
int n1 = { 0 };
int x1[3] = { 1,2,3 };
Point p1 = { 1,2 };
2. 중괄호를 사용한 변수 선언입니다.
// 2. 등호 없이 초기화 Direct initialization
int n2{ 0 };
int x2[3]{ 1,2,3 };
Point p2{ 1,2 };
Uniform Initialization을 사용하면 데이터 손실을 방지할 수 있습니다.(Data-> Preventing Narrow)
// 일관된 초기화를 통한 데이터 손실 방지
int n1 = 3.14; // ok. 하지만 3으로 축소, 버그의 원인이 될 수 있음
int n2 = { 3.14 }; // error. 데이터 손실이 발생하는 초기화는 X
char c1 = 300; // ok. 하지만 overflow 발생
char c2 = { 300 }; // error. 300은 1바이트에 담을 수 없음
주석을 보시면 쉽게 확인하실 수 있습니다.
int n1 = 3.14; 로 초기화하면, 암시적 형변환이 가능합니다.
그러나, int n2 = {3.14};는 초기화가 불가능합니다.
char c1 = 300;은 overflow가 발생하지만 가능은합니다.
char c2 = {300}의 경우, 300은 1바이트에 담을 수 없으므로 에러가 발생합니다.(integer는 4byte에 저장합니다.)
이와 같이, 변수 초기화 시 Uniform Initialization을 이용하여 코드를 안전하게 작성할 수 있습니다.
반응형