ํฌ์ŠคํŠธ

CS โ€” pointer reference

CS โ€” pointer reference

๐Ÿ“• ํฌ์ธํ„ฐ์™€ ๋ ˆํผ๋Ÿฐ์Šค โ€” ์ฐจ์ด์  ๋ถ„์„

Notion ์›๋ณธ: https://www.notion.so/348f77b24d2f80c4ace7e1eae457d555 ๋ถ€๋ชจ: ์ž๋ฃŒ โ†’ Cs ๋ฉด์ ‘์ค€๋น„ โ†’ cs ์ฃผ์ œ ์ •๋ฆฌ ๊ธฐ์ค€์ผ: 2026-04-20

ํ•œ ์ค„ ์ •์˜

  • ํฌ์ธํ„ฐ (T*) โ€” ์–ด๋–ค ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜. ์ฃผ์†Œ ์ž์ฒด๊ฐ€ ๊ฐ’์ด๋ผ ์žฌํ• ๋‹นยท์‚ฐ์ˆ  ์—ฐ์‚ฐยทnullptr์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ ˆํผ๋Ÿฐ์Šค (T&) โ€” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์˜ ๋˜ ๋‹ค๋ฅธ ์ด๋ฆ„(๋ณ„์นญ). ์„ ์–ธ ์‹œ ๋ฐ˜๋“œ์‹œ ์›๋ณธ๊ณผ ๋ฌถ์ด๊ณ  ์ดํ›„ ๋ถ„๋ฆฌ ๋ถˆ๊ฐ€.

ํฌ์ธํ„ฐ๋Š” โ€œ์ฃผ์†Œโ€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ณ€์ˆ˜, ๋ ˆํผ๋Ÿฐ์Šค๋Š” โ€œ๊ทธ ์ž์ฒดโ€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด๋ฆ„๋งŒ ๋ฐ”๋€ ์ƒํƒœ.

์ฐจ์ด์  ๋น„๊ตํ‘œ

ํ•ญ๋ชฉํฌ์ธํ„ฐ (T*)๋ ˆํผ๋Ÿฐ์Šค (T&)
์„ ์–ธ ์‹œ ์ดˆ๊ธฐํ™”์ƒ๋žต ๊ฐ€๋Šฅ (T* p;)ํ•„์ˆ˜ (T& r = x;)
nullptr ํ—ˆ์šฉ๊ฐ€๋Šฅ (T* p = nullptr;)๋ถˆ๊ฐ€ โ€” ์œ ํšจํ•œ ๊ฐ์ฒด ํ•„์ˆ˜
์žฌํ• ๋‹น๊ฐ€๋Šฅ (p = &y;)๋ถˆ๊ฐ€ โ€” ์ˆ˜๋ช… ๋™์•ˆ ๋™์ผ ๊ฐ์ฒด
์—ญ์ฐธ์กฐ ๋ฌธ๋ฒ•*p ๋ช…์‹œ ํ•„์š”์ž๋™ (r ์ž์ฒด๊ฐ€ ์›๋ณธ์ฒ˜๋Ÿผ)
๋ฉค๋ฒ„ ์ ‘๊ทผp->memberr.member
์‚ฐ์ˆ  ์—ฐ์‚ฐ๊ฐ€๋Šฅ (p++, p + 1)๋ถˆ๊ฐ€
๋ฐฐ์—ด ๋Œ€์ฒดT[]์™€ ํ˜ธํ™˜๋ถˆ๊ฐ€
๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์ฃผ์†Œ๊ฐ’ ํฌ๊ธฐ (๋ณดํ†ต 8byte)๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฆ„
๋‹คํ˜•์„ฑ๊ฐ€๋Šฅ๊ฐ€๋Šฅ

์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”

1
2
3
4
5
6
7
8
9
int x = 10, y = 20;

// ํฌ์ธํ„ฐ โ€” ์ดˆ๊ธฐํ™” ์ƒ๋žต ๊ฐ€๋Šฅ
int* p;          // โš ๏ธ ์“ฐ๋ ˆ๊ธฐ ์ฃผ์†Œ, ์ ˆ๋Œ€ ์—ญ์ฐธ์กฐ ๊ธˆ์ง€
int* p2 = &x;    // x์˜ ์ฃผ์†Œ๋กœ ์ดˆ๊ธฐํ™”

