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() 사용을 권장한다.
✍️ 참고 문서
'개발 > Unity' 카테고리의 다른 글
Unity 내장 오브젝트 풀(Object Pool) 사용하기 (0) | 2025.10.13 |
---|---|
Unity에서 커맨드(Command) 패턴 활용하기 (0) | 2025.10.11 |
Unity에서 이벤트버스(Event Bus) 패턴 활용하기 (0) | 2025.10.08 |
Unity에서 상태패턴으로 캐릭터 움직임과 공격 구현하기 (0) | 2025.10.07 |
Unity에서 추상 클래스 기반 Singleton 패턴 구현하기 (0) | 2025.10.06 |