Skip to content

Latest commit

ย 

History

History
268 lines (203 loc) ยท 10.6 KB

moderncpp.md

File metadata and controls

268 lines (203 loc) ยท 10.6 KB

Modern C++

์ž‘์„ฑ์ž : ๋ฐ•์žฌ์šฉ

๋ณธ ์ž๋ฃŒ๋Š” ์ž‘์„ฑ์ž์ธ '๋ฐ•์žฌ์šฉ'์˜ ๊ฐœ์ธ Repository์˜ ๊ธ€๊ณผ Effective Modern C++ ์ฑ…์„ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Table of Contents

Modern C++์ด๋ž€?

C++98(C++03) ๋ฒ„์ „ ์ดํ›„ ์ตœ์‹  ์œ ํ–‰์— ๋งž๊ฒŒ ์ƒˆ๋กœ์šด C++ ํ‘œ์ค€ ๋ฌธ์„œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๊ณ  ๊ตฌ ๋ฒ„์ „์˜ C++98 ๊ธฐ๋Šฅ๋ณด๋‹ค ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ€๋…์„ฑ, ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ•จ๋„ ์žฅ์ ์œผ๋กœ ๋– ์˜ค๋ฅด๋Š” ์ƒˆ๋กœ์šด C++ ๊ธฐ๋Šฅ ์ง‘ํ•ฉ ํ‘œ์ค€ํ™”์ด๋‹ค.

Auto

Auto๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ํŠน์ • ์ž๋ฃŒํ˜•์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. auto๋Š” ์ฝ”๋“œ๊ฐ€ ์งง์•„์ง€๊ณ  ๊ฐ€๋…์„ฑ์—์„œ ํฐ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ค‘์š”ํ•œ ์  : ์ „์—ญ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•จ

auto a = 100;
auto b = 100l;
auto c; // ERROR

vector<int> v;
auto be = v.begin(); // ์ด์ฒ˜๋Ÿผ iteratorํ˜•์„ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค

Iterator์™€ Auto๋ฅผ ๊ฒฐํ•ฉํ•˜๊ธฐ

๋ฐ˜๋ณต๋ฌธ์—์„œ STL์˜ iterator๋ฅผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. auto ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ์ด ์–ผ๋งˆ๋‚˜ ๊ฐ„๊ฒฐํ•ด์ง€๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

for(vector<int>::iterator i = v.begin(); i != v.end(); ++i){
    // sth;
}

for(auto i = v.begin(); i != v.end(); ++i){
    // sth;
}

for(auto& i : v){
    // sth;
}

์œ„์˜ ์„ธ for๋ฌธ์˜ ๋™์ž‘์€ ๊ฐ™๊ณ , ์ฝ”๋“œ์˜ ๊ธธ์ด๊ฐ€ ํ™•์—ฐํ•˜๊ฒŒ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ฐ˜๋ณต๋ฌธ์˜ v๋Š” ๋ฐฐ์—ด์ด๋‚˜ vector๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ธก๋ฉด์—์„œ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ›„ํ–‰ ๋ฐ˜ํ™˜ ํ˜•์‹

ํ›„ํ–‰ ๋ฐ˜ํ™˜ ํ˜•์‹์ด๋ž€ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํ˜•์‹์„ ๊ธฐ์กด์˜ ๋ฆฌํ„ดํƒ€์ž…์˜ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก ๋‹ค์Œ์— '->'์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ฐ˜ํ™˜๊ฐ’์„ auto๋กœ ์ง€์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” C++11์—์„œ๋Š” ํ›„ํ–‰ ๋ฐ˜ํ™˜ ํ˜•์‹์ด ํ•„์ˆ˜์˜€์ง€๋งŒ, C++14๋ถ€ํ„ฐ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ถ”๋ก ํ•ด ์ค€๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๋ฐ”์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ ํ˜•์‹์ด ๊ฒฐ์ •๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค.

auto function(int a, int b) -> decltype(a+b){
    return a+b;
}

Smart Pointer

