๐ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ์ ๊ทผ vs ํฌ์ธํฐ ์์ด ๊ฐ์ฒด ์ ๊ทผ
C++์์ ๊ฐ์ฒด์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง์ ๋๋ค.
- ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ์ ๊ทผ (ptr->data)
- ํฌ์ธํฐ ์์ด ์ง์ ์ ๊ทผ (obj.data)
๊ฐ ๋ฐฉ๋ฒ์๋ ๋ช ํํ ์ฅ๋จ์ ์ด ์์ผ๋ฉฐ, ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฉ์์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋์์๋ ๋ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋น๊ต ๋ถ์ํฉ๋๋ค.
๐ 1. ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด ์ ๊ทผ (ptr->data)
๐น ์ฅ์
โ ๋์ ํ ๋น (Dynamic Allocation) ๊ฐ๋ฅ
- ๊ฐ์ฒด๋ฅผ ๋ฐํ์์ ์์ฑํ์ฌ ์ฌ์ฉํ ์ ์์ด, ์ ์ฐํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ต์ ํ์ ์ ๋ฆฌํฉ๋๋ค.
MyClass* ptr = new MyClass();
ptr->data = 30; // ํฌ์ธํฐ ์ ๊ทผ
delete ptr; // ๋ฉ๋ชจ๋ฆฌ ํด์ (ํ์)
โ ํจ์์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ก ์ ๋ฌ (Pass by Reference)
- ํฌ์ธํฐ๋ฅผ ํตํด ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ฉด, ๋ณต์ฌ ๋น์ฉ ์์ด ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
void modifyData(MyClass* obj) {
obj->data = 50; // ์๋ณธ ๊ฐ์ฒด์ ๊ฐ ๋ณ๊ฒฝ
}
โ ๋คํ์ฑ (Polymorphism) ๋ฐ ์์ ๊ด๊ณ ์ฒ๋ฆฌ
- ์์ ๊ตฌ์กฐ์์ ๊ธฐ๋ฐ ํด๋์ค ํฌ์ธํฐ๋ก ํ์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค.
- ์ด๋ **๊ฐ์ ํจ์ (virtual function)**์ ํต์ฌ์ด๋ฉฐ, ๋์ ๋ฐ์ธ๋ฉ์ ํตํด ๋ฐํ์์ ์ ์ ํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
class Base {
public:
virtual void show() { cout << "Base ํด๋์ค" << endl; }
};
class Derived : public Base {
public:
void show() override { cout << "Derived ํด๋์ค" << endl; }
};
Base* ptr = new Derived(); // ํฌ์ธํฐ๋ก Derived ๊ฐ์ฒด ์ฐธ์กฐ
ptr->show(); // Derived ํด๋์ค (๋คํ์ฑ ์ ์ฉ)
delete ptr;
โ ๊ฐ์ฒด์ ๊ณต์ (Pointer Sharing)
- ์ฌ๋ฌ ํฌ์ธํฐ๊ฐ ํ๋์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์์ด, ๊ณต์ ์์ ๊ด๋ฆฌ์ ์ ๋ฆฌํฉ๋๋ค.
- ํนํ std::shared_ptr๊ณผ ๊ฐ์ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ฉด ์์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
#include <memory>
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
std::shared_ptr<MyClass> ptr2 = ptr1; // ๊ฐ์ฒด ๊ณต์
๐ธ ๋จ์
โ ๋ฉ๋ชจ๋ฆฌ ๋์ (Memory Leak) ์ํ
- new ํค์๋๋ก ๋์ ํ ๋นํ ๊ฐ์ฒด๋ฅผ delete๋ก ํด์ ํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
MyClass* ptr = new MyClass();
// delete ptr; // ์ด ๋ถ๋ถ์ด ๋๋ฝ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์
โ Null Pointer Dereference (๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐ) ์ํ
- ํฌ์ธํฐ๊ฐ nullptr์ด๊ฑฐ๋ ์๋ชป๋ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋น์ ์ ์ข ๋ฃ๋ฉ๋๋ค.
MyClass* ptr = nullptr;
ptr->data = 20; // ๋ฐํ์ ์๋ฌ ๋ฐ์ (Segmentation Fault)
โ ํฌ์ธํฐ ๊ด๋ฆฌ ๋ณต์ก์ฑ
- ์ค๋งํธ ํฌ์ธํฐ๊ฐ ์๋ ์ผ๋ฐ ํฌ์ธํฐ ์ฌ์ฉ ์, ํฌ์ธํฐ์ ์๋ช ์ฃผ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ์ฒ ์ ํ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
๐ 2. ํฌ์ธํฐ ์์ด ๊ฐ์ฒด ์ง์ ์ ๊ทผ (obj.data)
๐น ์ฅ์
โ ์์ ์ฑ (Safety)
- ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ๋์ ์ํ์ด ์์ต๋๋ค.
- ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ์๋์ผ๋ก ํด์ ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๊ฐํธํฉ๋๋ค.
MyClass obj; // ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ํ ๋น
obj.data = 10;
โ ์ฑ๋ฅ (Performance)
- ์คํ ๋ฉ๋ชจ๋ฆฌ์์ ํ ๋น/ํด์ ๋๋ฏ๋ก, ๋์ ํ ๋น๋ณด๋ค ๋น ๋ฅธ ์๋๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- ํจ์ ํธ์ถ ์ ํฌ์ธํฐ๋ฅผ ํตํด ์ ๊ทผํ๋ ๊ฒ๋ณด๋ค CPU ๋ช ๋ น์ด ์๊ฐ ์ ์ด ์ค๋ฒํค๋๊ฐ ์ ์ต๋๋ค.
โ ๊ฐ๊ฒฐ์ฑ (Simplicity)
- ->๋ฅผ ์ฌ์ฉํ ํ์ ์์ด . ์ฐ์ฐ์๋ก ๊ฐํธํ๊ฒ ๋ฉค๋ฒ ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
obj.data = 20; // ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ
๐ธ ๋จ์
โ ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ
- ์ ์ ํ ๋น์ด๋ฏ๋ก ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์ปดํ์ผ ์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
- ๋ฐ๋ผ์ ์คํ ์ค ์ ์ฐํ ํฌ๊ธฐ ์กฐ์ ์ด ์ด๋ ต์ต๋๋ค.
MyClass obj[100]; // ํฌ๊ธฐ๊ฐ 100๊ฐ๋ก ๊ณ ์ ๋จ
โ ์คํ ์ค๋ฒํ๋ก์ฐ (Stack Overflow) ์ํ
- ์ง๋์น๊ฒ ํฐ ๊ฐ์ฒด๋ฅผ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๋ฉด ์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
int arr[1000000]; // ๊ณผ๋ํ ํฌ๊ธฐ๋ก ์ธํด ์คํ ์ค๋ฒํ๋ก์ฐ ์ํ
โ ๋คํ์ฑ (Polymorphism) ๋ถ๊ฐ๋ฅ
- ์์ ๊ด๊ณ์์ ๊ธฐ๋ฐ ํด๋์ค ๋ณ์๋ก ํ์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ, ๋คํ์ฑ์ด ์๋ํ์ง ์์ต๋๋ค.
Base obj = Derived(); // Derived::show() ํธ์ถ ๋ถ๊ฐ๋ฅ
๐ 3. ํฌ์ธํฐ vs ์ง์ ์ ๊ทผ: ํต์ฌ ๋น๊ต
๊ธฐ์ค ํฌ์ธํฐ ์ฌ์ฉ (ptr->data) ํฌ์ธํฐ ์์ด ์ ๊ทผ (obj.data)
๋ฉ๋ชจ๋ฆฌ ํ ๋น | ํ (Heap) ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ | ์คํ (Stack) ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ |
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ | delete ํ์ (๋๋ฝ ์ ๋์ ์ํ) | ์๋ ํด์ (์์ ) |
์ ์ฐ์ฑ | ๊ฐ์ฒด ํฌ๊ธฐ ์ ๋์ (new ์ฌ์ฉ) | ๊ฐ์ฒด ํฌ๊ธฐ ๊ณ ์ |
๋คํ์ฑ (Polymorphism) | ๊ฐ๋ฅ (์์ ๊ตฌ์กฐ์์ ์ ๋ฆฌ) | ๋ถ๊ฐ๋ฅ |
์๋ (Performance) | ์๋์ ์ผ๋ก ๋๋ฆผ (ํ ์ ๊ทผ) | ์๋์ ์ผ๋ก ๋น ๋ฆ (์คํ ์ ๊ทผ) |
์๋ฌ ์ํ์ฑ | Null Pointer Dereference ๊ฐ๋ฅ | ์์ (Null ์ํ ์์) |
๊ตฌ๋ฌธ ๊ฐ๊ฒฐ์ฑ | ์๋์ ์ผ๋ก ๋ณต์ก (-> ํ์) | ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐ (. ์ฌ์ฉ) |
๐ 4. ์ด๋ค ๋ฐฉ๋ฒ์ ์ ํํด์ผ ํ ๊น?
โ ํฌ์ธํฐ ์ฌ์ฉ์ด ์ ์ ํ ๊ฒฝ์ฐ
- ๋์ ํ ๋น์ด ํ์ํ ๋ (๋ฐํ์์์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ๊ฒฐ์ )
- ๋คํ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ (์์ ๋ฐ ๊ฐ์ ํจ์ ์ฌ์ฉ)
- ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ๊ณต์ ํด์ผ ํ ๊ฒฝ์ฐ (๊ณต์ ๋ฉ๋ชจ๋ฆฌ)
- **์ค๋งํธ ํฌ์ธํฐ (std::shared_ptr, std::unique_ptr)**๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
โ ์ง์ ์ ๊ทผ์ด ์ ์ ํ ๊ฒฝ์ฐ
- ์ ์ ํฌ๊ธฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒฝ์ฐ
- ์๋๊ฐ ์ค์ํ ๊ฒฝ์ฐ (์ฑ๋ฅ ์ต์ ํ)
- ๋ณต์กํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๋ถํ์ํ ๊ฒฝ์ฐ (๊ฐ๋จํ ๋ก์ง)
๐ 5. ๊ฒฐ๋ก
- ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ์ฐ์ ํ๋ค๋ฉด → ํฌ์ธํฐ ์์ด ์ง์ ์ ๊ทผ
- ์ ์ฐ์ฑ๊ณผ ๋คํ์ฑ์ด ์ค์ํ๋ค๋ฉด → ํฌ์ธํฐ ์ฌ์ฉ
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด → ์ค๋งํธ ํฌ์ธํฐ ์ ๊ทน ํ์ฉ
C++์์๋ ํฌ์ธํฐ์ ๊ฐ์ฒด ์ง์ ์ ๊ทผ์ ์ฅ์ ์ ์ ์ ํ ์กฐํฉํ๋ ๊ฒ์ด ํต์ฌ์
๋๋ค.
์ถ๊ฐ ์ง๋ฌธ์ด ์๊ฑฐ๋ ํน์ ์ฝ๋ ๋ถ์์ด ํ์ํ๋ค๋ฉด ํธํ๊ฒ ์ง๋ฌธํด ์ฃผ์ธ์! ๐