- ๊ฐ์ฒด์งํฅ
- ๋์ ํ ๋น
- ๋ณต์ฌ
- ํ์ ๋ณํ
- Sequence Container
- ์ฐ๊ด Container - Map(multimap) / Set(multiset)
- Modern C++
-
Data Hinding ์๋์ฑ
: Encapsulation ์บก์ํ, ๋ชฐ๋ผ๋ ๋๋ ๊ฒ์ ๊น๋ํ ์จ๊ธฐ๊ฒ ํ๋ ๋ชฉ์ , ์์ ๋ ์์ฑ-
์ ๊ทผ์ง์ ์
public
๋๊ตฌ์๊ฒ๋ ์ ๊ทผ
protected
์์๊ด๊ณ์ ํํด์๋ง ์ ๊ทผ- ์์์ ๊ทผ์ง์ ์
: ์์๋ฐ๋ class๊ฐ ๋ฐ์ ๋ถ๋ชจclass๋ฅผ ์์ ์ ๋ค์์ธ๋์๊ฒ ์ด๋ป๊ฒ ๋ฌผ๋ ค์ค์ง
class SuperCar : public Car {}
private
์ค์ง ์๊ธฐ์์ ๋ง ์ ๊ทผ -> ์ ๊ทผ์ด ํ์ํ๋ค๋ฉด, ๋ฉค๋ฒํจ์ ์ฌ์ฉ - ์์์ ๊ทผ์ง์ ์
-
Polymorpism ๋คํ์ฑ
overloading
ํจ์ ์ค๋ณต์ ์ (์ด๋ฆ์ ์ฌ์ฌ์ฉ, ์ธ์์ ํํ์ ๋ฐ๋ผ)
int moveCar(int speed); int moveCar();
overoverriding
์ฌ์ ์ (๋ถ๋ชจํจ์๋ฅผ ์์์์ ์ฌ์ ์)
class Player { // ๋ถ๋ชจ public: int MovePlayer(Player* player){ cout << "Player Move!" << endl; } } class Knight : pubic Player { //์์ public: int MovePlayer(Kinght* knight){ cout << "Kinght Move!" << endl; } } Player p; MovePlayer(&p); // "Player Move!" MoveKnight(&p); // (1) - ERROR! Kngiht k; MovePlayer(&k); // (2) - "Player Move!" MoveKnight(&k); // "Kinght Move!"
์์๊ด๊ณ์์๋ ๋ถ๋ชจ-์์ class์ ํฌํจ๊ด๊ณ ๋ฅผ ์๊ฐํด๋ณด๋ ๊ฒ์ด ์ข๋ค
๋ญ ๋น์ฐํ๋ค๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ผ ์ ์๋ค...+ (1) ๋ถ๋ชจ -> ์์ X + (2) ์์ -> ๋ถ๋ชจ O
๋จ, (2)์ ๊ฒฝ์ฐ "Kinght Move!" ๊ฐ ์๋๋ผ "Player Move!" ๊ฐ ์ถ๋ ฅ๋๋ค
์ด๋ฅผ Knight๋ก ์ถ๋ ฅํ๊ธฐ ์ํด์ , ์๋ ๊ฐ๋ ์ด ํ์ํ๋ฐ,virtual
๊ฐ์ํจ์
:vftable
์ ์ด๋๋ก ๊ฐ์ผํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฅํด ์ํ๋ ๊ฒ์ ์คํํด์ค๋ค
// class Player virtual int VMove(Player* player); void MovePlayer(Player* player){ player->VMove(); } // class Knight virtual int VMove(Kinght* knight); int main(){ Kinght k; MovePlayer(&k); // k์ VMove๋ก ์ด๋ }
ํด๋น ๊ฐ๋ ์
๋์ ๋ฐ์ธ๋ฉ
์คํ ์์ ์ ๊ฒฐ์
vs์ ์ ๋ฐ์ธ๋ฉ
์ปดํ์ผ์์ ์ ์ด๋ ๊ฒ์ ๋ถ๋ฌ์ฌ์ง ๊ฒฐ์
-
: ๊ด๊ณ์๋ ๊ฐ์ผ๋ก key
์ value
๋ฅผ ๋ฌถ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ container
- ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๊ณ ์ํ ๋ ์ ์ฉ(์๋์ ๋จ์ ๋ณด์)
- ๊ธฐ์กด
vector
list
๋ฑ์ ์ ํ์๋ฃ๊ตฌ์กฐ๋ก, ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ๊ณ ๋์. - ๋ค์ด์จ ์์๋๋ก ์ ์ฅ์ ํ๋ ์ํ์คcontainer์ ๋ค๋ฅด๊ฒ ํน์ ๊ท์น์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ์ข
๋ฅ :
map
multimap
set
multiset
: node
๊ธฐ๋ฐ์ธ ๊ท ํ์ด์งํธ๋ฆฌ
๋ก ๊ตฌ์ฑ
#include <map>
class Node{
public:
Node* _left;
Node* _right;
// Data
int key, _value;
pair<int,int> _data; // pair๋ก key, value ๋์ ์ ์ธ ๊ฐ๋ฅ
};
int main(){
map<int,int> m;
๐ฉ๐ปโ๐ป ์ฃผ์ ํจ์
-
insert()
key์ value๋์ ์ฝ์make_pair(key,value)
pair<int,int>(key,value)
๋ฐํ๊ฐ :map.first
= ์ฝ์ iterator /map.second
= ์ฝ์ ์ฑ๊ณต์ฌ๋ถpair<map<int,int>::iterator, bool> ok; ok = m.insert(1,100); ok = m.insert(1,200); // key ์ค๋ณต์ ๋ฌด์์ฒ๋ฆฌ(๊ฐ ๋ฎ์ด์ฐ๊ธฐ X), bool false ๋ฐํ
[index]
์ ๊ทผ ๋ฐ ๋ฐ์ดํฐ ์ฝ์ ๋ ๊ฐ๋ฅ๐ ์์ผ๋ฉด ์ถ๊ฐ, ์์ผ๋ฉด ์์ .ver1 =
find()
ํ์ฉ : ์์ผ๋ฉดinsert
/ ์์ผ๋ฉดiterator์ second
์์
๐ ์์ผ๋ฉด ์ถ๊ฐ, ์์ผ๋ฉด ์์ .ver2 =[index]
ํ์ฉ : ์์ผ๋ฉด ๋ฐ๋ก์ถ๊ฐ / ์์ผ๋ฉด ๋ฐ๋ก์์ m[5] = 500;
๊ทธ๋ฌ๋, index ๊ธฐ๋ฐ ์ฝ๋ ์ฌ์ฉ'๋ง'์ผ๋ก๋ ๋ฐ์ดํฐ ์์ฑํ๋ค๋ ์ ์ฃผ์ (!!!)
-
erase()
key ๋ ๋ฒ์๋ก ์ญ์ ์์น ์ง์ ๊ฐ๋ฅ
๋ฐํ๊ฐ :<unsigned int>
unsigned int count; count = m.erase(1); // count = 1 count = m.erase(1); // count = 0, ์ด๋ฏธ ์ง์ด ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๊ณ ์ ํ ๋๋ ๋ฌด์
-
find()
๋ฐํ๊ฐ : ์์ผ๋ฉด ์ฐพ์ ๊ฐ์iterator
/ ์์ผ๋ฉดend()
map<int,int>::iterator findIt = m.find(key); if(findIt != m.end()) // ์ฐพ๋ ๊ฐ ์์ cout<< "TRUE"<< endl; else // ์ฐพ๋ ๊ฐ ์์ cout<< "FALSE"<< endl;
๐บ map ์ํ
for(map<int,int>::iterator it = m.begin(); it != m.end(); ++it){ pair<const int, int>& p = (*it); int key = p.first; // p ์ ์ธ์ ์ํด์คฌ๋ค๋ฉด, it->first int value = p.second; }
- sorting : ๊ธฐ๋ณธ key์ ๋ํ
์ค๋ฆ์ฐจ์
์ ์ฅ,value
์ ๊ฐ์ผ๋ก ์ ๋ ฌ์ ํ๊ณ ์ํ๋ค๋ฉด,map
์ ๋ํด ๋ฐ๋ก sort๋ ์๋๊ณvector
๋ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ์ ๋ณต์ฌํด์ ์ฌ์ฉ
- sorting : ๊ธฐ๋ณธ key์ ๋ํ
๐ multimap
: map
์์ ์ค๋ณต key
ํ์ฉ
๐ฉ๐ปโ๐ป ์ฃผ์ ํจ์
-
insert()
multimap<int, int> mm; mm.insert(make_pair(1,100)); mm.insert(make_pair(1,200)); mm.insert(make_pair(1,300)); mm.insert(make_pair(2,400)); mm.insert(make_pair(2,500));
-
erase()
find()
unsigned int count = mm.erase(1); // key๊ฐ 1์ธ ๋ฐ์ดํฐ ๋ค ์ญ์ , count๋ 3 // find()๋ก ํ๋์ฉ๋ erase ๊ฐ๋ฅ multimap<int, int>::iterator itFind = mm.find(1); // ์ค๋ณต key์ ์ฒซ iterator ๋ฐํ if( itFind != mm.end() ) mm.erase(itFind); // key = 1, value = 100์ธ ๋ฐ์ดํฐ ์ญ์ // ++์ฐ์ฐ์๋ก ๋ค์ iterator๋ก๋ ์ ๊ทผํด์ ์ญ์ ๊ฐ๋ฅ
-
equal_range()
: ๋ฒ์ ๋ฐํ ํจ์pair<multimap<int,int>::iterator, multimap<int,int>::iterator> itPair; // start iterator, end iterator itPair = mm.equal_range(1); itPair.first == lower_bound(1); // start iterator itPair.second == upper_bound(1); // end iterator
: map
๊ณผ ๋ฌ๋ฆฌ key
๊ฐ ํ๋๋ง ๋ฐ์ดํฐ์ ์ ์ฅํ๋ container
- ํ๋์ ๊ฐ๋ง์ ์ ์ฅํ๋ค๋ ํน์ง ์ด์ธ์๋
map
๊ณผ ๊ฑฐ์ ์ ์ฌ - ๋จ,
[index]
์ฌ์ฉ์ ๋ถ๊ฐ
๐ multiset
: set
์์ ์ค๋ณต key
ํ์ฉ
-
auto
: ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์๋ฃํ์ ์ถ๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ// type deduction int a = 1; auto a = 1; // ์ผ์ข ์ ์กฐ์ปค์นด๋ ๋๋! ๐
๐งจ warning -
const
์&
๋ ๋ฌด์ , ๊ฐ๋ ์ฑ์ ํ๋ฝํ๋ค๋ ์ => ๋จ์ฉ์ ๊ธ์ง!int a = 1; const int cst = a; int& ref = a; auto teat1 = cst; // auto type = int auto test2 = ref; // auto type = int
-
์ค๊ดํธ ์ด๊ธฐํ { }
:=
์ด๋()
๋ก ์ด๊ธฐํํ๋ ๊ธฐ๋ฅ์์, ์ถ๊ฐ์ ์ผ๋ก ์๊ธด ์ด๊ธฐํ ๊ธฐ๋ฅ (์ด๊ธฐํ ๋ฌธ๋ฒ์ ์ผ์นํ)int a = 0; int b(0); int c {0}; vector<int> v1 {1, 2, 3, 4};
๐๐ป ์ฅ์ - container์ ์์ด์ธ๋ฆฌ๋ฉฐ, ์ถ์๋ณํ๋ฐฉ์ง ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค
int x = 0; double y = x; // ERROR (X) double z {x}; // ERROR (O) ! โ ์คํ๋๋ ์ฝ๋์ ์๋ฃํ์ ๊ผผ๊ผผํ check
๐งจ warning -
initializer_list
: ์ด๊ธฐํ ๋ฆฌ์คํธclass Knight{ public: Knight(initializer_list<int> li) {} Knight(int a, int b) {} // ๋งค๊ฐ๋ณ์๋ก int์ธ์๋ฅผ ๋๊ฐ ๋ฐ๋ ์์ฑ์ } int main(){ Knight k1; // ๊ธฐ๋ณธ ์์ฑ์ ํธ์ถ Knight k2{}; // ๊ธฐ๋ณธ ์์ฑ์ ํธ์ถ Knight k3{1, 2}; // Knight(initializer_list<int> li) ์์ฑ์ ํธ์ถ = ์ฐ์ ์์๊ฐ ์ ์ผ ์์ ์์, ์กฐ์ฌ! // ์ถ๊ฐ์ ์ผ๋ก ์๋ฉด ์ข์ ๊ฒ vector<int> v2(5, 2); // [2, 2, 2 ,2, 2] vector<int> v3{5, 2}; // [5, 2] }
-
nullptr
: ์ฃผ์๋ฅผNULL
๋ก ์ค์ ํด์ฃผ๋ ๊ธฐ๋ฅ
๐ ์ด์ ์ ์ฌ์ฉํ๋NULL
0
์ ๋จ์ ์ ์ํด ์์ฑvoid Test(int a) {cout << 'int' <<endl;} // ์ ์ void Test(void* ptr) {cout << 'ptr' <<endl;} // ํฌ์ธํฐ int main(){ Test(0); // int Test(NULL); // int => NULL๊ฐ๋ ์ ์์์๋ '0'์ผ๋ก ์ ์๋์ด์์, ์ ์์ธ์์ผ๋ก ํฌ์ธํฐ ์ ๊ทผ ๋ถ๊ฐ Test(nullptr); // ptr => ํฌ์ธํฐ ์ ๊ทผ! ์์ ๊ฐ์๋ ์ค์๋์ ๋ฐฉ์งํด์ค๋ค + ๊ฐ๋ ์ฑ ์ฆ๊ฐ }
-
using
: ๊ธฐ์กดtypedef
์ ๊ธฐ๋ฅ ๋์ ์ธ์์๋ ์๋ก์ด ๋ณ์นญ ๋ฌธ๋ฒ๐
using
๐typedef
-
๊ธฐ์ ์์ ์์ด โ ๊ฐ๋ ์ฑ(์ง๊ด์ฑ) ์์น
typedef int id1; using id2 = int; // ํจ์ํฌ์ธํฐ typedef void(*myFunc1)(); using myFunc2 = void(*)();
-
template
์ฌ์ฉ โtypedef
์์๋ ๋ฐ๋ก ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ์template<typename T> struct List1{ // ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ์ด์ฐจ์ ์ผ๋ก ์ ์๋ฅผ ํด์ผํ์ typedef std::list<T> type; } template<typename T> using List2 = std::list<T> // ๋ฐ๋ก ๊ฐ๋ฅ int main(){ List1<int>::type li1; // typedef List2<int> li2; // using }
-
-
enum class
: ๊ธฐ์กดenum
์ ๊ธฐ๋ฅ์์ ์ ํจ๋ฒ์๋ฅผ ๊ฐ์ง ์๋ก์ด ์ด๊ฑฐํscoped enum
enum Name1 { A, B, C}; enum class Name2 { D, E, F}; int main(){ int A = 1; // ERROR int D = 2; // possible }
-
์ด๋ฆ ๊ณต๊ฐ ๊ด๋ฆฌ(scoped)
: ๊ธฐ์กดenum
์์ ํ์ฉ๋ ์ด๋ฆ์ ๋ฒ์๋ฅผ์ ์ญ
์ผ๋ก ์ธ์ํด ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉ์ด ๋ถ๊ฐํ์ง๋ง,enum class
๋์ง์ญ
์ผ๋ก ์ธ์ํด ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ! -
์๋ฌต์ ๋ณํ ๊ธ์ง
: ๊ธฐ์กดenum
์์ ์ ์๋ ์ด๋ฆ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก์ ์
๋ก ์ธ์ โ ๋น๊ต๊ฐ ๊ฐ๋ฅํ์
๊ทธ๋ฌ๋enum class
๋ ์ ์๋ก ์ธ์์ ํ์ง ์๊ธฐ์ ๋น๊ต๋ ๋ค๋ฅธ ๋ณ์์ ๋ฃ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋จ
(๋ญ ๊ตณ์ด ๊ฐ์ ์ ์ผ๋ก casting ํ๋ฉด 100% ๋ถ๊ฐ๋ฅ์ ์๋๊ธด ํจ)if (A == 1) { return true; } if (D == 1) { return false; }
์ถ๊ฐ์ ์ผ๋ก
enum
enum class
์ size๋int
์ธ4byte
๋ก ๋์ด์์ โ ์ง์ ์ ์ฌ์ด์ฆ ๋ณํ ๊ฐ๋ฅenum Name1 : char { A, B, C}; // sizeof(Name1) = 1 enum class Name2 : char { D, E, F}; // sizeof(Name2) = 1
-
-
delete ์ญ์ ๋ ํจ์
: ๋์ ํ ๋น ์์ฑnew๊ณผ ์๋ฉธdelete๊ฐ ์๋ํจ์์ ๊ธฐ๋ฅ์ ์ญ์
ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ// class์ ๋ณต์ฌ ๋์ ์ฐ์ฐ์์ ๊ธฐ๋ฅ์ ๋ง๊ณ ์ํ ๋ (๊ฐ์ฒด ๋ณต์ฌ ๊ธฐ๋ฅ) class Knight { public: void operator =(const Knight& k) = delete; // ๊ตฌํ๋ถ X
-
override
final
1๏ธโฃ : ๊ฐ์ํจ์์์virtual
์ ์ด๋์๋ถํฐ ์์ ๋์ด ์ฌ์ฉํ๋์ง ์๊ณ ์ ํ ๋ ์ฌ์ฉ
โ ๊ฐ๋ ์ฑ ์ฆ๊ฐ & ์์ ์ฌ์ ์๋ ํจ์์์ ๋ฐ๋ก ์๋ ค์ฃผ๋ ๊ธฐ๋ฅ ์ํ โ ๋ถ๋ชจ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์ฐพ๊ธฐ ๊ฐ๋ฅ2๏ธโฃ : ๊ฐ์ํจ์์์ ์์ ์ด ๊ฐ์ฅ ๋ง์ง๋ง ์์ ์ฌ์ ์ ํจ์์์ ๊ฐ๋ฆฌํฌ ๋ ์ฌ์ฉ (๋ ๋ฐ์ผ๋ก ๋ด๋ ค๊ฐ ์ ์์, ๋ด์ธ)
virtual void Attack() override { ~ } virtual void Attack() final { ~ } // 1. A (parents) โ 2. B override โ 3. C final โ 4. D (ERROR!)
โฐ
const
: ํจ์ ๋ค์ ๋ถ์ด๋ฉดread only
๋ก ๊ธฐ๋ฅvirtual void Attack(int a) const { a = 3; // ERROR ! }
(์๋ ๋ด์ฉ๋ค ๋ณด์ ๋ฐ ์์ ์์ )
RValue reference ์ค๋ฅธ๊ฐ ์ฐธ์กฐ
: ์ค๋ฅธ๊ฐ๋ง ์ฐธ์กฐํ ์ ์๋ ์ฐธ์กฐ type (ํญ์์ค๋ฅธ๊ฐ = ์ค๋ฅธ๊ฐ ์ฐธ์กฐ
๋ ์๋)
โ Lvalue
: ๋จ์ผ์์ ๋์ด์ ๊ณ์๋๋ ๊ฐ์ฒด
โ Rvalue
: LValue
๊ฐ ์๋ ๋๋จธ์ง = ์ง์๋์ง ์๋ ๊ฐ์ฒด (์์๊ฐ(= ์๋ฉธ๋ ๊ฒ), ์ด๊ฑฐํ, ๋๋ค, i++ etc)
int a = 3; // a : LValue / 3 : RValue
LValue
๋ฅผ ๋ฃ์ ๊ณณ์ RValue
๋ฅผ ์
๋ ฅํ๋ค๋ฉด, ์ค๋ฅ๋ฅผ ๋ฑ๋๋ค
์ค๋ฅธ๊ฐ ์ฐธ์กฐ๋ฅผ ํตํด ๋์จ ๊ฐ๋
์ด๋
โ ๊ธฐ์กด ๋ณต์ฌ
์ ๊ธฐ๋ฅ์ ๋ ๋ณด์ํ๊ธฐ ์ํด(์๋์ ์ธก๋ฉด, ๋ฉ๋ชจ๋ฆฌ์ ์์ค)
&
์ผ๊ฐ ์ฐธ์กฐ / &&
์ค๋ฅธ๊ฐ ์ฐธ์กฐ
์ค๋ฅธ๊ฐ ์์ฒด๋ ๋ด๋ถ์์ ์๋ฉธ๋ ๊ฐ
์ผ๋ก ์ธ์ํด ํผ์ํด๋ ๋ฌด๋ฐฉํ๋ค๋ ์ฅ์ (?)์ ๊ฐ์ง๊ณ ์์ด ์ด๋ฅผ ํ์ฉํ ๊ฐ๋
์ด๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฑฐ๊ฐ๋ค.
๋ฐ๋ผ์ ์ด๋ฏธ ์์ฑ๋ ํ ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ด๋
ํ๋ฉด ๊ธฐ์กด ์์ฑ๋ ๊ฐ์ฒด๋ ์ฌ์ฉ๋ถ๊ฐ (๋บ์ด์ค๋ ๊ฐ๋
) โ std::move()
-
forwarding reference ์ ๋ฌ ์ฐธ์กฐ
-
lambda ๋๋ค []() { }
:์ต๋ช ํจ์
, ๊ธฐ์กด ๊ตฌ์กฐ์ฒดsturct
์ ์ฐ์ฐ์์ค๋ฒ๋ก๋ฉoperator
๋ก์กฐ๊ฑด์
์ ๋ง๋ค๋ ๊ฒ์ ํ๋์ ํจ์ํํ์์ผ๋ก ๋์ฒดํด ๋ ๊น๋ํ๊ณ ํธํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅํ ๊ธฐ๋ฅโ ๊ฐ ๊ธฐ๋ฅ
โ [] capture :๊ฐ๋ณต์ฌ =
์ฐธ์กฐ &
๋ชจ๋๊ฐ ์กด์ฌ, ๊ตฌํ๋ถ ๋ด๋ถ์ธ์ ์ ์ธ๋ ๋ณ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ(๊ทธ ๋ณ์๋ฅผ ๋ณต์ฌํด์ ๊ฐ์ ธ์ฌ๊ฒ์ด๋, ์ฐธ์กฐ(์ฃผ์)๋ก ๊ฐ์ ธ์ฌ๊ฒ์ด๋)
โ () : ํํ์์์ ์ฌ์ฉํ ์ธ์๋ฅผ ๋ฐ๋ ๋ถ๋ถ
โ { } : ๊ตฌํ๋ถ
โ ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ์์์ ๋ฐํํ์ ์ถ๋ก ํด ๋ฑ์ด์ค๋ค (๋ฐ๋ก ์ง์ ์ง์ ๋ ๊ฐ๋ฅ)โ
Closure
: ๋ด๋ถํจ์๊ฐ ์ธ๋ถํจ์์ ๊ฒ์ ์ ๊ทผํ ์ ์๋ ๊ฒ, ๋๋ค์ ์ํด ๋ง๋ค์ด์ง ์คํ์์ (๋ฐํ์) ๊ฐ์ฒด
- ์ธ๋ถํจ์์ ๊ฒ์๊ฐ
์ฐธ์กฐ
๋ก ๊ฐ์ ธ์์ ๋ง๋ค์ด์ง ๊ฐ์ฒด
- ํด๋์ค์ ์ธ์คํด์ค(๊ฐ์ฒด)์์ ๊ด๊ณ์ ๋น์ทํ ๊ฐ๋ โ ๋๋ค(ํํ์)์ ์ธ๋ถ์ ๊ฒ์ ์ํด ๋ง๋ค์ด์ง ๊ฐ์ฒด~~(์ ํํ์ง๋ ์์ ์ดํด์ผ์๋,,,)~~ -
smart pointer
: ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋reference count
๋ฅผ ์ธ์ด์ ๊ฐ์ฒด ์๋ฉธ์ ๋ํ ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๋ง๋ ๊ธฐ๋ฅ(์ซ ๋ ๋๋ํ๊ฒ!), ์ฌ์ฉ์ด ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ (์๋ฌด๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ ๋)โ ์ํฌ์ธํฐ ๋์ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ์ด์ : ํฌ์ธํฐ๊ฐ ์ฌ์ฉ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง, ์์ ์ฑ ๋ณด์ฅ
1๏ธโฃ
shared_ptr
2๏ธโฃweak_ptr
์๋ก๊ฐ ์๋ก๋ฅผ ๊ฐ๋ฆฌํฌ ๋ ref count๊ฐ 0์ด๋์ง ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๊ธด ํฌ์ธํฐ 3๏ธโฃunique_ptr
ํด์ ์์ฒด๋ก ์์ ์ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ์ ์ผํ๊ฒ ๋จ ํ๋์ฌ์ผํ๋ ํฌ์ธํฐ(?)