[C/C++] Const

할랑말랑·2026년 3월 5일

C/C++

목록 보기
2/45

Const

C/C++에서 const는 "변하지 않는 값"을 정의하는 키워드입니다. 데이터를 실수로 변경하는 것을 방지하여 프로그램의 안정성을 높이고, 컴파일러가 코드를 최적화하는 데 도움을 줍니다

1. 기본변수

변수를 선언할 때 앞에 붙이면, 그값은 초기화 이후에 수정할 수 없는 상수가 된다.

const int MAX_VAL = 100;
// MAX_VAL = 200 // 컴파일 에러

2. 포인터와 Const

  • const int* ptr (데이터 상수화) : 포인터가 가리키는 값을 바꿀 수 없다. 주소는 이동은 가능
  • int* const ptr (포인터 상수화) : 포인터가 가리키는 주소를 바꿀수 없다. 가리키는 값은 바꿀수 있다.
  • const int* const ptr (둘다 상수화) : 주소와 값 모두 바꿀수없다.
#include <iostream>

using namespace std;

int main()
{
    int a = 10, a1 = 15;
    const int* ptr1 = &a;
    // *ptr1 = 15; // 값 변경 불가
    ptr1 = &a1; // 가리키는 대상 변경 가능

    int b = 20, b1 = 25;
    int* const ptr2 = &b;
    *ptr2 = 25; // 값 변경 가능
    //ptr2 = &b1; // 가리키는 대상 변경 불가

    int c = 30, c1 = 35;
    const int* const ptr3 = &c;
    //*ptr3 = 35; // 값 변경 불가
    //ptr3 = &c1; // 가리키는 대상 변경 불가

    return 0;
}

3. 멤버 함수에서의 Const

C++에서 함수가 객체의 상태를 변경하지 않음을 보장하는 데 사용됩니다.
객체 지향 프로그래밍(OOP)에서 메서드의 const 수정자는 여러 가지 중요한 이유로 중요합니다:

class Example 
{
private:
    int value;

public:
    Example(int v) : value(v) {}

    // 비 const 메서드
    int getValue() {
        return value; // 상태를 변경하지 않음
    }
};
  • 이 경우 getValue()는 단순히 value를 반환하고, 상태를 변경하지 않습니다.하지만 const가 없기 때문에, 호출자는 이 메서드가 상태를 변경하지 않는다는 것을 보장받을 수 없습니다.
class Example 
{
private:
    int value;
    int accessCount; // 접근 횟수를 추적

public:
    Example(int v) : value(v), accessCount(0) {}

    // 비 const 메서드 - 실제로 상태를 변경함
    int getValue() {
        accessCount++; // 상태 변경! 접근 횟수 증가
        return value;
    }

    int getAccessCount() const {
        return accessCount;
    }
};
  • 이 경우 getValue()는 value를 반환하지만, 동시에 accessCount를 증가시켜 객체의 상태를 변경합니다.호출자는 단순히 값을 가져오는 것처럼 보이지만, 실제로는 객체의 상태가 변경되고 있습니다.

4. 개선

class Example 
{
private:
    int value;

public:
    Example(int v) : value(v) {}

    // const 메서드 - 상태 변경 불가능
    int getValue() const {
        // accessCount++; // 컴파일 에러! const 메서드에서는 상태 변경 불가
        return value;
    }
};
  • const 메서드를 사용하면 컴파일러가 상태 변경을 막아주므로, 호출자는 이 메서드가 절대로 상태를 변경하지 않는다는 것을 보장받을 수 있습니다.

5. 결론

  • 비const 메서드 : 상태를 변경할 수도 있고, 안 할 수도 있습니다. 호출자는 확신할 수 없습니다.
  • const 메서드 : 상태를 절대 변경하지 않습니다. 호출자는 안심하고 사용할 수 있습니다.

0개의 댓글