본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 7. C++ 일관된 초기화(uniform initialization)

by 신림83 2020. 10. 8.
반응형

CPP 초급 강좌 7. C++ 일관된 초기화(uniform initialization)

c++11 에서 도입된 uniform initalization 일관된 초기화란 무엇이고 왜 필요한 것일까요?

 

일관된 초기화

int n1 = 10;		//1번
int n2 = { 10 };	//2번

 일관된 초기화를 모르시는 분들은 1번과 같은 초기화 코드를 많이 이용하셨을 겁니다. 2번과 같이 표현하는 방식을 일관된 초기화라고 칭합니다. 마치 변수나 구조체를 초기화하는 코드와 유사하죠.

 

이전 코드 초기화 방식을 보면

struct Point { int x, y; };

int main()
{
	int n1 = 0;
	int n2(0);
	int x[10] = { 1,2,3,4,5,6,7,8,9,10 };
	Point p = { 1, 1 };
}

여러 가지 방법이 존재합니다.

=

()

{} //배열과 구조체, 클래스 등의 초기화

 

일관된 초기화 방식을 쓰면 코드를 통일할 수 있습니다.

가독성면에서 좋다.

int n1 = { 0 };
int n2{ 0 };
int x[10] = { 1,2,3,4,5,6,7,8,9,10 };
Point p = { 1, 1 };

 

그럼 또 다른 케이스를 보겠습니다.

암시적 형변환 체크

int main()
{
	int n1 = 3.14f;
	char c = 1000;
}

다음과 같은 코드가 있다고 가정할 때, n1은 정수형, c 는 바이트라서 1000은 큰 수입니다. 코드를 빌드해보면 일단 빌드는 됩니다. 컴파일러에 따라서 워닝이 나올 수도 있고 아닐 수도 있습니다. 

 

이와 같은 워닝을 보실수 있습니다.

하지만 빌드는 됩니다. c++는 이미 이와 같은 경우 암시적 형 변환으로 처리합니다. 하지만 의도와는 다를 수 있습니다. 이와 같은 실수는 협업에서도 종종 일어나며, 디버깅하기 쉽지 않습니다.

 

여기에 일관된 초기화 방식을 적용해 보면

int main()
{
	int n1 = { 3.14f };
	char c = { 1000 };
}

 빌드 시도 시

에러로 표기된다.

암시적 형 변환으로 처리되지 않고, 에러를 띄웁니다. 수식표현과 형변환 우려가 있을 경우 사용하면 참 좋습니다.

 

이와 같이 데이터 손실이 발생할 경우 컴파일 에러 발생을 'prevent narrow' 라고 표현합니다. 알아두시면 좋습니다.

 

함수 인자로도 일관된 초기화를 사용할 수 있습니다.

struct Point { int x, y; };

void test0(int i) {}
void test1(int i) {}
void test2(Point p) {}

int main()
{
	test0(0);	//1번
	test0({ 0 });	//2번
	test2({ 1,2 }); //3번
}

2번 같은 경우 일관된 초기화 계념을 모르시면 뭔지 한참 보실 수 있습니다. 알아두시면 편합니다. 3번 같은 경우는 구조체 초기화입니다.

반응형

댓글