개요
이번 강의에서는 Unreal Engine의 리플렉션(Reflection) 시스템을 실제로 활용하여 Unreal Object를 다루는 방법을 학습합니다. 학교에서 학생과 교수가 수업하는 상황을 구현하면서 리플렉션의 강력한 기능들을 실습해봅니다.
클래스 설계 구조
1. 상속 구조
UObject
└── UPerson (부모 클래스)
├── UStudent (학생 클래스)
└── UTeacher (교사 클래스)
2. 클래스별 속성 및 기능
UPerson (기본 인물 클래스)
- 속성: Name (이름), Year (연차)
- 함수: virtual void DoLesson() - 수업 참여 행동
UStudent (학생 클래스)
- 속성: ID (학번)
- 함수: DoLesson() 오버라이드 - 수업 듣기
UTeacher (교사 클래스)
- 속성: ID (교번)
- 함수: DoLesson() 오버라이드 - 수업 가르치기
구현부
Person.h
더보기
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Person.generated.h"
UCLASS()
class OBJECTREFLECTION_API UPerson : public UObject
{
GENERATED_BODY()
public:
/** 생성자입니다. */
UPerson();
/** 수업에 참여하는 함수입니다. */
UFUNCTION()
virtual void DoLesson();
/** 이름을 반환하는 함수입니다. */
const FString& GetName() const;
/** 이름을 설정하는 함수입니다. */
void SetName(const FString& InName);
/** 연차를 반환하는 함수입니다. */
int32 GetYear() const;
/** 연차를 설정하는 함수입니다. */
void SetYear(int32 InYear);
protected:
/** 이름 변수입니다. */
UPROPERTY()
FString Name;
/** 연차 변수입니다. */
UPROPERTY()
int32 Year;
};
Person.cpp
더보기
#include "Person.h"
UPerson::UPerson()
{
// 기본 값 설정
Name = TEXT("홍길동");
Year = 1;
}
void UPerson::DoLesson()
{
// 수업에 참여합니다.
UE_LOG(LogTemp, Log, TEXT("%s님이 수업에 참여합니다."), *Name);
}
const FString& UPerson::GetName() const
{
return Name;
}
void UPerson::SetName(const FString& InName)
{
Name = InName;
}
int32 UPerson::GetYear() const
{
return Year;
}
void UPerson::SetYear(int32 InYear)
{
Year = InYear;
}
Student.h
더보기
#pragma once
#include "CoreMinimal.h"
#include "Person.h"
#include "Student.generated.h"
UCLASS()
class OBJECTREFLECTION_API UStudent : public UPerson
{
GENERATED_BODY()
public:
/** 생성자입니다. */
UStudent();
/** 수업을 듣는 함수입니다. */
virtual void DoLesson() override;
private:
/** 학번 변수입니다. */
UPROPERTY()
int32 ID;
};
Student.cpp
더보기
#include "Student.h"
UStudent::UStudent()
{
// 기본 값 설정
Name = TEXT("학생");
Year = 1;
ID = 1;
}
void UStudent::DoLesson()
{
// 부모 클래스의 DoLesson 먼저 호출
Super::DoLesson();
// 학생이 수업을 듣습니다.
UE_LOG(LogTemp, Log, TEXT("%d학년 %d번 %s님이 수업을 듣습니다."), Year, ID, *Name);
}
Teacher.h
더보기
#pragma once
#include "CoreMinimal.h"
#include "Person.h"
#include "Teacher.generated.h"
UCLASS()
class OBJECTREFLECTION_API UTeacher : public UPerson
{
GENERATED_BODY()
public:
/** 생성자입니다. */
UTeacher();
/** 수업을 가르치는 함수입니다. */
virtual void DoLesson() override;
private:
/** 교번 변수입니다. */
UPROPERTY()
int32 ID;
};
Teacher.cpp
더보기
#include "Teacher.h"
UTeacher::UTeacher()
{
// 기본 값 설정
Name = TEXT("이선생");
Year = 3;
ID = 1;
}
void UTeacher::DoLesson()
{
// 부모 클래스의 DoLesson 먼저 호출
Super::DoLesson();
// 선생님이 수업을 가르칩니다.
UE_LOG(LogTemp, Log, TEXT("%d년차 %d번 %s님이 수업을 가르칩니다."), Year, ID, *Name);
}
리플렉션 시스템 활용
1. 일반적인 Getter/Setter 사용
// MyGameInstance.cpp의 Init() 함수에서
// 객체 생성
UStudent* Student = NewObject<UStudent>();
UTeacher* Teacher = NewObject<UTeacher>();
// Getter/Setter를 사용한 일반적인 방법
Student->SetName(TEXT("학생1번"));
FString NewStudentName = Student->GetName();
UE_LOG(LogTemp, Log, TEXT("새로운 학생 이름: %s"), *NewStudentName);
2. 리플렉션을 사용한 프로퍼티 접근
// 프로퍼티 정보 가져오기
FProperty* NameProperty = UTeacher::StaticClass()->FindPropertyByName(TEXT("Name"));
if (NameProperty)
{
// 현재 값 읽기 (GetValueInContainer)
FString CurrentTeacherName;
NameProperty->GetValue_InContainer(Teacher, &CurrentTeacherName);
UE_LOG(LogTemp, Log, TEXT("현재 선생님 이름: %s"), *CurrentTeacherName);
// 새로운 값 설정 (SetValueInContainer)
FString NewTeacherName = TEXT("김대영");
NameProperty->SetValue_InContainer(Teacher, &NewTeacherName);
// 변경 확인
FString ChangedName = Teacher->GetName();
UE_LOG(LogTemp, Log, TEXT("새로운 선생님 이름: %s"), *ChangedName);
}
3. 리플렉션을 사용한 함수 호출
// 일반적인 함수 호출
Student->DoLesson();
// 리플렉션을 사용한 함수 호출
UFunction* DoLessonFunction = Teacher->GetClass()->FindFunctionByName(TEXT("DoLesson"));
if (DoLessonFunction)
{
// ProcessEvent를 사용하여 함수 실행
Teacher->ProcessEvent(DoLessonFunction, nullptr);
}
'기타 > [강의] 이득우의 언리얼 프로그래밍 Part1' 카테고리의 다른 글
| [이득우의 언리얼] 8. 언리얼의 C++ 설계 - 컴포지션 (0) | 2026.02.06 |
|---|---|
| [이득우의 언리얼] 7. 언리얼 C++ 설계 - 인터페이스 (0) | 2026.02.04 |
| [이득우의 언리얼] 5. 언리얼 오브젝트 리플렉션 시스템 1 (0) | 2026.02.03 |
| [이득우의 언리얼] 4. 언리얼 오브젝트 시스템 (0) | 2026.01.21 |
| [이득우의 언리얼] 3. FString의 구조와 활용 (0) | 2026.01.20 |