C Programming Language/C++

C++ ํฌ์ธํ„ฐ, ๋™์  ํ• ๋‹น, ์ฐธ์กฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ธฐ

567Rabbit 2024. 8. 14. 20:01

ํฌ์ธํ„ฐ

 

- ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”(point) ์—ญํ• ์„ ํ•˜๋Š” ๋ณ€์ˆ˜

- ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ’์œผ๋กœ์„œ ๊ฐ€์ง

 

 

 

 

- ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•จ

 

 

 

T ํƒ€์ž…์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ : T*

 

 

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ๊ฐ’์˜ ๋Œ€์ž…

 

 

*ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ : ์› ๋ณ€์ˆ˜ ๊ฐ’์˜ ์กฐํšŒ ๋ฐ ๋ณ€๊ฒฝ

 

 

 

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์ •์˜์™€ ์‚ฌ์šฉ ์˜ˆ 

 

 

 

 

 

C++์˜ ๋™์  ํ• ๋‹น : new์™€ delete

 

 

๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น : new

- T* = new T ;

- T* = new T[size] ;

 

 

๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ : delete

- delete p ;

- delete [] p ;

 

 

 

 

ํฌ์ธํ„ฐ ๊ด€๋ จ ์˜ค๋ฅ˜ ์ตœ์†Œํ™”ํ•˜๊ธฐ

 

: ์ผ๋ฐ˜์ ์œผ๋กœ ํฌ์ธํ„ฐ๋Š” ์ฃผ๋กœ ๋‘ ๊ฐ€์ง€ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค

 (1) ๊ฐœ์ฒด ์ฐธ์กฐ   - ๋ฌธ์ œ : ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ, double free

 (2) ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌ   -๋ฌธ์ œ : ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ

=> ํฌ์ธํ„ฐ๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€, ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Œ

 

 

<์˜ค๋ฅ˜ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•>

- ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(std::vector, std::string ๋“ฑ)๋‚˜ ๊ฒ€์ฆ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

- ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ํ•ด์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ (RAII ์›์น™) : RAII(Resource Acquisition Is Initialization) ์›์น™์€ ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ž์›์˜ ๊ด€๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํŒจํ„ด์œผ๋กœ, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์™€ ๊ฐ™์€ C++์˜ ์ž์› ๊ด€๋ฆฌ ๋„๊ตฌ๋Š” ์ด ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ž์›์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ๊ธฐํƒ€ ์ž์› ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

- ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ(Smart Pointer)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ : ์ฝ”๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ , ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

<ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ>

 

1. std::vector

๋™์  ๋ฐฐ์—ด์„ ์ œ๊ณตํ•˜๋ฉฐ, ์š”์†Œ์˜ ์ถ”๊ฐ€, ์‚ญ์ œ, ์ ‘๊ทผ ๋“ฑ์ด ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋™์  ๋ฐฐ์—ด์„ ์ง์ ‘ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

#include <vector>

void example() {
    std::vector<int> v;  // int ํƒ€์ž…์˜ ๋™์  ๋ฐฐ์—ด
    v.push_back(1);     // ๋ฐฐ์—ด์— ์š”์†Œ ์ถ”๊ฐ€
    v.push_back(2);
    // ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ž๋™ ์ฒ˜๋ฆฌ
}

 

2. std::string

๋™์  ๋ฌธ์ž์—ด์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ. ๋ฌธ์ž์—ด ์ž‘์—…์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <string>

void example() {
    std::string str = "Hello, World!";
    // ๋ฌธ์ž์—ด ์ž‘์—…
    std::cout << str << std::endl;
}

 

3. std::map, std::unordered_map

ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณต

std::map์€ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณต

std::unordered_map์€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณต

 

 

 

<์ฃผ์š” ๊ฒ€์ฆ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ>

 

Boost: ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ์Œ์œผ๋กœ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ, ์ •๊ทœ ํ‘œํ˜„์‹, ํŒŒ์ผ ์‹œ์Šคํ…œ ๋“ฑ์ด ํฌํ•จ

Eigen: C++๋กœ ์ž‘์„ฑ๋œ ๊ณ ์„ฑ๋Šฅ ์„ ํ˜• ๋Œ€์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ–‰๋ ฌ ์—ฐ์‚ฐ, ๋ฒกํ„ฐ ์—ฐ์‚ฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

spdlog: ๊ณ ์„ฑ๋Šฅ C++ ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ๋ ˆ๋ฒจ๊ณผ ํฌ๋งทํŒ… ์˜ต์…˜์„ ์ œ๊ณต

 

 

 

 

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์œ ํ˜• : unique_ptr, shared_ptr

 

- unique_ptr : ์ฐธ์กฐํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ  ์†Œ์œ ๊ถŒ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ํฌ์ธํ„ฐ ์‚ฌ์šฉ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด์ œ๋จ

  ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋ฉฐ, ๋‹ค๋ฅธ std::unique_ptr๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ด๋™(semove)ํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.

  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ณ , ์ด๋™๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์œ ๊ถŒ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋จ

  ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜์ง€ ์•Š์Œ(ํ• ๋‹น ๊ธˆ์ง€)

#include <memory>

void example() {
    std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
    // std::unique_ptr<int> ptr2 = ptr1;  // ์ปดํŒŒ์ผ ์˜ค๋ฅ˜: ๋ณต์‚ฌ ๋ถˆ๊ฐ€๋Šฅ
    std::unique_ptr<int> ptr2 = std::move(ptr1);  // ์ด๋™ ๊ฐ€๋Šฅ
}  // ptr2๊ฐ€ ํŒŒ๊ดด๋˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

 

 

- shared_ptr : ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ์ฆ‰์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•จ

  ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งˆ์ง€๋ง‰ std::shared_ptr๊ฐ€ ํŒŒ๊ดด๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋จ

  ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ๊ฐ์ฒด ๊ณต์œ ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค

  ์ž๋™์œผ๋กœ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•จ

  ๋™์ ์œผ๋กœ ํ• ๋‹นํ•จ

#include <memory>

void example() {
    std::shared_ptr<int> ptr1 = std::make_shared<int>(20);
    std::shared_ptr<int> ptr2 = ptr1;  // ptr1๊ณผ ptr2๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ 
}  // ptr1๊ณผ ptr2๊ฐ€ ํŒŒ๊ดด๋˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

 

 

  • std::unique_ptr์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ:
    • ๋‹จ์ผ ์†Œ์œ ๊ถŒ์ด ํ•„์š”ํ•˜๊ณ , ์†Œ์œ ๊ถŒ์ด ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ
    • ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ ์นด์šดํŠธ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ
  • std::shared_ptr์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ:
    • ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ์ž์›์„ ๊ณต์œ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    • ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ์†Œ์œ ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

 

 

 

 

์ด๋™ ์‹œ๋ฉ˜ํ‹ฑ์Šค(Move Semantics)

์ด๋™ ์‹œ๋ฉ˜ํ‹ฑ์Šค๋Š” C++11์—์„œ ๋„์ž…๋œ ๊ฐœ๋…์œผ๋กœ, ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋™ ์‹œ๋ฉ˜ํ‹ฑ์Šค๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ์ž์›์„ "์ด๋™"ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. ์ด๋Š” ํŠนํžˆ ์ž์›์ด ๋™์  ํ• ๋‹น๋œ ๊ฒฝ์šฐ ์œ ์šฉ

 

 

std::unique_ptr์—์„œ์˜ ์ด๋™

- ์ด๋™ ์ƒ์„ฑ์ž: ๊ธฐ์กด std::unique_ptr ๊ฐ์ฒด์—์„œ ์ƒˆ std::unique_ptr ๊ฐ์ฒด๋กœ ์†Œ์œ ๊ถŒ์„ ์ด๋™ํ•  ๋•Œ ์‚ฌ์šฉ

- ์ด๋™ ๋Œ€์ž… ์—ฐ์‚ฐ์ž: ๊ธฐ์กด std::unique_ptr ๊ฐ์ฒด์— ๋‹ค๋ฅธ std::unique_ptr ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ์ด๋™ํ•  ๋•Œ ์‚ฌ์šฉ

#include <iostream>
#include <memory>

class Example {
public:
    Example() { std::cout << "Constructor\n"; }
    ~Example() { std::cout << "Destructor\n"; }
    Example(const Example&) = delete;              // ๋ณต์‚ฌ ์ƒ์„ฑ์ž ์‚ญ์ œ
    Example& operator=(const Example&) = delete;   // ๋ณต์‚ฌ ๋Œ€์ž… ์—ฐ์‚ฐ์ž ์‚ญ์ œ
    Example(Example&&) noexcept { std::cout << "Move Constructor\n"; } // ์ด๋™ ์ƒ์„ฑ์ž
    Example& operator=(Example&&) noexcept {       // ์ด๋™ ๋Œ€์ž… ์—ฐ์‚ฐ์ž
        std::cout << "Move Assignment\n";
        return *this;
    }
};

void example() {
    std::unique_ptr<Example> p1 = std::make_unique<Example>();  // ์ƒ์„ฑ ๋ฐ ์†Œ์œ ๊ถŒ ํš๋“
    std::unique_ptr<Example> p2 = std::move(p1);                // p1์˜ ์†Œ์œ ๊ถŒ์„ p2๋กœ ์ด๋™

    if (!p1) {
        std::cout << "p1 is now empty\n";
    }
    if (p2) {
        std::cout << "p2 owns the Example object\n";
    }
}

int main() {
    example();
    return 0;
}


std::unique_ptr p2 = std::move(p1);

- std::move๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ p1์˜ ์†Œ์œ ๊ถŒ์„ p2๋กœ ์ด๋™. ์ด๋™ ํ›„ p1์€ nullptr์ด ๋œ๋‹ค.

 

 

std::shared_ptr์˜ ์ด๋™

- ์ด๋™ ์ƒ์„ฑ์ž: std::shared_ptr์˜ ์ด๋™ ์ƒ์„ฑ์ž๋Š” ์†Œ์œ ๊ถŒ์„ ์ƒˆ std::shared_ptr๋กœ ์ด์ „ํ•˜๋ฉฐ, ์›๋ž˜ ํฌ์ธํ„ฐ๋Š” ๋น„์›Œ์ง„๋‹ค

์ด๋™ ๋Œ€์ž… ์—ฐ์‚ฐ์ž: std::shared_ptr์˜ ์ด๋™ ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ์†Œ์œ ๊ถŒ์„ ๊ธฐ์กด์˜ std::shared_ptr์— ์ด์ „ํ•˜๋ฉฐ, ์ด๋™๋œ std::shared_ptr์€ ๋น„์›Œ์ง„๋‹ค.

#include <iostream>
#include <memory>

void example() {
    // ์†Œ์œ ๊ถŒ์ด sp1์— ์žˆ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ
    std::shared_ptr<int> sp1 = std::make_shared<int>(100);
    
    // sp1์˜ ์†Œ์œ ๊ถŒ์„ sp2๋กœ ์ด๋™
    std::shared_ptr<int> sp2 = std::move(sp1);

    if (!sp1) {
        std::cout << "sp1 is now empty\n";  // sp1์€ ์ด๋™ ํ›„ ๋น„์–ด ์žˆ์Œ
    }
    if (sp2) {
        std::cout << "sp2 owns the object with value: " << *sp2 << std::endl;
    }
}

int main() {
    example();
    return 0;
}

 

 

- std::make_shared(100)์œผ๋กœ ์ƒ์„ฑ๋œ std::shared_ptr sp1์€ 100์ด๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง„ int ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•จ

- std::move(sp1)์„ ํ†ตํ•ด sp1์˜ ์†Œ์œ ๊ถŒ์ด sp2๋กœ ์ด๋™. ์ด๋™ ํ›„ sp1์€ nullptr ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ, sp2๊ฐ€ ๊ฐ์ฒด๋ฅผ ์†Œ์œ ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

์ฃผ์˜์  : ํฌ์ธํ„ฐ๋Š” ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์ง€ ๋ง์ž !

C++์—์„œ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ์ธํ„ฐ๋Š” null์ผ ์ˆ˜ ์žˆ๊ณ , ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ์ด์ค‘ ํ•ด์ œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ์›ฌ๋งŒํ•˜๋ฉด ํฌ์ธํ„ฐ ๋Œ€์‹  ์ฐธ์กฐ๋‚˜ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฌธ์ œ ๋ฐœ์ƒ!

#include <iostream>

// ํฌ์ธํ„ฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜
void process(int* ptr) {
    if (ptr) {  // ํฌ์ธํ„ฐ๊ฐ€ null์ด ์•„๋‹Œ์ง€ ์ฒดํฌ
        *ptr += 10;  // ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์˜ ๊ฐ’์„ 10 ์ฆ๊ฐ€
    } else {
        std::cout << "Received null pointer.\n";  // ํฌ์ธํ„ฐ๊ฐ€ null์ธ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ!!!!
    }
}

int main() {
    int value = 5;  // ์ •์ˆ˜ ๋ณ€์ˆ˜ value๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”
    process(&value);  // value์˜ ์ฃผ์†Œ๋ฅผ ํฌ์ธํ„ฐ๋กœ ๋„˜๊น€
    std::cout << "Value after process: " << value << std::endl;  // ๋ณ€๊ฒฝ๋œ value ์ถœ๋ ฅ
    return 0;
}

 

 

์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

- ํฌ์ธํ„ฐ ๋Œ€์‹  ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, null ๊ฐ’ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>

void process(int& value) {
    value += 10;
}

int main() {
    int value = 5;
    process(value);
    std::cout << "Value after process: " << value << std::endl;
    return 0;
}

 

 

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ

#include <iostream>
#include <memory>

void process(std::shared_ptr<int> value) {
    if (value) {
        *value += 10;
    } else {
        std::cout << "Received null shared_ptr.\n";
    }
}

int main() {
    auto value = std::make_shared<int>(5);
    process(value);
    std::cout << "Value after process: " << *value << std::endl;
    return 0;
}

 

 

 

 

 

ํฌ์ธํ„ฐ์™€ ์ƒ์ˆ˜

 

: ์œ ์—ฐํ•˜๊ณ  ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

 

  • ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: ๋™์  ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉ
  • ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค: ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘: ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์œ ์šฉ

 

๊ทธ๋Ÿฌ๋‚˜ ํฌ์ธํ„ฐ๋Š” +, ++, -- ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•จ

 

 

 


ex)

 

 

 

์ƒ์ˆ˜ํฌ์ธํ„ฐ

 

- ์ƒ์ˆ˜ ํฌ์ธํ„ฐ๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์ˆ˜๋กœ ์ทจ๊ธ‰๋˜์–ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ํฌ์ธํ„ฐ

const int* ptr;

 

 

- ์ด ๊ฐœ๋…์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ , ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.

 

 

ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋Š” ํฌ์ธํ„ฐ

 

์ƒ์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์˜ ํ™œ์šฉ ์˜ˆ

 

 

 

 

์ƒ์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ

 

- ์ƒ์ˆ˜ ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ํฌ์ธํ„ฐ์˜ ๊ฐ’(์ฃผ์†Œ)์€ ์ดˆ๊ธฐํ™” ์‹œ ์„ค์ •๋œ ํ›„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