์ผ๋ฐ˜ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ์ƒ๊ฒผ์ง€๋งŒ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ž€ ๋ฌด์—‡์ผ๊นŒ? ์ผ๋ฐ˜ ํฌ์ธํ„ฐ๋ณด๋‹ค ๋˜‘๋˜‘ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ์— ๊ด€๋ จ๋˜์–ด ์žˆ๋‹ค. ๋ฒ„๊ทธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ Smartํ•œ ๊ฒƒ์ด๋‹ค. ๊ธฐ์กด C++์—์„œ๋Š” ๋™์ ์œผ๋กœ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜๋“œ์‹œ delete๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ํ•„์ˆ˜์ž„์— ๋”ฐ๋ผ Modern C++์—์„œ๋Š” Memory Leak, Segmentation fault๋กœ๋ถ€ํ„ฐ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•˜์—ฌ Modern C++์—์„œ๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ฐ€์žฅ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ์‹œ๋กœ๋Š” auto_ptr์ด ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์˜ˆ์‹œ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ ์†Œ๋ฉธ๋™์ž‘ ๋ฐฉ์‹์—์„œ ๊ฐ์ฒด์— ๋Œ€ํ•œ delete๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ฐ์ฒด์˜ ํ•ด์ œ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ์น˜๋ช…์ ์ธ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด C++17๋ถ€ํ„ฐ ์ œ๊ฑฐ ๋˜์—ˆ๋‹ค. ์ด ๋ฌธ์ œ์ ์— ์˜ํ•ด unique_ptr์™€ shared_ptr์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

// ๊ธฐ์กด C/C++ pointer
Widget *getWidget();

void work()
{
    Widget *wptr = getWidget();
    // ์—ฌ๊ธฐ์„œ Exception ๋ฐœ์ƒ ํ˜น์€ Returnํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ, *wptr ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋Š” ์–ด์ฉŒ์ฃ ?
    delete wptr; // ์ง์ ‘ ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•จ.

}
// ๋ชจ๋˜ C++์˜ unique_ptr(์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์ผ์ข…)
unique_ptr<Widget> getWidget();
void work()
{
    unique_ptr<Widget> upw = getWidget();
    // Exception์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— Return ํ•˜๋”๋ผ๋„ ๋ณ„๋„๋กœ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!
}   // ๋ฉ”๋ชจ๋ฆฌ๋„ ์•Œ์•„์„œ ์ž๋™์œผ๋กœ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ref) https://www.hanbit.co.kr/media/channel/view.html?cms_code=CMS8140000918

lambda

๋žŒ๋‹คํ‘œํ˜„์‹(lambda expression)์€ ์ด๋ฆ„ ์—†๋Š” ํ•จ์ˆ˜๋กœ๋„ ๋ถˆ๋ฆฌ๋Š”๋ฐ python, C#, js๋“ฑ์—์„œ ์ด๋ฏธ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๊ธฐ๋Šฅ๋“ค์ด๋‹ค. ์ œ์ผ ํฐ ์žฅ์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜์˜ ์ธ๋ผ์ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์— ์žˆ๋‹ค.

๋žŒ๋‹คํ‘œํ˜„์‹์ด๋ž€ ์–ด๋–ค๊ฒƒ์ธ์ง€ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•ด๋ณด์ž. (in Effective Modern C++ Book)

std::find_if(container.begin(), container.end(),
            [](int val) { return 0 < val && val < 10; });

๋ฌธ๋ฒ•

[captures](parameters) -> return type { body }

/*
* captures: comma(,)๋กœ ๊ตฌ๋ถ„๋œ ์บก์ฒ˜๋“ค์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์บก์ณ ๋ถ€๊ฐ€ ์„ค๋ช…์„ ์•„๋ž˜์— ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
* [] : ์•„๋ฌด ์™ธ๋ถ€๋ณ€์ˆ˜๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
* [=] : ๋ชจ๋“  ์™ธ๋ถ€๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์•„์„œ ์บก์ณํ•œ๋‹ค. value ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ์™ธ๋ถ€๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พธ์ง€๋Š” ๋ชปํ•จ.
* [&] : ๋ชจ๋“  ์™ธ๋ถ€๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋ฐ›์•„์„œ ์บก์ณํ•œ๋‹ค. value๋„ ์‚ฌ์šฉํ•˜๊ณ , ์™ธ๋ถ€๋ณ€์ˆ˜์˜ ๊ฐ’๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. 
* [A] : ์™ธ๋ถ€๋ณ€์ˆ˜ A๋ฅผ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋ฐ›์•„์„œ ์บก์ณํ•œ๋‹ค. ๋‹จ A์˜ value๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.
* [&A] : ์™ธ๋ถ€๋ณ€์ˆ˜ A๋ฅผ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋ฐ›์•„์„œ ์บก์ณํ•œ๋‹ค. value๋„ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ’๋„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
* parameters: ํ•จ์ˆ˜์˜ ์ธ์ž๋“ค์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
* return type: ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ํ˜•์ž…๋‹ˆ๋‹ค.
* body: ํ•จ์ˆ˜์˜ ๋ชธํ†ต์ž…๋‹ˆ๋‹ค.
*/

๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์˜ˆ์‹œ

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

int main(){
    auto a = 5;
    [&](){a = 3;cout<<a<<endl;}();
}

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ 1

int main(){
    auto a = 5;
    auto func = [&](){a = 3;cout<<a<<endl;};
    func();
}

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ 2

int main(){
    auto a = 5;
    function<void()> func = [&](){a = 3;cout<<a<<endl;};
    func();
}

๋žŒ๋‹ค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

auto a = 5;
auto getLambda() {//C++14
    return [&]() {a = 3;cout<<a<<endl;};
}
int main(){
    auto func = getLambda();
    func();
}

์žฌ๊ท€ํ•จ์ˆ˜๋กœ ์“ฐ์ด๋Š” ๋žŒ๋‹ค

int main(){
    function<int (int)> func = [&func] (int num) -> int
    {
        if(num <= 1)return 1;
        else return num*func(num-1);
    }; 
    auto a = func(5);
    cout<<a<<endl;
}

Move Semantics

์ด๋™ ์‹œ๋งจํ‹ฑ์ด๋ž€ C++11์—์„œ ์ถ”๊ฐ€๋œ ๋ฌธ๋ฒ•์œผ๋กœ Move Semantics์ด ๋“ฑ์žฅํ•œ ์ด์œ ์ด๊ธฐ๋„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด C++ ๋ณต์‚ฌ๊ฐ€ ๊ฐ€์ง„ C++ Copy Semantics์˜ ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž. C++์—์„œ๋Š” ์–ด๋Š ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณต์‚ฌํ•˜๋Š” ์ผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ตฌ๋™ ๋ฐฉ์‹์€

  1. ์‚ฌ์ง„ ๋ณต์‚ฌ๋ฅผ ์œ„ํ•˜์—ฌ PC์— ํด๋”๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ 
  2. SD ์นด๋“œ์—์„œ ์‚ฌ์ง„๋“ค์„ ์„ ํƒํ•ด ์ปดํ“จํ„ฐ๋กœ ๋ณต์‚ฌํ•˜๊ณ 
  3. ๋ณต์‚ฌ๊ฐ€ ๋๋‚˜๋ฉด ์›๋ณธ ์‚ฌ์ง„์„ ์‚ญ์ œํ•˜๊ณ 
  4. ์‚ญ์ œ๊ฐ€ ๋๋‚˜๋ฉด ์ด ๋ณต์‚ฌํ•œ ์‚ฌ์ง„๋“ค์„ ๊ฐ€์ง€๊ณ  ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ์‹ ์œ„์ฒ˜๋Ÿผ ์ •๋ง ํšจ์œจ์ด ๋–จ์–ด์กŒ๋‹ค. ์ด๋Ÿฌํ•œ Copy ๋น„ํšจ์œจ์„ ์—†์• ๊ธฐ ์œ„ํ•˜์—ฌ Modern C++์—์„œ๋Š” Move Semantics์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ ์šฉ์‹œ์ผฐ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์†Œ์œ ๊ถŒ ์ด์ „์œผ๋กœ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํฐ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

Move Semantic์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์— L-value์™€ R-value์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

L-value

L value๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ๋ณ€์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

  • ์ด๋ฆ„์ด ์žˆ๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ex) int a; foo();
  • ์„ ํ–‰ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž ex) ++a;, --b;
  • L-value ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ์ ‘๊ทผ ex) a[n];

Pure rvalue

prvalue๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ ‘๊ทผ์€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•œ ํ‘œํ˜„์‹์„ ๋งํ•œ๋‹ค.

  • ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’ (string์€ ์ œ์™ธ)
  • ํ›„ํ–‰ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž ex) a++, b--
  • ๊ฐ’ ๋ฆฌํ„ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ex) return str1+str2;

X-value

xvalue๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ์ด๋™ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • rvalue ์ฐธ์กฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜ ex) std::move(x)
  • rvalue ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ์ ‘๊ทผ ex) r[n]

R-value

Pure rvalue์™€ X-value๋ฅผ ๋ฌถ์–ด์„œ R-value๋ผ๊ณ  ๋งํ•œ๋‹ค.

