본문 바로가기
UnrealEngine5/C++

C++에서의 =(이퀄)과 {}(중괄호)의 차이 간단 정리(Unreal Engine 5.1 기준)

by 개발의 묘미(GaeMyo) 2023. 3. 15.
SMALL

(대충 썸네일용 사진)

 

 

아래의 초기화 방식에서의 차이를 모른다면 꼭 이 글을 읽어 두자!!!

 

bool bUsedByA = false;

bool bUsedByA{false};

 

 

수많은 코드 플러그인들을 분석하고 뜯어보다 임시로 넘어간 의문들이 한 두 개가 아닐 테지만,

그 중에서도 이 부분에 대한 의문은 이 글로써 얼추 해결할 수 있을 것 같아.

 

위의 초기화 방식은 두 경우 모두 같은 값으로 초기화될거야.

그럼 무슨 차이가 있는 거냐고?

 

아래 코드로 같은 예시를 하나 더 들어 보자.

 

float aa = 13;
float a = 13.13f;



int b = a;

int bb{a};

 

우선 여기서  '=' 으로 초기화하는 방법은 복사 초기화(Copy Initialization)을 사용한 방법이야.

 

여기서 자료형이 float인 aa라는 변수에 '='를 사용해서 13을 할당해 주고,

암시적인 캐스팅을 통해서

본래 int 타입의 13을 flaot타입으로 변환해.

 

 

 

 

그리고 '{}'으로 초기화하는 방법은 리스트 초기화(List Initialization)을 사용한 방법이야.

 

이 방법은 C++11이후의 버전에서 사용할 수 있고,

초기화 해 주는 과정에서 암시적인 캐스팅을 허용하지 않는 경우가 있기 때문에,

좀 더 안전한 초기화를 할 수 있다는 장점이 있어.

 

여기서 암시적 캐스팅을 허용하지 않는 경우라고 하면,

바로 위의 코드에서

int bb{a}; //a에는 13.13이 들어가있음.

이 부분은 컴파일 에러가 발생하게 되는데,

float 자료형의 a 변수를 int 타입으로 초기화하면

0.13이라는 소수점 이하의 데이터는 손실될 수 있으니

컴파일러는 이 캐스팅을 허락해 주지 않을거야.

 

그럼 컴파일 에러가 나겠지?

컴파일 에러가 나는데 왜 {}이게 더 좋은 초기화 방법일까?

 

나는 개인적으로 코딩에 있어서의 에러라는 것은,

나쁜게 아닌 개발자 목숨 여럿을 살리는 좋은 놈이라고 생각해.

 

당장 에러가 나 준다면 바로 고칠 수 있잖아 ㅎㅎㅎ.

그리고 이러한 엄격한 방식 덕분에

데이터 손실도 방지할 수 있고 코드의 안전성 또한 높여줄 수 있는

장점을 제공받을 수 있어.

 

그럼 데이터 손실을 감수하고 저 내용 그대로 캐스팅을 하는 방법은 없을까?

 

물론 있어.

 

이렇게 내가 의도한 데이터 손실이다~ 라는 것을

명시적으로 적어 주면 우리의 귀여운 컴파일러도 알아듣고

컴파일 에러를 방출하지 않을 거야.

int bb{static_cast<int>(a)};

 

 

'static_cast' <= 이놈이 해외 괴물같은 개발자들이 짠 C++ 코드들만 뜯어가며 공부하는 나에겐

되게 자주 보던 형식이었는데 뭐 하는 아이인줄은 항상 모르고 넘어갔었는데 이번 기회에 알게 되어 참

다행이라는 생각이 들어.

 

후에 이 글을 보게 될 개발자들에게도 도움이 된다면 좋겠어 :D

반응형
SMALL