언리얼에서 C++로 프로퍼티(속성)를 다룰 때, `__declspec(property)`를 사용하면 C#처럼 `객체.HP = 100` 또는 `float val = 객체.HP`처럼 간결한 문법을 사용할 수 있음. 이를 통해 코드 가독성과 유지보수성을 높일 수 있음.

1. 어떤 기능?

`__declspec(property(get, put))`은 C++에서 속성처럼 보이도록 만드는 Microsoft 확장 문법으로, 특정 멤버 변수에 대해 getter/setter를 자동으로 연결해줌.

사용 예시:
class UMyStatComponent
{
private:
    float curHP;

public:
    __declspec(property(get = GetHP, put = SetHP)) float HP;

    float GetHP() const { return curHP; }
    void SetHP(float newHP) { curHP = newHP; }
};

2. 어떻게 동작함?

위 코드에서 `HP`는 외부에서 직접 접근 가능한 속성처럼 동작하며, 내부적으로는 `GetHP()` 또는 `SetHP()`가 호출됨.

예제:
UMyStatComponent* stat = NewObject<UMyStatComponent>();
stat->HP = 80.0f;           // 내부적으로 SetHP(80.0f) 호출
float current = stat->HP;  // 내부적으로 GetHP() 호출

3. 주의사항

  • 언리얼의 `UPROPERTY()`와는 전혀 관련 없음. 이건 컴파일 타임에 C++ 레벨에서만 작동함.
  • 에디터 노출, 블루프린트 접근 등에는 사용할 수 없음.
  • Visual Studio와 MSVC에서만 지원되는 Microsoft 전용 확장이므로, 다른 컴파일러(예: Clang)에서는 작동하지 않을 수 있음.
  • 언리얼 엔진의 직렬화, 복제, 가비지 컬렉션 시스템과는 무관함.

4. 언제 유용함?

- 내부 필드를 캡슐화하고, setter/getter 로직을 유연하게 처리하고 싶을 때
- 특히 클래스 내부에서 `this->HP` 같은 방식으로 속성처럼 간결하게 코딩하고 싶을 때
- 테스트 코드나 툴링 코드 등에서 가독성과 유지보수성을 높이고 싶을 때

5. 요약

`__declspec(property)`는 언리얼의 `UPROPERTY()`와는 다르지만, 내부적으로 C#처럼 간결한 getter/setter 구문을 만들 수 있는 유용한 기능임. 하지만 범용성은 낮고, 에디터 연동이 필요한 상황에서는 적절하지 않음.