본문 바로가기
C++

[C++] const 의 개념 그리고 포인터 에서의 const

by Warehaus 2022. 3. 27.

안녕하세요

warehouse입니다.

 

오늘은  const 의 개념에 대해 알아 봤습니다.

 

그동안 아무 생각없이 const 는 그저 상수의 개념 정로도 이해하고 사용했었는데요

조금은 더 알고 써야하지 않을까 라는 생각에 가볍게 리서치 한 내용을 남겨봅니다.

 

변경할 수 없는 변수,  상수 const

 

const 라는 예약어 이름 자체는 constant 라는 단어에서 왔으며 말 그대로 상수를 의미합니다.

 

constant

형용사
1.
a.불변의, 일정한(opp. variable)at constant temperature[speed] 일정한 온도[속도]로

b.끊임없이 계속하는, 지속적인, 부단한be in constant pain 통증이 계속되다

c.[문어] 충실한, 절개가 굳은(faithful), 견실한 ((in)); [P] 끝까지 지키는(true) ((to))He is constant in his love for her. 그녀에 대한 그의 사랑은 한결같다.

명사

1.일정불변의 것; [수학·물리] 상수, 불변수[량]; 율; [논리] 정항(定項); [교육] (중등 교육 과정의) 필수 기초 과목

출처 : 네이버 사전

 

그래서 보통은 아래처럼 상수를 표현할 때 많이 사용하곤 합니다.

const int a = 10;

a = 3; // Error

const 로 선언한 변수의 경우 read-only memory 에 저장되어 변경이 불가하게 됩니다.

 

저장되는 메모리 영역의 경우 컴파일러에 따라 조금 다를 수 있으며, data segment 또는 code segment에 저장된다고 이해하면 될 것 같습니다.

 

결국, 코드에서 한번 설정해서 계속 사용하고 싶은 값이 있는 경우 const로 선언하여 값을 할당하면 됩니다.

저 같은 경우 코드 수정 시 실수로 값이 변경되는 경우를 방지하기 위해서 사용하는 것 같습니다.

 

그런데 const를 사용해도 값을 변경할 수 있는 경우가 생길 수 있는데요, 그것은 pointer에 사용하는 경우입니다.

 

값의 변경을 허용하지 않는 포인터 변수

 

아래와 같이 const pointer를 정의하였을 때, pointer가 가리키는 값을 변경하지 않겠다는 것을 의미합니다.

변수가 가리키는 주소의 변경은 허용하되, 주소 가 가진 값에 대한 변경은 허용하지 않습니다.

 

#include <iostream>

using namespace std;

int main() {

    int val = 10;
    const int *a = &val;

    // 10
    cout << *a << endl;

    int new_val = 20;
    a = &new_val;

    // 20
    cout << *a << endl;

    //  error: read-only variable is not assignable
    //*a = 5;

    return 0;
}

에러가 나타나는 부분은 주석처리하여서 아래와 같은 결과를 얻을 수 있습니다.

$ ./a.out 
10
20

 

C++의   const 키워드를 이용하여 변수의 변경을 방지하는 방법을 알아 보았습니다.

사실 코드를 짜면서 실수를 하지 않는다면 const가 정말 필요할까? 라는 생각도 해 봅니다.

 

실수를 막고 runtime에 값이 변경되지 않기 위해서 만들어진  const

미리 알아두고 여러 상황에서 사용연습을 하다보면 읽고 쓰는데 점점 익숙해 질 것이라 생각합니다.

 

참고자료

 

https://www.quora.com/Where-is-a-C++-const-variable-stored-in-memory