ํฌ์ŠคํŠธ

CS โ€” runtime

CS โ€” runtime

๐Ÿ“— 04/15 - Runtime (๋Ÿฐํƒ€์ž„) ์ •๋ฆฌ

Notion ์›๋ณธ: https://www.notion.so/343f77b24d2f8146b9dfcf1c60ebd0cd ๋ถ€๋ชจ: ์ž๋ฃŒ โ†’ Cs ๋ฉด์ ‘์ค€๋น„ โ†’ ๊ผฌ๋ฆฌ์งˆ๋ฌธ ํ‚ค์›Œ๋“œ โ†’ Runtime

๋ชจ์˜๋ฉด์ ‘ ๋‹ต๋ณ€ โ€” โ€œ๋Ÿฐํƒ€์ž„์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?โ€

๋Ÿฐํƒ€์ž„(Runtime)์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์‹œ๊ฐ„์  ๋‹จ๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋‹จ๊ณ„๋ผ๋ฉด, ๋Ÿฐํƒ€์ž„์€ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ด ์‹ค์ œ๋กœ OS ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—๋Š” ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ, ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๋™์  ๋””์ŠคํŒจ์น˜, RTTI๋ฅผ ํ™œ์šฉํ•œ ํƒ€์ž… ํŒ๋ณ„ ๋“ฑ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋Š” ์ปดํŒŒ์ผ์€ ํ†ต๊ณผํ•˜์ง€๋งŒ ์‹คํ–‰ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋กœ, ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ํดํŠธ, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘(UB) ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค. ์–ธ๋ฆฌ์–ผ ์—”์ง„์—์„œ๋„ BeginPlay(), Tick() ๊ฐ™์€ ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ๋Ÿฐํƒ€์ž„์— vtable์„ ํ†ตํ•ด ๋™์  ๋””์ŠคํŒจ์น˜๋˜๋ฉฐ, IsA()๋‚˜ Cast()๋Š” RTTI ๊ธฐ๋ฐ˜์œผ๋กœ ๋Ÿฐํƒ€์ž„ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ ์ •๋ฆฌ

๊ธฐ๋ณธ ๊ฐœ๋…

  • ๋Ÿฐํƒ€์ž„ (Runtime) โ€” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘์ธ ๋‹จ๊ณ„; ์ปดํŒŒ์ผ ํƒ€์ž„ ์ดํ›„ OS ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์‹œ๊ฐ„
  • ์ปดํŒŒ์ผ ํƒ€์ž„ (Compile Time) โ€” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋‹จ๊ณ„; ํƒ€์ž… ๊ฒ€์‚ฌยท์ตœ์ ํ™” ๋ฐœ์ƒ
  • ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (Dynamic Memory Allocation) โ€” ๋Ÿฐํƒ€์ž„์— ํž™์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”์ฒญ (new / malloc)
  • RTTI (Runtime Type Information) โ€” ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ์‹ค์ œ ํƒ€์ž…์„ ์กฐํšŒํ•˜๋Š” C++ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • ๋™์  ๋””์ŠคํŒจ์น˜ (Dynamic Dispatch) โ€” vtable์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์— ์‹ค์ œ ํ•จ์ˆ˜๋ฅผ ๊ฒฐ์ •ยทํ˜ธ์ถœ
  • ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ (Undefined Behavior, UB) โ€” ํ‘œ์ค€์ด ๊ฒฐ๊ณผ๋ฅผ ๊ทœ์ •ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ; ๋Ÿฐํƒ€์ž„์— ์˜ˆ์ธก ๋ถˆ๊ฐ€

ํ‚ค์›Œ๋“œ ๋ถ„๋ฅ˜ํ‘œ

  • ํƒ€์ž… ๊ฒ€์‚ฌ โ†’ ์ปดํŒŒ์ผ ํƒ€์ž„ (static_assert, ํ…œํ”Œ๋ฆฟ ์ธ์Šคํ„ด์Šคํ™”)
  • ๋™์  ๋””์ŠคํŒจ์น˜ โ†’ ๋Ÿฐํƒ€์ž„ (virtual ํ•จ์ˆ˜ ํ˜ธ์ถœ, vtable ์ฐธ์กฐ)
  • RTTI โ†’ ๋Ÿฐํƒ€์ž„ (dynamic_cast, typeid)
  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น โ†’ ๋Ÿฐํƒ€์ž„ (new/delete, malloc/free)
  • ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ โ†’ ๋Ÿฐํƒ€์ž„ (segfault, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, UB)

์ปดํŒŒ์ผ ํƒ€์ž„ vs ๋Ÿฐํƒ€์ž„

