언리얼 C++에서 ()와 -> 차이 쉽게 이해하기

DevBison·2025년 8월 21일

C++에서 () 와 -> 차이점 (언리얼 예제 포함)

언리얼 C++ 코드를 보면 어떤 건 ()-> 이렇게 쓰고, 어떤 건 그냥 ->, 어떤 건 ()만 쓰는 경우가 있다.
처음 보면 헷갈리는데, 사실 이건 C++ 함수 호출과 포인터 멤버 접근 규칙을 그대로 따른 것뿐이다.


1. () : 함수 호출

()는 함수를 호출할 때 사용한다.

GetMesh()
  • GetMesh라는 함수(멤버 함수)를 호출한다는 뜻
  • 언리얼에서 GetMesh()는 USkeletalMeshComponent* 타입(포인터)을 반환한다

2. -> : 포인터 멤버 접근

->는 "포인터가 가리키는 객체의 멤버에 접근"하는 연산자다.

예시:

mSpringArm->TargetArmLength = 500.f;
  • mSpringArm은 USpringArmComponent* 타입 포인터
  • ->를 사용해서 그 안의 멤버 변수 TargetArmLength에 접근
  • 만약 포인터가 아니라 객체였다면 .을 쓴다
SpringArm.TargetArmLength = 500.f;   // 포인터가 아닌 경우

3. ()-> : 함수 호출 결과로 얻은 포인터의 멤버 접근

()->는 "함수를 호출해서 리턴된 포인터 → 그 포인터가 가리키는 멤버 접근"이라는 뜻이다.

예시:

GetMesh()->SetRelativeLocation(FVector(0,0,0));
  • GetMesh() 호출 → USkeletalMeshComponent* 반환
  • 그 결과에 대해 ->SetRelativeLocation() 실행

즉, 함수 호출 결과로 포인터를 얻고, 그 포인터의 멤버 함수를 호출하는 패턴이다.


4. 언리얼 코드 예시 정리

// ① 함수 호출 결과로 포인터를 얻고, 그 멤버 호출
GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);

// ② 단순히 함수 호출
GetCapsuleComponent()->SetCapsuleHalfHeight(94.f);

// ③ 멤버 포인터에 직접 접근
mSpringArm->TargetArmLength = 500.f;

정리하면:

  • GetMesh() : 함수 호출
  • mSpringArm-> : 포인터 멤버 접근
  • GetMesh()-> : 함수 호출 결과로 얻은 포인터 멤버 접근

5. 일반 C++ 예시와 비교

언리얼 예시만 보면 헷갈리니까, 일반 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 같은 것들은 각각 함수/포인터일 뿐, 규칙은 동일하다.


profile
응애 개발자

0개의 댓글