본문 바로가기
  • 공부, 여행 리뷰해요~~!!
공부/C++

C++ 변수 선언 (uniform initialization), preventing narrow

by 하나리나 2022. 1. 4.
반응형

개인공부를 위한 기록입니다. 잘못된 점에 대한 지적 감사드립니다.

 

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을 이용하여 코드를 안전하게 작성할 수 있습니다.

반응형