최근에는 엔진 코드 수정 할 일이 거의 없어서 잊고 있다가 문뜩 생각나서 정리 했습니다. 언리얼 엔진 코드를 리뷰하다 보면 !!
연산자를 종종 발견할 수 있습니다. 이 연산자는 정수나 다른 값을 명시적으로 bool
타입으로 변환할 때 사용되는 패턴입니다.
언리얼 엔진 코드에서 실제로 사용되는 예제를 살펴보겠습니다.
const bool bFoliageDiscardOnLoad = !!CVarFoliageDiscardDataOnLoad.GetValueOnGameThread();
위 코드는 다음과 같이 리팩토링할 수 있습니다.
const bool bShouldDiscardFoliageDataOnLoad = CVarFoliageDiscardDataOnLoad.GetValueOnGameThread() != 0;
!!
연산은 두 번의 논리 부정을 수행합니다.
const bool bFlag = !!SomeIntegerValue;
SomeIntegerValue
가 0이 아닌 경우 → true
SomeIntegerValue
가 0인 경우 → false
!
: 값을 bool
로 변환하고 반전!
: 다시 반전하여 원래 논리값 유지의도의 명확성
"이 값을 논리값으로 사용하려고 명시적으로 변환한다"는 의도를 코드에서 명확하게 표현할 수 있습니다.
코드 일관성
언리얼 엔진 내부에서 일관되게 사용되는 패턴으로, 엔진 코드와 스타일을 맞출 수 있습니다.
가독성 논란
일부 개발자는 !!
표기법이 직관적이지 않다고 느낄 수 있습니다.
대안 존재
명시적 비교문이나 캐스팅을 선호하는 개발자도 있습니다.
const bool bFlag = CVarValue != 0;
const bool bFlag = static_cast<bool>(Value);
const bool bFlag = (bool)Value;
const bool bFoliageDiscardOnLoad = !!CVarFoliageDiscardDataOnLoad.GetValueOnGameThread();
const bool bShouldDiscardFoliageDataOnLoad = CVarFoliageDiscardDataOnLoad.GetValueOnGameThread() != 0;
bFoliageDiscardOnLoad
→ bShouldDiscardFoliageDataOnLoad
로 변경하여 의도를 더 명확하게 표현!!
연산자를 제거하고 명시적 비교로 대체하여 코드의 의도를 분명하게 함언리얼 엔진 개발자라면 !!
연산자 사용이 익숙할 수 있습니다. 그러나 프로젝트의 코딩 스타일 가이드에 따라 적절히 선택하는 것이 중요합니다.
!!
연산자는 언리얼 엔진 코드에서 간결함과 의도 전달의 목적으로 자주 사용됩니다. 두 가지 스타일(!! vs 명시적 비교) 모두 사용 가능하지만, 프로젝트의 코딩 스타일 가이드와 팀의 선호도를 고려하여 일관성 있게 사용하는 것이 중요합니다.
작성일: 2025년 10월 15일
대상 독자: 초급 테크니컬 아티스트
난이도: 중급