๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

C++์—์„œ ์™œ ํฌ์ธํŠธ๋ฅผ ์จ์•ผํ• ๊นŒ? ํฌ์ธํŠธ๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ์žฅ๋‹จ์ ์ด ์žˆ์„๊นŒ?

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ”Ž ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด ์ ‘๊ทผ vs ํฌ์ธํ„ฐ ์—†์ด ๊ฐ์ฒด ์ ‘๊ทผ

C++์—์„œ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  1. ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ ‘๊ทผ (ptr->data)
  2. ํฌ์ธํ„ฐ ์—†์ด ์ง์ ‘ ์ ‘๊ทผ (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++์—์„œ๋Š” ํฌ์ธํ„ฐ์™€ ๊ฐ์ฒด ์ง์ ‘ ์ ‘๊ทผ์˜ ์žฅ์ ์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
์ถ”๊ฐ€ ์งˆ๋ฌธ์ด ์žˆ๊ฑฐ๋‚˜ ํŠน์ • ์ฝ”๋“œ ๋ถ„์„์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ํŽธํ•˜๊ฒŒ ์งˆ๋ฌธํ•ด ์ฃผ์„ธ์š”! ๐Ÿ˜Š

728x90
๋ฐ˜์‘ํ˜•