유니티에서는 객체가 컴포넌트로 가지고 있는 데이터를 가져오고 싶을때 GetComponent를 통해서 한다.
1. GetComponent<T>()
이때 자주 사용하는 방식인 GetComponent<T>()은 특정 T 타입의 컴포넌트를 가져오며, 만약 해당하는 컴포넌트가 없으면 null을 반환하게 된다. 또한 어느정도 비용이 높은 연산으로 update문과 같이 여러번 호출 되는 곳에서 사용하게 되면 최적화 적으로 불리해 진다.
null을 리턴하는 부분때문에 (@@ != null) 등의 null 체킹을 해주지 않는다면 NullReferenceException이 발생할 수 있다는 단점이 있다.
// 사용 예시
Rigidbody rb = GetComponent<Rigidbody>();
if (rb != null)
{
rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);
}
2. TryGetComponent<T>(out T component)
반대로 TryGetComponent<T>() 방식의 경우 기능적으로는 GetComponent와 동일하지만, 더 안전하게 사용할 수있다.
out 매개변수를 활용한 방식으로 만약 성공하면 True, 실패하면 False를 리턴하여 불필요한 null 체크를 줄일 수 있다는 장점이 있다.
// 사용 예시
if (TryGetComponent<Rigidbody>(out Rigidbody rb))
{
rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);
}
두가지 방식을 비교하면 GetComponent<T>()는 컴포넌트를 찾는 연산을 수행하며 null 체크를 추가적으로 하게 되는데, 이 값을 처리하기 위한 추가적인 연산이 발생하나, TryGetComponent<T>()는 성공 여부만 true/false로 반환하기 때문에 null체크 와 예외처리가 필요없기 때문에 연산이 더 빠르고 간단하다는 장점이 있는것이다.
그렇다면 왜 모든 방식을 TryGetComponent로 쓰지 않는걸까?
1. 성능 차이가 미미한 경우
- GetComponent<T>() 와 TryGetComponent<T>() 의 성능 차이는 컴포넌트가 존재하지 않는 경우에만 유의미하다.
즉, 컴포넌트가 존재할 가능성이 높은 경우에는 그 차이가 미미할 수 있다. 대부분의 경우, GetComponent<T>() 가 컴포넌트를 찾는 연산을 한 번만 하므로 성능상의 이점이 크게 느껴지지 않을 수 있다는 뜻이다.
2. 코드의 의도와 가독성
- GetComponent<T>() 는 "컴포넌트가 반드시 존재한다"는 전제 하에 사용된다. 즉, 컴포넌트를 찾는 것 자체가 중요한 상황에서는 GetComponent<T>()가 더 직관적인것이다.
- 반면, TryGetComponent<T>() 는 컴포넌트가 없을 수도 있음을 처리하기 위해 사용되며. 이때 false를 반환하며 컴포넌트가 없다는 상황을 처리하는데, 이는 코드 흐름에 따라 다른 처리를 추가해야 할 수 있다.
3. 의도된 동작에 따른 선택
- GetComponent<T>() 는 컴포넌트가 반드시 존재한다는 가정 하에 동작하기 때문에 컴포넌트가 없으면 null이 반환되고, 그 후 null 체크가 필요할 수 있는데. 이는 GetComponent를 사용하는 개발자의 의도가 "컴포넌트가 있어야 한다"는 것과 일치한다.
- TryGetComponent<T>() 는 컴포넌트가 존재하지 않더라도 예외를 발생시키지 않고 안전하게 처리할 수 있게 해주며. 이 방식은 컴포넌트가 없을 수도 있다는 것을 고려해야 할 때 사용된다. 예를 들어, 컴포넌트가 없는 경우를 처리해야 할 때라면 TryGetComponent<T>() 가 유용 한것이다.
결론: 컴포넌트의 존재유무가 확실/불확실에 따른 사용
- TryGetComponent<T>()는 컴포넌트가 있을 수도 있고 없을 수도 있는 상황에서 안전하게 처리가 필요한 경우 사용.
- GetComponent<T>()는 컴포넌트가 반드시 존재할 것이라고 확신하는 경우에 사용하고, 만약 컴포넌트가 없다면 null을 반환하는 방식이 적합하다.
'C# > 공부 하는것' 카테고리의 다른 글
박싱 언박싱 (0) | 2025.04.28 |
---|---|
유니티 - 드로우 콜 (0) | 2025.03.20 |