// ๋ ˆํผ๋Ÿฐ์Šค โ€” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”
int& r = x;      // x์˜ ๋ณ„์นญ
int& r2;         // โŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ

ํ•ต์‹ฌ: ๋ ˆํผ๋Ÿฐ์Šค๋Š” โ€œ๋Œ€์ƒ ์—†๋Š” ๋ ˆํผ๋Ÿฐ์Šคโ€๊ฐ€ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅ โ€” ํ•ญ์ƒ ์œ ํšจํ•œ ๋Œ€์ƒ์ด ๋ณด์žฅ๋œ๋‹ค๋Š” ์ ์ด ํ•จ์ˆ˜ ์ธ์ž์—์„œ ๊ฐ•๋ ฅํ•œ ์•ˆ์ „์„ฑ์„ ์ œ๊ณต.


์žฌํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ

1
2
3
4
5
6
7
8
9
int a = 10, b = 20;

// ํฌ์ธํ„ฐ โ€” ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
int* p = &a;
p = &b;        // โœ… ์ด์ œ p๋Š” b๋ฅผ ๊ฐ€๋ฆฌํ‚ด

// ๋ ˆํผ๋Ÿฐ์Šค โ€” ํ•œ ๋ฒˆ ๋ฌถ์ด๋ฉด ๋
int& r = a;
r = b;         // โš ๏ธ ์žฌํ• ๋‹น์ด ์•„๋‹ˆ๋ผ "a = b" ์™€ ๋™์ผ (๊ฐ’ ๋ณต์‚ฌ)

r = b;๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ b๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ฐ”๊พธ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, r์ด ์ฐธ์กฐํ•˜๋Š” ์›๋ณธ(a)์— b์˜ ๊ฐ’์„ ๋Œ€์ž…ํ•œ๋‹ค. ๋ ˆํผ๋Ÿฐ์Šค๋Š” ํ•œ๋ฒˆ ๋ฌถ์ด๋ฉด ์ ˆ๋Œ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์—†๋‹ค.


์—ญ์ฐธ์กฐ ๋ฌธ๋ฒ•

1
2
3
4
5
6
7
8
9
10
11
int x = 5;

// ํฌ์ธํ„ฐ โ€” ๋ช…์‹œ์  ์—ญ์ฐธ์กฐ
int* p = &x;
*p = 10;
cout << *p;    // 10

// ๋ ˆํผ๋Ÿฐ์Šค โ€” ์ž๋™
int& r = x;
r = 10;
cout << r;     // 10

๊ตฌ์กฐ์ฒด ์ ‘๊ทผ:

1
2
3
4
5
6
7
8
9
struct Item { int id; };
Item i{42};

Item* p = &i;
p->id = 100;    // -> ์—ฐ์‚ฐ์ž
(*p).id = 100;  // ๋™์ผ (์—ญ์ฐธ์กฐ ํ›„ .)

Item& r = i;
r.id = 100;     // . ์—ฐ์‚ฐ์ž

nullptr / NULL

1
2
3
4
5
6
7
T* p = nullptr;     // โœ… ์œ ํšจ
T& r = *p;          // ๐Ÿ’ฅ UB โ€” null ์—ญ์ฐธ์กฐ

// ์•ˆ์ „ ํŒจํ„ด
if (p != nullptr) {
    p->doSomething();
}

์™œ ๋ ˆํผ๋Ÿฐ์Šค๋Š” nullptr์ด ์—†๋Š”๊ฐ€?

  • ๋ ˆํผ๋Ÿฐ์Šค๋Š” โ€œ๊ฐ์ฒด์˜ ๋ณ„์นญโ€์ด๋ผ๋Š” ์˜๋ฏธ๋ก ์— ๋ฌถ์—ฌ ์žˆ์–ด์„œ ๋Œ€์ƒ ์—†๋Š” ์ƒํƒœ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์—†์Œ
  • ํ•จ์ˆ˜ ์ธ์ž๋กœ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฐ›์œผ๋ฉด nullptr ์ฒดํฌ ๋ถˆํ•„์š”
  • ๋‹จ, T& r = *nullptr; ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋ฌดํšจํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ด๋Š” UB

ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ

ํฌ์ธํ„ฐ ๋ฒ„์ „

1
2
3
4
5
6
void setPotion(int count, int* p_HPPotion, int* p_MPPotion) {
    *p_HPPotion = count;   // ์—ญ์ฐธ์กฐ ํ•„์š”
    *p_MPPotion = count;
}

setPotion(5, &HPPotion, &MPPotion);  // ํ˜ธ์ถœ๋ถ€์— & ํ•„์š”

๋ ˆํผ๋Ÿฐ์Šค ๋ฒ„์ „

1
2
3
4
5
6
void setPotion(int count, int& HPPotion, int& MPPotion) {
    HPPotion = count;      // ์—ญ์ฐธ์กฐ ์—†์Œ
    MPPotion = count;
}

setPotion(5, HPPotion, MPPotion);    // ํ˜ธ์ถœ๋ถ€๊ฐ€ ๊น”๋”

const ๋ ˆํผ๋Ÿฐ์Šค โ€” ์ฝ๊ธฐ ์ „์šฉ ํšจ์œจ

1
2
3
4
void InitWeapon(const FWeaponData& InData, const FWeaponAssets& InAssets)
{
    // ๋ณต์‚ฌ ๋น„์šฉ ์—†์ด ์ฝ๊ธฐ๋งŒ โ†’ ๊ฐ€์žฅ ํ”ํžˆ ์“ฐ๋Š” ํŒจํ„ด
}

์„ ํƒ ๊ธฐ์ค€:

์ƒํ™ฉ์ถ”์ฒœ
๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ ๊ฐ์ฒด๋งŒ ๋ฐ›์Œ๋ ˆํผ๋Ÿฐ์Šค
โ€œ์—†์„ ์ˆ˜๋„ ์žˆ์Œโ€์„ ํ‘œํ˜„ํฌ์ธํ„ฐ (nullptr)
์ฝ๊ธฐ ์ „์šฉ ํฐ ๊ฐ์ฒดconst T&
์†Œ์œ ๊ถŒ ์ด์ „std::unique_ptr<T> (์ด๋™)

ํด๋ž˜์Šค ๋ฉค๋ฒ„์—์„œ ์‚ฌ์šฉ

1
2
3
4
5
6
class APlayer
{
    AWeapon* CurrentWeapon;   // โœ… ์žฅ์ฐฉ ์ „์—๋Š” nullptr ๊ฐ€๋Šฅ
    AWorld&  World;           // โš ๏ธ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐ˜๋“œ์‹œ ๋ฌถ์–ด์•ผ ํ•จ
                              //   + ๋ณต์‚ฌ/๋Œ€์ž… ์—ฐ์‚ฐ์ž ์ž‘์„ฑ ๊ณค๋ž€
};

๋ ˆํผ๋Ÿฐ์Šค ๋ฉค๋ฒ„์˜ ์ œ์•ฝ:

  • ์ƒ์„ฑ์ž ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”
  • ์ดํ›„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€ โ†’ ๊ธฐ๋ณธ ๋Œ€์ž… ์—ฐ์‚ฐ์ž ์ž๋™ ์‚ญ์ œ
  • ์†Œ์œ  ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ โ€œํ‰์ƒ ๊ฐ™์ด ๋‹ค๋‹ˆ๋Š” ์—ฐ๊ด€ ๊ฐ์ฒดโ€์ผ ๋•Œ๋งŒ ๊ถŒ์žฅ

์‹ค๋ฌด์—์„œ๋Š” ๋ฉค๋ฒ„๋กœ ํฌ์ธํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์œ ์—ฐ.


๋‹คํ˜•์„ฑ๊ณผ ๋™์  ๋””์ŠคํŒจ์น˜

๋‘˜ ๋‹ค ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•œ๋‹ค โ€” ํ•ต์‹ฌ์€ โ€œ์–ด๋–ป๊ฒŒ ๊ฐ์ฒด๋ฅผ ์žก๊ณ  ์žˆ๋А๋ƒโ€๊ฐ€ ์•„๋‹ˆ๋ผ โ€œ์žก์€ ๊ฐ์ฒด๊ฐ€ virtual ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๋А๋ƒโ€.

