[이득우의 언리얼] 6.언리얼 오브젝트 리플렉션 시스템 2

2026. 2. 4. 12:28·기타/[강의] 이득우의 언리얼 프로그래밍 Part1

개요

이번 강의에서는 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
'기타/[강의] 이득우의 언리얼 프로그래밍 Part1' 카테고리의 다른 글
  • [이득우의 언리얼] 8. 언리얼의 C++ 설계 - 컴포지션
  • [이득우의 언리얼] 7. 언리얼 C++ 설계 - 인터페이스
  • [이득우의 언리얼] 5. 언리얼 오브젝트 리플렉션 시스템 1
  • [이득우의 언리얼] 4. 언리얼 오브젝트 시스템
Meoyoung's Development Logs
Meoyoung's Development Logs
내가 보려고 만든 블로그
  • Meoyoung's Development Logs
    이게뭐영
    Meoyoung's Development Logs
  • 전체
    오늘
    어제
    • 분류 전체보기 (229)
      • 게임잼 (3)
      • 언리얼 엔진 (53)
        • 꿀 Tip ! (7)
        • 트러블슈팅 (24)
        • 최적화 (0)
        • 캐릭터 (2)
        • VR (1)
        • Lighting (2)
        • 멀티스레드 (2)
        • 문자열 (0)
      • C++ (31)
        • 문법 정리 (8)
        • [서적] Fundamental C++ 프로그래밍 .. (5)
        • [서적] 이것이 C++이다 (11)
        • [서적] Effective C++ (7)
      • C# (1)
        • [서적] 이것이 C#이다 (1)
      • 코딩테스트 (26)
        • 프로그래머스 (6)
        • 알고리듬 (13)
        • 자료구조 (7)
      • 컴퓨터 과학 (27)
        • 운영체제 (11)
        • 데이터베이스 (0)
        • 디자인패턴 (0)
        • 자료구조 (5)
        • 네트워크 (0)
        • 컴퓨터구조 (11)
      • 면접준비 (0)
        • C++ (0)
        • 운영체제 (0)
        • 자료구조 (0)
      • 프로젝트 (25)
        • [팀프로젝트] The Fourth Descenda.. (5)
        • [개인프로젝트] FPS 구현 맛보기 (5)
        • GetOutOf (15)
      • 기타 (54)
        • [강의] 이득우의 언리얼 프로그래밍 Part1 (10)
        • [강의] 이득우의 언리얼 프로그래밍 Part3 (12)
        • [강의] 소울라이크 개발 A-Z (4)
        • [강의] Udemy-2D (5)
        • [서적] 인생 언리얼5 (4)
        • 스파르타코딩클럽 (15)
        • 객체지향프로그래밍 (2)
        • 컴퓨터회로 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    버블정렬
    자료구조
    경북게임잼
    선택정렬
    쉘정렬
    게임잼
    게임개발
    셸정렬
    참가후기
    삽입정렬
    알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Meoyoung's Development Logs
[이득우의 언리얼] 6.언리얼 오브젝트 리플렉션 시스템 2
상단으로

티스토리툴바