본문 바로가기
개발/Unity

Unity에서 tag 비교할 때 CompareTag()를 사용해야 하는 이유

by DinoDev 2025. 10. 12.
728x90
반응형

Unity에서 객체의 태그를 비교할 때 보통 아래 두 가지 방법 중 하나를 사용한다.

if (gameObject.tag == "Enemy") { ... }

또는

if (gameObject.CompareTag("Enemy")) { ... }

두 코드는 같은 결과를 낼 것처럼 보이지만, Unity 공식 문서에서도 CompareTag() 사용을 권장한다.
그 이유를 하나씩 살펴보자.


🔍 1. CompareTag()는 문자열 비교가 아니다

gameObject.tag == "Enemy"는 순수한 문자열 비교 연산이다.
이 말은 곧 매 프레임마다 문자열을 읽고 비교하는 비용이 발생한다는 의미다.

Unity의 tag는 내부적으로 문자열 해시 ID로 관리된다.
CompareTag()는 이 해시 값을 직접 비교하므로 문자열 연산 없이 훨씬 빠르게 처리된다.

✅ 즉, CompareTag()는 "string 비교"가 아니라 "정수 ID 비교"에 가깝다.


⚡ 2. 태그가 존재하지 않을 때의 안정성

다음 코드를 보자.

if (gameObject.tag == "Enemy")

이 경우, 만약 해당 GameObject의 태그가 삭제되었거나 존재하지 않는 태그라면 Unity는 tag 프로퍼티를 접근할 때 예외(UnityException)를 발생시킨다.

반면 CompareTag()는 태그가 존재하지 않더라도 안전하게 false를 반환한다.
즉, 실행 중에 에러로 게임이 중단되는 일이 없다.

✅ CompareTag()는 런타임 안전성까지 고려한 함수다.


🧠 3. 가독성과 의도 전달

CompareTag("Enemy")는 “이 객체가 특정 태그인지 비교한다”는 의도가 명확하다.
문자열 비교보다 의미적으로 분명하고, 코드 리뷰 시에도 한눈에 목적이 드러난다.

 

if (other.CompareTag("Player"))  // 이 객체가 'Player' 태그인지 확인

🧩 4. 실제 성능 차이

다음과 같은 테스트를 해보면, 수천 번의 비교에서는 눈에 띄는 차이가 없지만
Update() 안에서 매 프레임 여러 객체의 태그를 검사하는 상황에서는 차이가 커진다.

방식 평균 처리 속도 (상대값) 예외 발생 가능성
gameObject.tag == "Enemy" 느림 있음
CompareTag("Enemy") 빠름 없음

⚙️ CompareTag()는 Unity 내부적으로 C++ 레벨에서 최적화되어 있기 때문에
문자열 비교보다 항상 더 효율적이고 안정적이다.


🧾 결론

항목 tag == "Enemy" CompareTag("Enemy")
비교 방식 문자열 비교 해시 기반 비교
성능 상대적으로 느림 빠름
예외 처리 태그 없을 때 예외 발생 안전하게 false 반환
가독성 일반적 의도가 명확함
권장 여부 Unity 공식 권장 방식

💡 요약

  • CompareTag()는 문자열 비교가 아니라 내부 해시 비교로 빠르다.
  • 존재하지 않는 태그에 접근해도 예외가 발생하지 않는다.
  • 코드 의도가 명확해지고 유지보수성이 높아진다.
  • Unity 공식 문서에서도 항상 CompareTag() 사용을 권장한다.

✍️ 참고 문서

728x90
반응형