1
2
3
4
5
6
7
8
9
10
11
// ํฌ์ธํ„ฐ ๋ฒ„์ „
Player* player = new Warrior(nickname);
player->attack();           // ์ž์‹ attack() ํ˜ธ์ถœ

Player* player2 = new Magician(nickname);
player2->attack();          // ๋‹ค๋ฅธ ์ž์‹์˜ attack()

// ๋ ˆํผ๋Ÿฐ์Šค ๋ฒ„์ „
Warrior w("Lupang");
Player& ref = w;
ref.attack();               // ์ž์‹ attack() โ€” ๋™์ผํ•˜๊ฒŒ ๋™์ž‘

๊ฐ€์ƒ ์†Œ๋ฉธ์ž ํ•„์ˆ˜: delete player; ๊ฐ€ ์ž์‹ ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ๋ถ€๋ชจ๊ฐ€ virtual ~Player()๋กœ ์„ ์–ธ. ๋ ˆํผ๋Ÿฐ์Šค๋Š” delete ๋ถˆ๊ฐ€๋ผ ์ด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.


๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ

1
2
3
4
5
6
7
8
9
10
int arr[5] = {1, 2, 3, 4, 5};
int* p = arr;        // ๋ฐฐ์—ด ์ด๋ฆ„์ด ํฌ์ธํ„ฐ๋กœ ์ž๋™ ๊ฐ์‡ (decay)

// ํฌ์ธํ„ฐ ์‚ฐ์ˆ 
p[2] = 30;           // arr[2]
*(p + 2) = 30;       // ๋™์ผ
p++;                 // p๊ฐ€ ๋‹ค์Œ ์›์†Œ

// ๋ ˆํผ๋Ÿฐ์Šค โ€” ๋ฐฐ์—ด ์ „์ฒด ์ฐธ์กฐ
int (&rArr)[5] = arr;  // ํฌ๊ธฐ ์ •๋ณด ์œ ์ง€

์–ธ๋ฆฌ์–ผ์—์„œ์˜ ํฌ์ธํ„ฐ

์›์‹œ ํฌ์ธํ„ฐ vs TObjectPtr

์ƒํ™ฉ๊ถŒ์žฅ์ด์œ 
ํ—ค๋”์—์„œ UPROPERTY() ๋ฉค๋ฒ„ ๋ณ€์ˆ˜TObjectPtr<T>์ง€์—ฐ ๋กœ๋”ฉ + ์•ก์„ธ์Šค ํŠธ๋ž˜ํ‚น
์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜T* ์›์‹œ ํฌ์ธํ„ฐํŠธ๋ž˜ํ‚น ์˜ค๋ฒ„ํ—ค๋“œ ๋ถˆํ•„์š”
1
2
3
4
5
6
7
8
9
// UE5 ๊ถŒ์žฅ
UPROPERTY(EditAnywhere)
TObjectPtr<USceneComponent> RootComp;

// ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ
void UseComp() {
    USceneComponent* Local = RootComp;
    Local->SetVisibility(false);
}

๋ฐ˜๋ณต๋ฌธ์—์„œ auto* ๋Œ€์‹  auto&

1
2
3
4
5
6
7
TArray<TObjectPtr<USceneComponent>> Components;

// โŒ ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค TObjectPtr ๋‚ด๋ถ€ ๋กœ์ง ์žฌ์‹คํ–‰
for (auto* Component : Components) { }

// โœ… ๋ฐฐ์—ด ์•ˆ TObjectPtr ์ž์ฒด๋ฅผ ์ฐธ์กฐ๋งŒ ํ•จ
for (auto& Component : Components) { }

ํ•ต์‹ฌ ์›๋ฆฌ: ํฌ์ธํ„ฐ๋Š” ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•ด์˜ค๋Š” ๊ฒƒ, ๋ ˆํผ๋Ÿฐ์Šค๋Š” ์›๋ณธ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์”€ โ€” ์ด ์ฐจ์ด๋กœ TObjectPtr ๋‚ด๋ถ€ ๋กœ์ง์ด ํ•œ ๋ฒˆ ๋” ๋Œ์ง€ ์•Š๋Š”๋‹ค.

