언리얼 엔진의 !! 연산자 (Double Negation Operator)

Mazeline·2025년 10월 15일
0

TA 가이드

목록 보기
2/6
post-thumbnail

개요

최근에는 엔진 코드 수정 할 일이 거의 없어서 잊고 있다가 문뜩 생각나서 정리 했습니다. 언리얼 엔진 코드를 리뷰하다 보면 !! 연산자를 종종 발견할 수 있습니다. 이 연산자는 정수나 다른 값을 명시적으로 bool 타입으로 변환할 때 사용되는 패턴입니다.

실제 사용 예제

언리얼 엔진 코드에서 실제로 사용되는 예제를 살펴보겠습니다.

const bool bFoliageDiscardOnLoad = !!CVarFoliageDiscardDataOnLoad.GetValueOnGameThread();

위 코드는 다음과 같이 리팩토링할 수 있습니다.

const bool bShouldDiscardFoliageDataOnLoad = CVarFoliageDiscardDataOnLoad.GetValueOnGameThread() != 0;

!! 연산자의 동작 원리

!! 연산은 두 번의 논리 부정을 수행합니다.

const bool bFlag = !!SomeIntegerValue;
  • SomeIntegerValue가 0이 아닌 경우 → true
  • SomeIntegerValue가 0인 경우 → false

단계별 동작

  1. 첫 번째 !: 값을 bool로 변환하고 반전
  2. 두 번째 !: 다시 반전하여 원래 논리값 유지

장점과 단점

장점

의도의 명확성

"이 값을 논리값으로 사용하려고 명시적으로 변환한다"는 의도를 코드에서 명확하게 표현할 수 있습니다.

코드 일관성

언리얼 엔진 내부에서 일관되게 사용되는 패턴으로, 엔진 코드와 스타일을 맞출 수 있습니다.

단점

가독성 논란

일부 개발자는 !! 표기법이 직관적이지 않다고 느낄 수 있습니다.

대안 존재

명시적 비교문이나 캐스팅을 선호하는 개발자도 있습니다.

대안 방법

1. 명시적 비교

const bool bFlag = CVarValue != 0;

2. 정적 캐스팅

const bool bFlag = static_cast<bool>(Value);

3. C 스타일 캐스팅

const bool bFlag = (bool)Value;

리팩토링 예제

변경 전

const bool bFoliageDiscardOnLoad = !!CVarFoliageDiscardDataOnLoad.GetValueOnGameThread();

변경 후

const bool bShouldDiscardFoliageDataOnLoad = CVarFoliageDiscardDataOnLoad.GetValueOnGameThread() != 0;

개선 사항

  • 변수 이름 개선: bFoliageDiscardOnLoadbShouldDiscardFoliageDataOnLoad로 변경하여 의도를 더 명확하게 표현
  • 문법 단순화: !! 연산자를 제거하고 명시적 비교로 대체하여 코드의 의도를 분명하게 함
  • 사용성 개선: 가독성과 코드의 맥락 이해도가 높아짐

언리얼 엔진 스타일 가이드 관점

언리얼 엔진 개발자라면 !! 연산자 사용이 익숙할 수 있습니다. 그러나 프로젝트의 코딩 스타일 가이드에 따라 적절히 선택하는 것이 중요합니다.

사용을 고려할 때

  • 엔진 내부 코드와 일관성을 유지하고 싶을 때
  • 팀원 모두가 이 패턴에 익숙할 때
  • 간결함을 중시할 때

대안을 고려할 때

  • 신입 개발자가 많은 프로젝트일 때
  • 코드 리뷰에서 혼란이 자주 발생할 때
  • 명시적인 코드 스타일을 선호할 때

결론

!! 연산자는 언리얼 엔진 코드에서 간결함과 의도 전달의 목적으로 자주 사용됩니다. 두 가지 스타일(!! vs 명시적 비교) 모두 사용 가능하지만, 프로젝트의 코딩 스타일 가이드와 팀의 선호도를 고려하여 일관성 있게 사용하는 것이 중요합니다.


작성일: 2025년 10월 15일
대상 독자: 초급 테크니컬 아티스트
난이도: 중급

profile
테크아트 컨설팅 전문 회사 "메이즈라인" 입니다.

0개의 댓글