์ปดํŒŒ์ผ ํƒ€์ž„์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๋‹จ๊ณ„๋กœ, ๋ฌธ๋ฒ• ๊ฒ€์‚ฌยทํƒ€์ž… ๊ฒ€์‚ฌยท์ตœ์ ํ™”๊ฐ€ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์€ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋žจ์ด OS ์œ„์—์„œ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๋‹จ๊ณ„๋กœ, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹นยท๋™์  ๋””์ŠคํŒจ์น˜ยทI/O ๋“ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต:

  • ์‹œ์ : ๋นŒ๋“œ ์‹œ / ์‹คํ–‰ ์‹œ
  • ์ฃผ์š” ์ž‘์—…: ๋ฌธ๋ฒ•ยทํƒ€์ž… ๊ฒ€์‚ฌ, ์ตœ์ ํ™”, ์ฝ”๋“œ ์ƒ์„ฑ / ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ๋™์  ๋””์ŠคํŒจ์น˜, I/O
  • ์—๋Ÿฌ ๋ฐœ๊ฒฌ: ์ปดํŒŒ์ผ ์—๋Ÿฌ (์ฆ‰์‹œ ํ”ผ๋“œ๋ฐฑ) / ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ (์‹คํ–‰ ์ค‘ ํฌ๋ž˜์‹œ)
  • ์„ฑ๋Šฅ ๋น„์šฉ: ๋นŒ๋“œ ์‹œ๊ฐ„์— ์†Œ๋ชจ / ์‹คํ–‰ ์ค‘ ์†Œ๋ชจ (์ง์ ‘ ์˜ํ–ฅ)
1
2
3
4
5
6
7
8
9
10
11
12
// โ”€โ”€ ์ปดํŒŒ์ผ ํƒ€์ž„ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
static_assert(sizeof(int) == 4, "int๋Š” 4๋ฐ”์ดํŠธ์—ฌ์•ผ ํ•จ");
constexpr int Square(int x) { return x * x; }
template<typename T> void Print(T val) { }

// โ”€โ”€ ๋Ÿฐํƒ€์ž„ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
int n;
std::cin >> n;                    // ๋Ÿฐํƒ€์ž„์— ๊ฐ’ ๊ฒฐ์ •
int* arr = new int[n];            // ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
Base* p = new Derived();          // ๋Ÿฐํƒ€์ž„ ๊ฐ์ฒด ์ƒ์„ฑ
p->VirtualFunc();                 // ๋Ÿฐํƒ€์ž„ ๋™์  ๋””์ŠคํŒจ์น˜
delete[] arr;                     // ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

๋ณต๊ธฐ:

  • ์ปดํŒŒ์ผ ํƒ€์ž„ ๋น„์šฉ = ๋นŒ๋“œ ์‹œ๊ฐ„ ์ฆ๊ฐ€ (์‹คํ–‰ ์„ฑ๋Šฅ์— ๋ฌด๊ด€)
  • ๋Ÿฐํƒ€์ž„ ๋น„์šฉ = ์‹ค์ œ ์‹คํ–‰ ์†๋„์— ์ง์ ‘ ์˜ํ–ฅ
  • constexpr / ํ…œํ”Œ๋ฆฟ / static_assert โ†’ ์ปดํŒŒ์ผ ํƒ€์ž„์œผ๋กœ ๋น„์šฉ ์ด๋™
  • virtual / new / dynamic_cast โ†’ ๋Ÿฐํƒ€์ž„ ๋น„์šฉ ๋ฐœ์ƒ

RTTI (Runtime Type Information)

RTTI๋Š” ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ์‹ค์ œ(๋™์ ) ํƒ€์ž…์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” C++ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. dynamic_cast์™€ typeid ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค(vtable ๋ณด์œ )์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Animal { public: virtual ~Animal() {} };
class Dog    : public Animal { public: void Bark() {} };
class Cat    : public Animal {};

Animal* a = new Dog();

// 1. dynamic_cast โ€” ์•ˆ์ „ํ•œ ๋‹ค์šด์บ์ŠคํŠธ
Dog* d = dynamic_cast<Dog*>(a);  // ์„ฑ๊ณต
if (d) d->Bark();

Cat* c = dynamic_cast<Cat*>(a);  // ์‹คํŒจ: nullptr ๋ฐ˜ํ™˜

// 2. typeid โ€” ํƒ€์ž… ์ •๋ณด ์กฐํšŒ
#include <typeinfo>
std::cout << typeid(*a).name();
if (typeid(*a) == typeid(Dog)) { /* Dog์ž„์„ ํ™•์ธ */ }

