2024년 12월 31일 화요일(2024년의 마지막 날...)
아닛 벌써 한 것도 없는데 2025년이라니..?
이번 년도는 퇴사도 하고.. 백수 생활도 하고.. 여러 경험을 해봤다..
하지만 아직 실력은 늘지 않은 것 같다고!!
언어는 다 거기서 거기라고 생각했지만 막상 C++ 기초부터 깊게 제대로 공부하니까 미치겠다고!!!!!
어찌되었든 오늘은 C++에서 가장 중요하고! 가장 많이 쓰이고! 그냥 숨쉬듯이 써야하는!
제일 중요한 포인터를 공부해봤다. (사실 숨쉬듯이 써먹어야한다는 조언을 듣고.. 얘부터 확실하게 이해해야 다음 챕터 공부를 수월하게 진행할 수 있을 것 같아서 오늘도 약간 진도가 밀렸다..ㅎ)
그럼 바로 포인터를 알아보자!
포인터
사용하는 이유 : 메모리에 직접적으로 관리
int a = 10;
int* ptr_a = &a;
cout << a << endl;
cout << &a << endl;
cout << ptr_a << endl;
cout << *ptr_a << endl;
// output
// 10
// a가 저장되어있는 메모리 주소값
// a가 저장되어있는 메모리 주소값
// 10
- 참조(&-앤퍼센트) : 변수의 메모리 주소 가져옴
- &a → a의 주소
- 역참조(*) : 포인터가 가리키는 주소에 저장된 값을 가져옴
- *a → a의 값
Dangling Pointer
- 이미 해지된 메모리를 참고하고 있는 포인터
Unique Pointer
- 레퍼런스 카운터가 최대 1개인 스마트 포인터
- 소유권을 넘겨주는 것은 가능하지만, 동시에 2개 이상 소유 못함
- 복사 또는 대입이 안됨(이렇게 하면 컴파일 에러 발생)
// unique pointer 생성할 때
#include <memory> // unique_ptr 사용
unique_ptr<int> ptr1 = make_unique<int>(10);
unique_ptr과 make_unique는 서로 짝
// 컴파일 에러 발생하는 상황
#include <memory> // unique_ptr 사용
unique_ptr<int> ptr1 = make_unique<int>(10);
unique_ptr<int> ptr2 = ptr1; // 여기서 이미 ptr이 메모리 참조값을 가지고 있음(최대 1개 만족)
// 가능한 상황
#include <memory> // unique_ptr 사용
using
unique_ptr<int> ptr1 = make_unique<int>(10);
unique_ptr<int> ptr2 = move(ptr1); // ptr의 소유권을 ptr2로 이동
// ptr은 이제 비어있게됨
if (!ptr1)
cout << "ptr1은 비어있음" << endl;
포인터도 원시 포인터가 있고 스마트 포인터가 있었다..
뭔가 알듯말듯 이해한 것 같은데 막상 문제 풀면 틀리고..
머리로 이해하고 손으로 먼저 확실하게 이해한 다음에 코드로 만져봐야겠다.
'C++' 카테고리의 다른 글
[C++] Text RPG 몬스터 생성 로직 설계 (1) | 2025.01.13 |
---|---|
[C++] 컴파일러와 인터프리터? (1) | 2025.01.03 |
[C++] Template, STL (0) | 2025.01.02 |
[C++] 생성자와 소멸자 (0) | 2024.12.30 |
[C++] floating point exception (core dumped)에 대해 알아보자 (1) | 2024.12.27 |