UPROPERTY์˜ ์—ญํ• 

1
2
3
4
UPROPERTY()                  // GC๊ฐ€ ์ด ํฌ์ธํ„ฐ๋ฅผ ์ถ”์  โ†’ ์ˆ˜๊ฑฐ ์•ˆ ๋จ
UMyComponent* SafeComp;

UMyComponent* DangerousComp; // UPROPERTY ์—†์Œ โ†’ GC๊ฐ€ ์ˆ˜๊ฑฐ ๊ฐ€๋Šฅ โ†’ ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ

TSubclassOf

ํด๋ž˜์Šค๋ฅผ ๋‹ด๋Š” ๋ฐ”๊ตฌ๋‹ˆ โ€” ๋ ˆ๋ฒจ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” TObjectPtr๊ณผ ๋‹ค๋ฅด๊ฒŒ โ€œClass ์ž์ฒดโ€๋ฅผ ๋‹ด๋Š” ํƒ€์ž… ์•ˆ์ „ ํฌ์ธํ„ฐ.

1
2
UPROPERTY(EditAnywhere)
TSubclassOf<UActorComponent> CompClass;

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์™€ ์ˆœํ™˜ ์ฐธ์กฐ

1
2
3
4
5
6
7
8
9
struct Node {
    shared_ptr<Node> next;
    shared_ptr<Node> prev;
};
auto a = make_shared<Node>();  // ref = 1
auto b = make_shared<Node>();  // ref = 1
a->next = b;   // b ref = 2
b->prev = a;   // a ref = 2
// a, b ์†Œ๋ฉธ ์‹œ ref 2 โ†’ 1 โ†’ ์˜์›ํžˆ 0 ์•ˆ ๋จ โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

ํ•ด๊ฒฐ: ํ•œ์ชฝ์„ weak_ptr๋กœ

1
2
3
4
struct Node {
    shared_ptr<Node> next;   // ๊ฐ•ํ•œ ์ฐธ์กฐ
    weak_ptr<Node>   prev;   // ์•ฝํ•œ ์ฐธ์กฐ
};
ย shared_ptrweak_ptr
์ฐธ์กฐ ์นด์šดํŠธ ์ฆ๊ฐ€โœ…โŒ
๊ฐ์ฒด ์ˆ˜๋ช… ์—ฐ์žฅโœ…โŒ
์ˆœํ™˜ ์ฐธ์กฐ์œ ๋ฐœํ•ด๊ฒฐ์ฑ…

ํ™œ์šฉ ์›์น™: ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ(์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ, ๋ถ€๋ชจโ†”์ž์‹)์—์„œ ํ•œ์ชฝ์„ ๋ฐ˜๋“œ์‹œ weak_ptr๋กœ ์‚ฌ์šฉ.


์ฃผ์š” ํ‚ค์›Œ๋“œ ์š”์•ฝ

๋ฌธ๋ฒ• ์ˆ˜์ค€

  • & โ€” ์ฃผ์†Œ ์—ฐ์‚ฐ์ž / ๋ ˆํผ๋Ÿฐ์Šค ์„ ์–ธ (์œ„์น˜๋กœ ๊ตฌ๋ถ„)
  • * โ€” ํฌ์ธํ„ฐ ์„ ์–ธ / ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž (์œ„์น˜๋กœ ๊ตฌ๋ถ„)
  • -> โ€” ํฌ์ธํ„ฐ์˜ ๋ฉค๋ฒ„ ์ ‘๊ทผ
  • nullptr โ€” ํฌ์ธํ„ฐ ์ „์šฉ, ๋ ˆํผ๋Ÿฐ์Šค์—๋Š” ์—†์Œ

์ˆ˜๋ช…ยท์‹๋ณ„

  • ํฌ์ธํ„ฐ = ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜ (๋…๋ฆฝ๋œ ์ €์žฅ์†Œ ์กด์žฌ)
  • ๋ ˆํผ๋Ÿฐ์Šค = ๋ณ„์นญ (alias) (์›๋ณธ๊ณผ ๋™์ผ ๊ฐ์ฒด)
  • ๋ ˆํผ๋Ÿฐ์Šค๋Š” ์ดˆ๊ธฐํ™” ์‹œ์  1ํšŒ ๋ฐ”์ธ๋”ฉ โ†’ ์žฌํ• ๋‹น ๋ถˆ๊ฐ€