dynamic_cast vs static_cast:

  • ๊ฒ€์‚ฌ ์‹œ์ : ์ปดํŒŒ์ผ ํƒ€์ž„ / ๋Ÿฐํƒ€์ž„
  • ์•ˆ์ „์„ฑ: ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ฑ…์ž„ / ์‹คํŒจ ์‹œ nullptr (ํฌ์ธํ„ฐ) / ์˜ˆ์™ธ (์ฐธ์กฐ)
  • ์„ฑ๋Šฅ: ์˜ค๋ฒ„ํ—ค๋“œ ์—†์Œ / vtable ์ฐธ์กฐ๋กœ ๋Ÿฐํƒ€์ž„ ๋น„์šฉ ๋ฐœ์ƒ
  • ์‚ฌ์šฉ ์กฐ๊ฑด: ๊ฐ€์ƒ ํ•จ์ˆ˜ ๋ถˆํ•„์š” / ๊ฐ€์ƒ ํ•จ์ˆ˜ 1๊ฐœ ์ด์ƒ ํ•„์š”

๋ณต๊ธฐ:

  • RTTI = dynamic_cast + typeid โ€” ๊ฐ€์ƒ ํ•จ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ๋งŒ ๋™์ž‘
  • dynamic_cast ์‹คํŒจ ์‹œ ํฌ์ธํ„ฐ๋ฉด nullptr, ์ฐธ์กฐ๋ฉด std::bad_cast ์˜ˆ์™ธ
  • -fno-rtti ์ปดํŒŒ์ผ ์˜ต์…˜์œผ๋กœ RTTI ๋น„ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ
  • RTTI ๋‚จ์šฉ์€ ์„ค๊ณ„ ๋ฌธ์ œ ์‹ ํ˜ธ โ€” ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ๋Œ€์ฒด ๊ณ ๋ ค

๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ์œ ํ˜•

๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋Š” ์ปดํŒŒ์ผ์€ ์„ฑ๊ณตํ•˜์ง€๋งŒ ์‹คํ–‰ ์ค‘์— ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ์œ ํ˜•:

  • Segmentation Fault โ€” ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ (๋„ ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ, ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ)
  • Stack Overflow โ€” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ (๋ฌดํ•œ ์žฌ๊ท€, ๊ณผ๋„ํ•œ ์ง€์—ญ ๋ณ€์ˆ˜)
  • Undefined Behavior (UB) โ€” ํ‘œ์ค€ ๋ฏธ์ •์˜ ๋™์ž‘ (๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, ๋ฒ”์œ„ ์ดˆ๊ณผ ์ ‘๊ทผ)
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leak) โ€” ํ• ๋‹น ํ›„ ํ•ด์ œ ๋ˆ„๋ฝ (new ํ›„ delete ์—†์Œ)
  • Double Free โ€” ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๋‘ ๋ฒˆ ํ•ด์ œ
  • std::exception โ€” out_of_range, bad_alloc, bad_cast
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int* p = nullptr;
*p = 42;               // nullptr ์—ญ์ฐธ์กฐ โ†’ segfault

void Infinite() { Infinite(); }   // ๋ฌดํ•œ ์žฌ๊ท€ โ†’ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

void Leak() {
    int* x = new int(42);
    // delete x; ์—†์Œ โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜
}

// ์•ˆ์ „ํ•œ ํŒจํ„ด: RAII / ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ
void Safe() {
    auto x = std::make_unique<int>(42);
}

๋ณต๊ธฐ:

  • ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žก์ง€ ๋ชปํ•จ โ†’ ์‹คํ–‰ ์ค‘ ํฌ๋ž˜์‹œ
  • UB๋Š” ํฌ๋ž˜์‹œ ์—†์ด ์กฐ์šฉํžˆ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์–ด ๊ฐ€์žฅ ์œ„ํ—˜
  • RAII / ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ยทdouble free ๋ฐฉ์ง€
  • AddressSanitizer, Valgrind๋กœ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฅ˜ ํƒ์ง€

๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (ํž™ vs ์Šคํƒ)

์Šคํƒ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ž๋™์œผ๋กœ ํ• ๋‹นยทํ•ด์ œ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๊ณ , ํž™์€ ๋Ÿฐํƒ€์ž„์— ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ new/delete๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค.

