CS โ runtime
๐ 04/15 - Runtime (๋ฐํ์) ์ ๋ฆฌ
Notion ์๋ณธ: https://www.notion.so/343f77b24d2f8146b9dfcf1c60ebd0cd ๋ถ๋ชจ: ์๋ฃ โ Cs ๋ฉด์ ์ค๋น โ ๊ผฌ๋ฆฌ์ง๋ฌธ ํค์๋ โ Runtime
๋ชจ์๋ฉด์ ๋ต๋ณ โ โ๋ฐํ์์ด๋ ๋ฌด์์ธ๊ฐ์?โ
๋ฐํ์(Runtime)์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ณ ์๋ ์๊ฐ์ ๋จ๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ปดํ์ผ ํ์์ด ์์ค ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๋จ๊ณ๋ผ๋ฉด, ๋ฐํ์์ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ด ์ค์ ๋ก OS ์์์ ๋์ํ๋ ๋จ๊ณ์
๋๋ค. ๋ฐํ์์๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ , ๊ฐ์ ํจ์๋ฅผ ํตํ ๋์ ๋์คํจ์น, RTTI๋ฅผ ํ์ฉํ ํ์
ํ๋ณ ๋ฑ์ด ์ผ์ด๋ฉ๋๋ค. ๋ฐํ์ ์๋ฌ๋ ์ปดํ์ผ์ ํต๊ณผํ์ง๋ง ์คํ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ก, ์ธ๊ทธ๋ฉํ
์ด์
ํดํธ, ์คํ ์ค๋ฒํ๋ก์ฐ, ์ ์๋์ง ์์ ๋์(UB) ๋ฑ์ด ๋ํ์ ์
๋๋ค. ์ธ๋ฆฌ์ผ ์์ง์์๋ BeginPlay(), Tick() ๊ฐ์ ๊ฐ์ ํจ์๋ ๋ฐํ์์ vtable์ ํตํด ๋์ ๋์คํจ์น๋๋ฉฐ, IsA()๋ Cast
ํค์๋ ์ ๋ฆฌ
๊ธฐ๋ณธ ๊ฐ๋
- ๋ฐํ์ (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; ์คํจ ์ nullptrUObject๋ GC๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ โ ์ง์ delete๊ธ์งUPROPERTY()๋งคํฌ๋ก๊ฐ ์์ด์ผ GC๊ฐ ๋ ํผ๋ฐ์ค ์ถ์ ๊ฐ๋ฅ- ๋ฐํ์ ์ฑ๋ฅ ๋ฏผ๊ฐ ์ฝ๋(Tick)์์
Cast๋จ์ฉ ์ฃผ์ โ ์บ์ฑ ๊ถ์ฅ