int tmain(int argc, _TCHAR* argv[])
{
    int num1 = 5, num2 = 3;
    
    num1 = 10;                  // num1์€ lvalue, 10์€ intํ˜• prvalue
    num1 = num2;                // num1์€ lvalue, num2์€ lvalue
    int num3 = num1 + num2;     // num3์€ lvalue, num1 + num2์€ prvalue
    
    std::move(num3);            // rvalue ์ฐธ์กฐ๋ฅผ ๋ฆฌํ„ด xvalue
    static_cast<DWORD>(num1)    // ๊ฐ’์œผ๋กœ ์บ์ŠคํŒ… lvalue
    static_cast<DWORD&&>(num1)  // rvalue ์ฐธ์กฐ๋กœ ์บ์ŠคํŒ… xvalue
}

Move Semantics์˜ ์˜ˆ์‹œ

str1์™€ str2๋ฅผ swapํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น  ๋•Œ ์šฐ๋ฆฌ๋Š” ์ž„์‹œ ๋ณ€์ˆ˜(string tmp)๋ฅผ ๋งŒ๋“ค์–ด ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ’์„ ๊ต์ฒดํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์™”๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ณผ์ •์—์„œ ๋ณต์‚ฌ๊ฐ€ ์„ธ๋ฒˆ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ตณ์ด ๋ฌธ์ž์—ด ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•  ํ•„์š” ์—†์ด string_content์˜ ์ฃผ์†Œ๊ฐ’๋งŒ ์„œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๋Š”๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค. ์ขŒ์ธก๊ฐ’์ด ์šฐ์ธก๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์—†์„๊นŒ? std::move๋ฅผ ์‚ฌ์šฉํ•˜์ž!

Move Semantics

#include <cstring>
#include <algorithm>

class string
{
    char* data;

public:

    string(const char* p)
    {
        size_t size = std::strlen(p) + 1;
        data = new char[size];
        std::memcpy(data, p, size);
    }

Move Semantics์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” microsoft ๊ณต์‹ ๋ฌธ์„œ, stackoverflow์„ ์ฐธ์กฐํ•˜๋ฉด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

Array

Modern C++์—์„œ๋Š” C/C++์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์ด์˜€๋˜ ๋ฐฐ์—ด์„ STL๋กœ ์ง€์›ํ•ด์ค€๋‹ค. ๊ธฐ์กด STL์„ ์‚ฌ์šฉํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” Vector์„ ๋งŽ์ด ์‚ฌ์šฉํ•ด์™”๊ณ  ์‚ฌ์‹ค Vector๋Š” ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ์— ๋“œ๋Š” ๋น„์šฉ์ด ๊ฝค ํฌ๊ณ , ํ•œ ๋ฒกํ„ฐ์˜ ๊ฐ์ฒด๋Š” 4byte๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น„ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

nullptr

C++11๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ํ‚ค์›Œ๋“œ๋กœ ๋„ํฌ์ธํ„ฐ๋ฅผ ๋œปํ•œ๋‹ค. nullptr์€ ํฌ์ธํ„ฐ๋งŒ์„ ์œ„ํ•œ NULL์ƒ์ˆ˜์ด๋‹ค. Modern C++์ด์ „๊นŒ์ง€๋Š” ๋„ํฌ์ธํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์ƒ์ˆ˜ '0'์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ํ•จ์ˆ˜ ์ธ์ž๋กœ ๋„˜๊ธฐ๊ฒŒ ๋˜์—ˆ์„ ๋•Œ ์ •์ˆ˜ํ˜•์œผ๋กœ ์ถ”๋ก ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ nullptr์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

๋‹ค์–‘ํ•œ Library

Thread Library

๊ธฐ์กด C/C++์—์„œ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Window๋Š” Win32 API, ๋ฆฌ๋ˆ…์Šค๋Š” pthread๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ๋งŒ ํ–ˆ๋‹ค. Modern C++์—์„œ๋Š” ์Šค๋ ˆ๋“œ์— ๊ด€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ‘œ์ค€์œผ๋กœ ํฌํ•จ๋˜์–ด ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ์— ๋งค์šฐ ํŽธ๋ฆฌํ•ด์กŒ๋‹ค.

Regex Library

์ •๊ทœ์‹์€ Modern C++์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์—ˆ๋‹ค. std::regex ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.