Skip to content

szun8/CPP_Study

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

78 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“š C++ Study

by Inflearn ๐ŸŒต

๋ชฉ์ฐจ


๐Ÿ“ ๊ฐ์ฒด์ง€ํ–ฅ

  • 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 ์ •์ ๋ฐ”์ธ๋”ฉ ์ปดํŒŒ์ผ์‹œ์ ์— ์–ด๋Š ๊ฒƒ์„ ๋ถˆ๋Ÿฌ์˜ฌ์ง€ ๊ฒฐ์ •

๐Ÿ“ Sequence Container

// vector iterator ๋น„๊ต๋Š” `==` ์—ฐ์‚ฐ์ž๋ฐ–์— ์ง€์› ์•ˆํ•จ! (์ผ๋‹จ ์ •๋ฆฌํ•˜๊ธฐ์ „์— ๊นŒ๋จน์„๊นŒ๋ด ๋ฉ”๋ชจํ•ด๋‘ ,,,)

๐Ÿ“ ์—ฐ๊ด€ Container

: ๊ด€๊ณ„์žˆ๋Š” ๊ฐ’์œผ๋กœ key ์™€ value ๋ฅผ ๋ฌถ์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” container

  • ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ณ ์žํ•  ๋•Œ ์œ ์šฉ(์•„๋ž˜์˜ ๋‹จ์  ๋ณด์™„)
  • ๊ธฐ์กด vector list ๋“ฑ์€ ์„ ํ˜•์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด ๊ณ ๋์Œ.
  • ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ์„ ํ•˜๋Š” ์‹œํ€€์Šคcontainer์™€ ๋‹ค๋ฅด๊ฒŒ ํŠน์ • ๊ทœ์น™์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ์ข…๋ฅ˜ : map multimap set multiset

๐Ÿ—บ Map

: 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๋‚˜ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉ

๐Ÿ”‘ 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

๐Ÿ”— Set

: map ๊ณผ ๋‹ฌ๋ฆฌ key ๊ฐ’ ํ•˜๋‚˜๋งŒ ๋ฐ์ดํ„ฐ์— ์ €์žฅํ•˜๋Š” container

  • ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ์„ ์ €์žฅํ•œ๋‹ค๋Š” ํŠน์ง• ์ด์™ธ์—๋Š” map ๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌ
  • ๋‹จ, [index] ์‚ฌ์šฉ์€ ๋ถˆ๊ฐ€

๐Ÿ”‘ multiset : set ์—์„œ ์ค‘๋ณต key ํ—ˆ์šฉ

๐Ÿ“ Modern C++

  • 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 ํ•ด์„ ์ž์ฒด๋กœ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ์œ ์ผํ•˜๊ฒŒ ๋‹จ ํ•˜๋‚˜์—ฌ์•ผํ•˜๋Š” ํฌ์ธํ„ฐ(?)


๋ณด๊ณ  ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ ์ด์ƒํ•œ ๋ถ€๋ถ„์€ comment ๋‚จ๊ฒจ์ฃผ์„ธ์š” ๐Ÿ˜‚