ํ•จ์ˆ˜ ์ธ์ž ์„ ํƒ ๊ทœ์น™

์š”๊ตฌ์„ ํƒ
๊ฐ’ ์ˆ˜์ •, ์œ ํšจ์„ฑ ๋ณด์žฅT&
์ฝ๊ธฐ ์ „์šฉ, ์œ ํšจ์„ฑ ๋ณด์žฅconst T&
๊ฐ’ ์ˆ˜์ •, โ€œ์—†์„ ์ˆ˜๋„โ€ ํ—ˆ์šฉT*
์†Œ์œ ๊ถŒ ์ด์ „std::unique_ptr<T> + std::move

์–ธ๋ฆฌ์–ผ ํ™•์žฅ

  • UPROPERTY() ์—†๋Š” UObject ํฌ์ธํ„ฐ = GC ์ˆ˜๊ฑฐ โ†’ ์‚ฌ์šฉ ๊ธˆ์ง€
  • ํ—ค๋” UPROPERTY ๋ฉค๋ฒ„๋Š” TObjectPtr<T> ๊ถŒ์žฅ
  • ์ง€์—ญ ๋ณ€์ˆ˜ยท๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ๊ฐ€ ํšจ์œจ์ 
  • ํด๋ž˜์Šค๋ฅผ ๋‹ด์„ ๋•Œ๋Š” UClass* ๋Œ€์‹  TSubclassOf<T>
  • TArray<TObjectPtr<T>> ์ˆœํšŒ๋Š” auto&๋กœ

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ

  • shared_ptr โ€” ์ฐธ์กฐ ์นด์šดํŠธ ๊ธฐ๋ฐ˜ ๊ณต์œ  ์†Œ์œ ๊ถŒ
  • unique_ptr โ€” ๋‹จ๋… ์†Œ์œ ๊ถŒ, ์ด๋™ ์ „์šฉ
  • weak_ptr โ€” ์นด์šดํŠธ ์ฆ๊ฐ€ ์—†๋Š” ์•ฝํ•œ ๊ด€์ฐฐ์ž, ์ˆœํ™˜ ์ฐธ์กฐ ๋Š๊ธฐ์šฉ

๋ณต๊ธฐ

  • ํฌ์ธํ„ฐ๋Š” โ€œ์–ด๋”” ์žˆ๋Š”์ง€โ€, ๋ ˆํผ๋Ÿฐ์Šค๋Š” โ€œ๊ทธ ์ž์ฒดโ€ โ€” ์ด ํ•œ ๋ฌธ์žฅ์ด ๋ฌธ๋ฒ•ยท๋™์ž‘ ์ฐจ์ด์˜ ๋ชจ๋“  ๋ฟŒ๋ฆฌ
  • const T&๋Š” C++์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์“ฐ๋Š” ํ•จ์ˆ˜ ์ธ์ž ํŒจํ„ด
  • UE5๋Š” ์›์‹œ UObject* ๋Œ€์‹  TObjectPtr<T>์„ ๋ฐ€์ง€๋งŒ, ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์—ฌ์ „ํžˆ ์›์‹œ ํฌ์ธํ„ฐ๊ฐ€ ๋น ๋ฆ„
  • auto* ๋Œ€์‹  auto&๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” โ€œTObjectPtr ๊ฐ์‡  ๋น„์šฉโ€ ๋•Œ๋ฌธ
  • ์ˆœํ™˜ ์ฐธ์กฐ ์ƒํ™ฉ์—์„œ โ€œ์–‘์ชฝ ๋ชจ๋‘ shared_ptr โ†’ ๋ˆ„์ˆ˜โ€๋Š” ๋ฉด์ ‘ ๋‹จ๊ณจ โ€” ํ•œ์ชฝ์„ weak_ptr๋กœ ๋Š๋Š” ํŒจํ„ด ์•”๊ธฐ
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

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

Powered by Jekyll with Chirpy theme

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