본문 바로가기
C++/기초

C++ 기초 : const 포인터 예시

글: 시플마 2024. 3. 31.

const 포인터는 어떤 상황에서 사용할까요?

 

 

아래 상황을 봅시다.

 

main 함수에서 '다른 함수'를 호출하였습니다.

 

근데 다른 함수가 main 함수의 지역 변수 a를

매개변수로 받는 함수입니다.

 

그럼 다른 함수가 만들어지면서 main 함수의 지역 변수 a를

복사해서 다른 함수의 지역 변수에 넣을 것입니다.

 

그리고 다른 함수의 동작이 모두 끝나면 소멸하겠죠.

 

 

근데 만약에 변수 a의 크기가 엄청 크다고 가정해 봅시다.

심지어 다른 함수는 자주 호출되는 함수라고 가정해 보죠.

 

그러면 아주 큰 용량의 변수 a가 자주 복사되고 

소멸하는 것을 반복하겠죠? 프로그램의 성능이 많이 떨어질 것입니다.

 

 

성능을 위해서

매번 함수를 호출할 때마다 복사하지 말고

 

포인터를 사용하여 직접 접근하면 불필요한 동작이 생략되겠죠?

 

 

문제가 하나 더 있습니다.

 

만약 '다른 함수'가 맵에 내 위치를 표시해주는 함수이며

변수 a는 내 위치가 담긴 변수라고 생각해 봅시다.

 

다른 함수를 통해 맵에 내 위치를 표시하려면, 

내 위치를 알아야 하기 때문에 변수 a에 접근했습니다.

접근만 해야 하는데 위치를 수정해버립니다.

 

내가 어디에 있는지 확인하기 위해 맵을 열었는데

나의 위치가 바뀌는 상황이 발생하는 거죠.

 

 

이를 방지하기 위해 

 

const 키워드를 사용하는 겁니다.

 

5번째 줄을 보면

Map 함수를 통해 main 함수의 지역 변수 a에

접근하는 것은 가능합니다.

 

그러나 그 밑에 a의 값을 수정하려고 하면 오류가 발생하죠.

a의 값을 참조만 할 수 있게 막아준 것입니다.

 

 

포인터를 이용해 성능을 최대한 살리면서 값에 접근할 수 있게 하였고

const를 붙여 값이 수정되지 않도록 방지해주었습니다.

(물론 64Bit 환경에서 포인터 변수의 크기는 8Byte이므로

Map 함수의 매개변수를 4Byte인 int형으로 하는 게 더 이득입니다.

여기서는 예시를 위한 것이니 넘어가도록 하죠.)

 

 


 

 

 

const 키워드를 붙였다고 해서 방심해서는 안됩니다.

 

Map 함수를 사용하려고 보니

변수 a의 주소를 줘야 한다고 요청합니다. 

 

Map 함수의 매개변수가 어떤지 확인하니 (단축키 : Ctrl + Shift + Space)

const가 붙어 있네요. 사용자는 생각합니다.

"const가 붙었으니, 주소를 줘도 a의 값은 바뀌지 않겠네."

 

 

그러나

 

사용하고 보니 a의 값이 9999로 바뀌었습니다.

 

Map 함수에서 const int형 포인터 변수인 a가 갖고 있는 주솟값을

int형 포인터 변수인 pInt에  강제로 변환하여 저장하고 

pInt를 통해 값을 수정한 것입니다.

 

 

Map 함수를 만든 사람이 자신이라면

해당 함수가 호출되는 곳에서 F12를 눌러

Map 함수의 내용을 볼 수 있습니다.

 

하지만 Map 함수가 다른 사람의 라이브러리를 통해서

사용하는 것이라면 내용을 직접 확인할 수 없습니다.

 

 

이처럼 const가 붙었다고 해서 값이

절대 수정될 수 없는 것은 아니므로 주의가 필요합니다.

 

 

 

 

강의 출처 : https://www.youtube.com/watch?v=PFc4g8mxOiI&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&pp=iAQB

 


 

'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 문자  (0) 2024.04.01
C++ 기초 : void  (0) 2024.03.31
C++ 기초 : const 포인터  (0) 2024.03.31
C++ 기초 : const  (0) 2024.03.30
C++ 기초 : 포인터 문제 풀이와 해답  (0) 2024.03.30