C/C++
을 접해보면 가장 헷갈리는 것중 하나가 바로 선언
과 정의
가 분리돼있다는 것이다.Java
, C#
같은 애들은 선언 자체가 곧 정의이고 모듈시스템이 알아서 어떤 클래스, 함수가 있는지를 추적해주기때문에 선언과 정의를 구분할 필요가 없다. 그렇기에 선언과 정의에 관련된 내용은 더 헷갈리는거 같다.💡 더 정확히 말하면 "해당 오브젝트의 내부 구현체의 형태를 알고 있어서 메모리할당이 얼마나 일어날지를 알 수 있는가" 이다.
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.generated.h"
class UCard;// 전방선언
UCLASS()
class UNREALCOMPOSITION_API UPerson : public UObject
// 어떠한 클래스가 있다는 "선언" + 클래스의 구조를 "정의"
{
GENERATED_BODY()
public:
UPerson();
// "선언", 실제 내부 함수의 내용이 어떤지 설명하지 않기에 메모리 레이아웃을 알 수 없음
FORCEINLINE const FString& GetName() { return Name; }
// "선언" + "정의", 함수가 있다는 것을 알림과 동시에 그 내용이 어떤지 설명함
FORCEINLINE void SetName(const FString& InName) { Name = InName; }
FORCEINLINE class UCard* GetCard() const { return Card; }
FORCEINLINE void SetCard(class UCard* InCard) { Card = InCard; }
protected:
UPROPERTY()
FString Name;
UPROPERTY()
TObjectPtr<class UCard> Card;
// 정의된 템플릿 클래스에 타입을 넣어주는 경우,
// 위와같이 템플릿 타입을 전방선언으로 넣어줄 수도 있음
};
#include "Person.h"
#include "Card.h"
UPerson::UPerson()
{
Name = TEXT("홍길동");
Card = CreateDefaultSubobject<UCard>(TEXT("NAME_Card"));
}
(참고: Large-Scale C++ Software Design)