ํž™ vs ์Šคํƒ:

  • ํ• ๋‹น ์‹œ์ : ํ•จ์ˆ˜ ์ง„์ž… ์‹œ ์ž๋™ / ๋Ÿฐํƒ€์ž„ new/malloc ํ˜ธ์ถœ ์‹œ
  • ํ•ด์ œ ์‹œ์ : ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ ์ž๋™ / delete/free ํ˜ธ์ถœ ์‹œ (์ˆ˜๋™)
  • ํฌ๊ธฐ: ์ œํ•œ์ (1~8MB) / ๊ฐ€์šฉ RAM ํ•œ๋„ ๋‚ด
  • ์†๋„: ๋น ๋ฆ„ (SP ๋ ˆ์ง€์Šคํ„ฐ ์ด๋™) / ๋А๋ฆผ (OS ์‹œ์Šคํ…œ ์ฝœ ๊ฐ€๋Šฅ)
  • ์ˆ˜๋ช…: ์Šค์ฝ”ํ”„ ๋‚ด / ๋ช…์‹œ์  ํ•ด์ œ ์ „๊นŒ์ง€
1
2
3
4
5
6
7
void Example() {
    int  stackVar = 10;          // ์Šคํƒ โ€” ์ž๋™ ํ•ด์ œ
    int* heapVar  = new int(20); // ํž™ โ€” ์ˆ˜๋™ ํ•ด์ œ ํ•„์š”

    auto smart = std::make_unique<int>(30);  // RAII
    delete heapVar;
}

์–ธ๋ฆฌ์–ผ ์—”์ง„๊ณผ ๋Ÿฐํƒ€์ž„

์–ธ๋ฆฌ์–ผ ์—”์ง„์€ ๋Ÿฐํƒ€์ž„์— ๋‹ค์–‘ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Cast<T>()๋Š” RTTI ๊ธฐ๋ฐ˜ ์•ˆ์ „ํ•œ ๋‹ค์šด์บ์ŠคํŠธ, IsA<T>()๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)๊ฐ€ UObject ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์ž๋™ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ:

  • Cast<T>() โ€” UObject ํƒ€์ž… ์•ˆ์ „ ๋‹ค์šด์บ์ŠคํŠธ (dynamic_cast ์œ ์‚ฌ)
  • IsA<T>() โ€” ๋Ÿฐํƒ€์ž„ ํƒ€์ž… ๊ฒ€์‚ฌ (typeid ์œ ์‚ฌ)
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ (GC) โ€” UObject ๋ฉ”๋ชจ๋ฆฌ ์ž๋™ ํšŒ์ˆ˜ (delete ์ž๋™ํ™”)
  • BeginPlay() / Tick() โ€” vtable ๋™์  ๋””์ŠคํŒจ์น˜ (virtual ํ•จ์ˆ˜ ํ˜ธ์ถœ)
  • SpawnActor<T>() โ€” ๋Ÿฐํƒ€์ž„ ๊ฐ์ฒด ์ƒ์„ฑ
1
2
3
4
5
6
7
8
9
10
AActor* Actor = GetOwner();
ACharacter* Char = Cast<ACharacter>(Actor);  // ์‹คํŒจ ์‹œ nullptr
if (Char) Char->Jump();

if (Actor->IsA<ACharacter>()) { /* ACharacter ํŒŒ์ƒ ํƒ€์ž… */ }

UMyObject* Obj = NewObject<UMyObject>(this);  // GC๊ฐ€ ๋Ÿฐํƒ€์ž„ ๊ด€๋ฆฌ
// delete Obj;  // โ† ์ ˆ๋Œ€ ๊ธˆ์ง€! GC๊ฐ€ ์ž๋™ ํ•ด์ œ

AMyActor* Spawned = GetWorld()->SpawnActor<AMyActor>(AMyActor::StaticClass());

๋ณต๊ธฐ:

  • Cast<T>() = ์–ธ๋ฆฌ์–ผ ๋ฐฉ์‹ dynamic_cast; ์‹คํŒจ ์‹œ nullptr
  • UObject๋Š” GC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ โ†’ ์ง์ ‘ delete ๊ธˆ์ง€
  • UPROPERTY() ๋งคํฌ๋กœ๊ฐ€ ์žˆ์–ด์•ผ GC๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šค ์ถ”์  ๊ฐ€๋Šฅ
  • ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฏผ๊ฐ ์ฝ”๋“œ(Tick)์—์„œ Cast ๋‚จ์šฉ ์ฃผ์˜ โ€” ์บ์‹ฑ ๊ถŒ์žฅ
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

ยฉ GoldBoll. ์ผ๋ถ€ ๊ถŒ๋ฆฌ ๋ณด์œ 

Powered by Jekyll with Chirpy theme

์ธ๊ธฐ ํƒœ๊ทธ