티스토리 뷰
기습 문제!
10 = 11; 이 가능할까? 맞추고 틀리고 할것도 없다. 그냥 불가능한 식이다.
이런 10과 11 등 상수를 r-value 라고 부르고 int a=0; 같이 변할수 있는 변수 a를 l-value 라고 부른다.
여기서 왜 r/l - value를 언급할까?
오늘 복습할 const와 레퍼런스가 이에 해당하기 때문이다.
먼저 const는 무었일까. const는 상수화를 시켜주는 장치이다.
const int a =0;
이런 식으로 사용한다. 이렇게 상수화를 시켜주면 a의 값은 상수화, 즉 고정이 되어 수정이 불가능하다.
(이것도 뭐 주소로 접근해서 요리조리 뭔갈 하면 수정가능하다..
int* pInt = nullptr;
pInt = (int*)&a;
*pInt = 300;
을 이용해서 pInt에 a의 주소를 받아와서 pInt에서 수정하면 수정 가능..
)
이런 const는 포인터에도 적용 가능하여 const 포인터, 포인터 const로 나눌 수 있다.
1. const 포인터 : 원본 수정 불가
const 포인터는
const int* pConstInt = &a; 로 표기한다. 이름의 순서대로 표기한다.
여기는 어떤 값이 고정될까. 수정 할 수 있는 값은 두개이다. 변수에 저장된 주소 변경과 a 주소에 저장된 값 변경이 있다.
const는 보통 바로 뒤에있는 수식에 적용이된다. 포인터가 상수화 된는 것이므로 *pConstInt = 100; 으로 수정이 불가능하다 ㅠㅠ 간단히 외우려면 const가 포인터를 가리키니 포인터가 붙은 변수는 수정 불가능하다고 외우자.
따라서 const 포인터는 원본 수정 불가가 된다.
2. 포인터 const : 원본 수정 가능
int* const pIntConst = &a;
으로 작성한다.
따라서
*pIntConst =400; 는 가능하고
pIntConst = &b; 는 불가능하다
이것도 const가 변수를 가리키니 포인터가 없는 변수는 수정 불가능하다고 외우면 된다.
pIntConst = &a 가 한몸이 된다.
처음엔 이거 머리깨게 헷갈렸다. 프로그래머들은 이걸 딱 보고 아! 뭐군 이런단 말이야? (맞을듯..)
지금은 처음에 비해서 구분 잘 하지만 그래도 바로바로 와닿지 않았다. 이렇게 공부 시작한지 얼마 지나지 않아 고비가 되나 하면서 const를 달달 외웠는데 ㅋㅋ ㅋㅋ ㅋ ㅋ
레퍼런스 만나고 나의 성공시대 시작됐다 ^^
레퍼런스는 ㅋㅋ 두번째. 그러니까 포인터 const와 동일하다.
레퍼런스는 원본을 직접적으로 참조하게 한다. 포인터 const는 원본의 값을 수정할 수 없다. 그런데 위에서 본 것 처럼 참조 변수를 사용하여 직접적으로 원본을 수정할 수 있게 하는것이다!
예시를 들자면
int a =10;
int* p = &a; int& iRef = a;
*p = 100; iRef = 100;
이 동일하다!
차이가 뭔데요.. 라고 말 할 수 있다. 물론 컴파일러 입장에서도 두 행동이 완전하게 동일하다. 하지만 사용자에게는 다르게 느껴진다.
(물론 두 가지를 완전하게 동일하게 하려면 레퍼런스는 포인터 const이므로 int* const p = &a; 가 되어야 함.)
위에서 포인터 const는 원본수정 가능이라고 했었고 윗줄의 코드에서 iRef는 a와 완전히 동일시 된다. 따라서 a의 값을 직접적으로 수정 가능하게 만들어 준다. iRef와 a를 한몸으로 만들어 주는 것이다.
이를 원본을 참조 한다고 한다. (레퍼런스의 중요한 특징)
포인터 const = 레퍼런스를 쓰는 이유가 무었일까?
가장 큰 장점은 변수가 다른 주소를 가리키는 실수가 일어나지 않는다. 그 안에 있는 값은 바뀌어도 말이다. 이는 중요한 특징이니 알고있도록 하자.
레퍼런스의 3가지 특징을 말하고 이번 포스팅을 마무리한다.
1. 포인터와 유사하다 (포인터 const)
2. 원본을 참조한다.
3. 참조 변수를 통해 직접적으로 원본을 수정할 수 있다.
체감상 포인터 const보다 &를 많이 쓴다.
이 포스팅은 유투브 어소트락 게임 아카데미의 강의를 듣고 난 뒤 개인적으로 정리한 글 입니다.
https://www.youtube.com/c/AssortRockGameAcademy
어소트락 게임아카데미
DirectX11/12 자체엔진 게임제작, 언리얼 엔진 4 진정한 게임프로그래머가 되고 싶다면 어소트락 게임아카데미 24시간 자습실, 24시간 1:1 코칭 시스템 ASSORTROCK.COM
www.youtube.com
↑어소트락 게임 아카데미 유투브 링크.
'공부 > C++' 카테고리의 다른 글
[C++] 메모리 풀 1 (0) | 2023.03.30 |
---|---|
동적 라이브러리 (0) | 2022.03.27 |
C++ 복습) 상속 (0) | 2021.11.24 |
C++ 복습) 포인터 (0) | 2021.11.23 |
C++ 복습) 변수 (0) | 2021.11.23 |
- Total
- Today
- Yesterday
- 고득점 Kit
- 누적합
- 탐욕법
- Unreal 5.1
- 완전탐색
- sort
- 힙
- Ue
- DFS
- Heap
- C++
- IMGUI
- 정렬
- FPS
- BFS
- UE5
- 해시
- 고득점kit
- 개인공부
- 채팅서버
- 재귀
- 너비우선탐색
- 프로그래머스
- LV3
- 데디케이티드
- LV2
- 디자인 패턴
- 스택/큐
- greedy
- level3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |