ํฌ์ธํฐ
- ์ด๋ฏธ ์กด์ฌํ๋ ๋ค๋ฅธ ๋ณ์๋ฅผ ๊ฐ๋ฆฌํค๋(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๋ฅผ ํตํด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค
- ์์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๊ฐ ์ธ์๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ฝ์ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ ์ ์์
'C Programming Language > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C++ ํ์ ๊ณผ ์์์ ๋ํด ํ์ตํ๊ธฐ (2) (0) | 2024.08.25 |
---|---|
C++11 ํค์๋) nullptr(๋ํฌ์ธํฐ), auto(์คํ ), decltype(๋ํดํ์ ), lvalue(์ข์ธก๊ฐ)์ rvalue(์ฐ์ธก๊ฐ) (0) | 2024.08.14 |
C++ ์ง์ญ๋ณ์์ ์ ์ญ๋ณ์์ ๋ํด ํ์ตํ๊ธฐ (0) | 2024.08.14 |
C++ ํ ๋ณํ์ ๋ํด ํ์ตํ๊ธฐ (0) | 2024.08.14 |
C++ ํ์ ๊ณผ ์์์ ๋ํด ํ์ตํ๊ธฐ (1) (0) | 2024.08.14 |