유니티 (Unity) TryGetComponent에 대해서 /Out키워드와 ref 차이

Rigidbody rb;
if (gameObject.TryGetComponent<Rigidbody>(out rb))
{
    // Rigidbody 컴포넌트가 존재하므로 이제 'rb'를 사용하여 접근할 수 있습니다
}
else
{
    // 이 GameObject에는 Rigidbody 컴포넌트가 없습니다
}

 

TryGetComponent는 GameObject에 존재하는 경우 지정된 유형의 컴포넌트를 검색하려고 시도합니다. 컴포넌트가 발견되면 true를 반환하고 그 컴포넌트에 대한 참조를 제공합니다. 발견되지 않으면 false 반환합니다.


 

GetComponent와의 차이

Rigidbody rb = gameObject.GetComponent<Rigidbody>();
if (rb != null)
{
    // Use rb
}

 

 

지정된 구성 요소 유형이 발견되지 않으면 GetComponent는 null을 반환합니다.일반적으로 NullReferenceException을 방지하려면 반환된 값이 'null'인지 확인해야 합니다. 이때 null 확인이 반복적으로 발생한다면 불필요한 성능 오버헤드가 발생합니다.

 

if (gameObject.TryGetComponent<Rigidbody>(out Rigidbody rb))
{
    // Use rb
}

 

TryGetComponent는 null을 반환하는 대신 bool type을 반환합니다.

이 방법은 구성 요소가 누락된 경우 예외를 발생시키지 않으므로 구성 요소가 존재하는지 확실하지 않을 때 더 안전합니다.

또한, 반복적인 null확인이 필요하지 않는다면 GetComponent에 비해 불필요한 성능 오버헤드가 발생하지 않아 약간의 성능을 확보할 수 있습니다.


TryGetComponent와 GetComponent 사용 사례 시나리오

 

GetComponent는 구성 요소가 확실히 존재하는 경우 간단하게 작성할 수 있다는 장점이 있습니다. 

 

TryGetComponent는 구성 요소의 존재 여부가 확실하지 않거나 런타임 중에 구성 요소가 동적으로 추가되거나 제거되는 경우 선호됩니다. 

 


out / ref 차이점


여기서 out 키워드가 참 헷갈리는데, out / ref 차이점을 설명해보고자 합니다.
 

ref 같은 경우 

매개변수 ref로 전달되기 전에는 반드시 초기화가 돼야 합니다.
ref변수를 통해 넘겨진 인자는 호출된 메서드에서 값을 변경하면 Original 변수값도 변하게 됩니다.
C에서의  =참조에 의한 호출(Call by reference)(양방향 방식)느낌인 것 같습니다.

Out같은 경우

매개변수 Out이 전달되기 전에 초기화를 하지 않아도 되지만, 호출 메서드에 값을 return할때는 반드시 초기화가 되어야 합니다.
Out변수를 통해 넘겨진 인자는 호출된 메서드로 넘어가는 단방향 방식입니다.

return이 없어도 된다.

짤막한 그림으로 그려봤다ㅎㅎ..


out 키워드는 대표적으론 RayCast에 많이 쓰입니다.

out 키워드 / RaycastHit 구조체

 

 

RaycastHit의 구조는 위와 같은 구조체입니다.
 
out 키워드를 쓰는 이유는 Raycast를 통해 쏘아진 레이저에 맞은 오브젝트의 정보를 받아와서 저장하기 위함입니다.
 
쉽게 설명하면, 레이저에 맞았다?

그 정보를 hit 변수에 담는다! 이정도?

 

이렇게 하는 이유는 out을 쓰면 return을 따로 안써도 되기 때문에 번거롭지 않아서?(매개변수를 직접 바꿀 수 있다!!!! 이 한마디면 됨!!!!!!!)
 
따라서 hit에 저장된 정보들을 가져다 쓰면 됩니다.
ex) hit.transform ~ hit.point 등...