Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C++] 스마트 포인터(Smart Pointer) 본문

Programming/C++

[Programming/C++] 스마트 포인터(Smart Pointer)

scii 2021. 2. 5. 21:44

스마트 포인터란 말 그대로 똑똑한 포인터이다. 그리고 스마트 포인터는 객체이다. 포인터의 역할을 하는 객체를 뜻한다.

#include <iostream>

#pragma warning(disable: 4996)

using std::cout;
using std::cin;
using std::endl;


class Point {
private:
    int xpos, ypos;

public:
    explicit Point(const int x = 0, const int y = 0) : xpos(x), ypos(y) {
        cout << "Point 객체 생성" << endl;
    }

    ~Point() {
        cout << "Point 객체 소멸" << endl;
    }

    void SetPos(const int x, const int y) {
        xpos = x;
        ypos = y;
    }

    friend std::ostream& operator<<(std::ostream& os, const Point& pos);
};


std::ostream& operator<<(std::ostream& os, const Point& pos) {
    os << '[' << pos.xpos << ", " << pos.ypos << ']' << endl;
    return os;
}


class SmartPtr {
private:
    Point* posptr;

public:
    explicit SmartPtr(Point* ptr) : posptr(ptr) {}

    ~SmartPtr() {
        delete posptr;
    }

    Point& operator*() const {
        return *posptr;
    }

    Point* operator->() const {
        return posptr;
    }
};


 int main(const int argc, const char* const argv[]) { 
     SmartPtr sptr1(new Point(1, 2));
     SmartPtr sptr2(new Point(2, 3));
     SmartPtr sptr3(new Point(4, 5));

     cout << *sptr1;
     cout << *sptr2;
     cout << *sptr3;

     sptr1->SetPos(10, 20);
     sptr2->SetPos(30, 40);
     sptr3->SetPos(50, 60);

     cout << *sptr1;
     cout << *sptr2;
     cout << *sptr3;

     return 0;
}

/* 결과

Point 객체 생성
Point 객체 생성
Point 객체 생성
[1, 2]
[2, 3]
[4, 5]
[10, 20]
[30, 40]
[50, 60]
Point 객체 소멸
Point 객체 소멸
Point 객체 소멸

*/

스마트 포인터의 가장 기본은 아래의 두 함수 정의에 있다. 스마트 포인터는 포인터처럼 동작하는 객체이다. 따라서 아래의 두 함수 정의는 필수이다.

Point& operator*() const {
  return *posptr;
}

Point* operator->() const {
  return posptr;
}

Point 객체의 소멸을 위한 delete 연산이 자동으로 이루어졌다. 바로 이것이 스마트 포인터의 똑똑함이다.

스마트 포인터는 전문 개발자들이 개발한 이후에도 오랜 시간 실무에 사용하면서 다음어 가는 클래스이다. 그래서 보통은 스마트 포인터를 개인적으로 구현해서 사용하는 경우는 드물며, 오랜 시간 다음어진 그래서 라이브러리의 일부로 포함되어 있는 스마트 포인터를 활용하는 경우가 대부분이다.

Comments