- ํฌ์ธํ„ฐ ์ž์ฒด๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์ง€๋งŒ, ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

int* const ptr;

 

 

 

 

์ƒ์ˆ˜์— ๋Œ€ํ•œ ์ƒ์ˆ˜ ํฌ์ธํ„ฐ

 

- ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ์™€ ํฌ์ธํ„ฐ ์ž์ฒด ๋ชจ๋‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

- ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ณ , ํฌ์ธํ„ฐ ์ž์ฒด๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค

const int* const ptr;

 

 

 

 

 

์ฐธ์กฐ(reference) ๋ณ€์ˆ˜

 

: ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ์˜ ์•ˆ์ „์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ ์ž ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋จ

  ์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ํŠน์ • ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ„์นญ์œผ๋กœ ๋ณ€์ˆ˜์˜ ์›๋ณธ ๊ฐ’์„ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค (๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์—ญํ• )

  ์ฐธ์กฐ๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ฐธ์กฐ๊ฐ€ ์„ค์ •๋œ ํ›„์—๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

 

 

 

 

  • ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ: ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ , ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ
  • ์•ˆ์ „์„ฑ: ์ฐธ์กฐ๋Š” null์ด ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ๋” ์•ˆ์ „ํ•˜๊ณ  ๋ช…ํ™•
  • ๊ฐ€๋…์„ฑ: ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ๋” ๋ช…ํ™•
  • ๊ฐ„๊ฒฐํ•จ: ์ฐธ์กฐ๋Š” ํฌ์ธํ„ฐ๋ณด๋‹ค ๋ฌธ๋ฒ•์ด ๊ฐ„๋‹จํ•˜๊ณ , null ์ฒดํฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ์—ฐ์‚ฐ์ด ํ•„์š”์—†

 

 

์ฐธ์กฐ ๋ณ€์ˆ˜ T&

: Tํƒ€์ž… ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ

- ๋ณ€์ˆ˜ T์— ๋Œ€ํ•œ ๋ณ„์นญ์œผ๋กœ, ๋ณ€์ˆ˜์˜ ์›๋ณธ ๊ฐ’์„ ์ง์ ‘ ์ฐธ์กฐํ•œ๋‹ค.

- ์ฐธ์กฐ๋Š” ์„ ์–ธ ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋ฉฐ, ์ดํ›„์—๋Š” ์ฐธ์กฐ ๋Œ€์ƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

 

 

์ƒ์ˆ˜ ํฌ์ธํ„ฐ๋ณด๋‹ค ๋” ์ž˜ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜ ์ฐธ์กฐ !

 

์ƒ์ˆ˜ ์ฐธ์กฐ๋Š” ์ฐธ์กฐ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ์ฐธ์กฐ์ด๋‹ค. ํ•จ์ˆ˜ ์ธ์ž๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉ

#include <iostream>

// ์ƒ์ˆ˜ ์ฐธ์กฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ฐ’์„ ์ฝ๊ธฐ๋งŒ ํ•˜๋Š” ํ•จ์ˆ˜
void printValue(const int& ref) {
    std::cout << "Value: " << ref << std::endl;
    // ref = 10; // ์˜ค๋ฅ˜: ์ƒ์ˆ˜ ์ฐธ์กฐ๋กœ ์ธํ•ด ๊ฐ’ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
}

int main() {
    int value = 5;
    printValue(value);  // ์ƒ์ˆ˜ ์ฐธ์กฐ๋กœ value๋ฅผ ์ „๋‹ฌ
    return 0;
}

 

์ƒ์ˆ˜ ์ฐธ์กฐ const T&: ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜์—ฌ, ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉ

  • void printValue(const int& ref)๋Š” ์ƒ์ˆ˜ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ref๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์„ ์ฝ๊ธฐ๋งŒ ํ•จ ref๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค
  • ์ƒ์ˆ˜ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Œ