[Unity/C#] == 과 is의 차이점

도윤·2024년 2월 6일

Unity

목록 보기
3/4

젯브레인 라이더를 사용하여 코드를 작성하다보면, 분명 동일한 null체크 코드인데 is를 사용하는 것이 더 빠르기에 is를 사용하라는 경고문을 볼 수 있다. 정말 is가 ==에 비해 더 빠른지 그렇다면 왜 빠른지 알아보자.

결론부터 말하자면, is가 ==에 비해 빠른것이 사실이다. 이유를 알기 위해서는 유니티의 FakeNull에 대해 알아야 한다.

Fake Null

유니티의 베이스는 C++로 이루어져 있다. 따라 유니티에는 System.ObjectUnityEngine.Object 두 가지의 오브젝트가 존재하게 된다.

평소 개발을 할 때에는 신경쓰지 않아도 되는 부분이지만, 오브젝트를 삭제하게 될 경우 문제가 발생하게 된다. 익히 알 듯이 C++은 메모리의 동적 할당과 해제가 자유롭지만 C#은 GC가 호출되어 메모리를 해제하게 된다.

이런 상황에, 사용자가 오브젝트를 삭제하게 되면 시스템 오브젝트는 null이 되지만, 유니티의 오브젝트는 GC가 호출되기 전까지 null이 아니게 된다. 유니티 엔진 상에서는 null이지만, 시스템상으로는 null이 아닌 이 현상을 Fake Null이라고 한다.

is null vs == null

이러한 Fake Null을 잡아내기 위해 유니티 오브젝트에서는 == 연산자를 오버라이딩하여 실제 객체가 존재하는지를 판단하는 과정을 진행한뒤에 값을 리턴한다.

다만, is 연산자는 이러한 과정을 진행하지 않고 값의 여부만 판단하기에 속도차이가 발생하는 것이다.

is가 무조건적으로 좋은 것은 아니다.

물론 속도면에서는 is가 빠르긴 하나, 위에서 말하였듯 is 연산자는 유니티의 Fake Null 체크를 하지 못한다. 따라서 오브젝트가 삭제될 가능성이 있을 때는 ==을 사용하는 것이 코드의 안전성을 더 올려줄 수 있다.

상황에 맞는 연산자를 잘 사용하는 것이 중요하다고 볼 수 있다.

profile
Game Client Developer

0개의 댓글