언리얼 C++ 코드를 보면 어떤 건 ()-> 이렇게 쓰고, 어떤 건 그냥 ->, 어떤 건 ()만 쓰는 경우가 있다.
처음 보면 헷갈리는데, 사실 이건 C++ 함수 호출과 포인터 멤버 접근 규칙을 그대로 따른 것뿐이다.
() : 함수 호출()는 함수를 호출할 때 사용한다.
GetMesh()
GetMesh라는 함수(멤버 함수)를 호출한다는 뜻GetMesh()는 USkeletalMeshComponent* 타입(포인터)을 반환한다-> : 포인터 멤버 접근->는 "포인터가 가리키는 객체의 멤버에 접근"하는 연산자다.
예시:
mSpringArm->TargetArmLength = 500.f;
mSpringArm은 USpringArmComponent* 타입 포인터->를 사용해서 그 안의 멤버 변수 TargetArmLength에 접근.을 쓴다SpringArm.TargetArmLength = 500.f; // 포인터가 아닌 경우
()-> : 함수 호출 결과로 얻은 포인터의 멤버 접근()->는 "함수를 호출해서 리턴된 포인터 → 그 포인터가 가리키는 멤버 접근"이라는 뜻이다.
예시:
GetMesh()->SetRelativeLocation(FVector(0,0,0));
GetMesh() 호출 → USkeletalMeshComponent* 반환->SetRelativeLocation() 실행즉, 함수 호출 결과로 포인터를 얻고, 그 포인터의 멤버 함수를 호출하는 패턴이다.
// ① 함수 호출 결과로 포인터를 얻고, 그 멤버 호출
GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
// ② 단순히 함수 호출
GetCapsuleComponent()->SetCapsuleHalfHeight(94.f);
// ③ 멤버 포인터에 직접 접근
mSpringArm->TargetArmLength = 500.f;
정리하면:
GetMesh() : 함수 호출mSpringArm-> : 포인터 멤버 접근GetMesh()-> : 함수 호출 결과로 얻은 포인터 멤버 접근언리얼 예시만 보면 헷갈리니까, 일반 C++ 예시로 비교해 보자.
class MyClass
{
public:
void Print() { std::cout << "Hello\n"; }
};
MyClass obj; // 일반 객체
MyClass* ptr = &obj; // 객체 포인터
obj.Print(); // (.) 객체 멤버 접근
ptr->Print(); // (->) 포인터 멤버 접근
// 함수가 포인터 반환하는 경우
MyClass* GetObj() { return &obj; }
GetObj()->Print(); // 함수 호출 결과 포인터 → 멤버 접근
언리얼에서의 GetMesh()->SetRelativeLocation(...) 구조와 똑같다.
() : "함수를 호출한다"-> : "포인터 멤버에 접근한다"()-> : "함수를 호출해서 얻은 포인터로 멤버에 접근한다"즉, 언리얼 C++의 특수한 문법이 아니라 순수 C++ 규칙 그대로이다.
언리얼의 GetMesh(), GetCapsuleComponent(), mSpringArm 같은 것들은 각각 함수/포인터일 뿐, 규칙은 동일하다.