likepint 2025. 4. 17. 14:32


Const (Constant, 변하지 않는 상수)

컴파일 단계에서 값을 더 이상 변경할 수 없도록 보호하는 키워드

 

변수 앞에 사용하는 방법

const int x = 10;
x = 20; // ❌ 오류! const 변수는 값을 바꿀 수 없음
읽기는 가능하지만, 쓰기는 불가능

 

🚨 포인터와 const의 조합
const 키워드가 붙는 위치에 따라 의미가 다르므로, 포인터와 const의 조합이 정말 중요함

 

const int* ptr 또는 int const* ptr

포인터가 가리키는 값을 변경하지 못하도록 설정
const int* ptr = &x;
// int const* ptr = &x;
// 또는 int const* ptr = &x; 도 동일
*ptr = 5;     // ❌ 안 됨! 값 변경 금지
ptr = &other; // ✅ 포인터는 이동 가능
  • 읽기 전용 포인터
  • 값은 바꾸지 못하지만, 다른 걸 가리키도록 설정 가능

int* const ptr

포인터가 가리키는 주소를 바꾸지 못하도록 설정
int* const ptr = &x;
*ptr = 5;     // ✅ 가능
ptr = &other; // ❌ 안 됨! 주소 못 바꿈
  • 고정된 주소를 가리키는 포인터
  • 가리키는 대상은 바꿔도 되지만, 어디를 가리키는지는 변경 불가능

const int* const ptr

포인터가 가리키는 값, 포인터가 가리키는 주소 전부 변경하지 못하도록 설정
const int* const ptr = &x;
*ptr = 5;     // ❌ 값 못 바꿈
ptr = &other; // ❌ 포인터도 못 바꿈
  • 완전히 상수화된 포인터

const 파라미터 전달

📌 값 타입에서의 const

void Print(const int value);
  • 함수 내부에서 value 값을 변경 불가능하도록 설정
📌 참조 타입에서의 const

void Print(const string& str);
  • 복사 없이 전달하면서 내용도 보호 (객체 전달 시 성능 + 안정성 증가)

 

클래스 멤버 함수에서의 const

class MyClass
{
public:
    int GetValue() const;
    
};
  • 해당 함수는 멤버 변수 수정 불가 (읽기 전용 함수임을 컴파일러에게 명시)
  • 내부에서 value++ 같은 코드 사용 시 컴파일 오류 발생

 

배열 선언 시 const

const int size = 5;
int arr[size];
  • 배열 크기를 상수로 정의할 때 사용 (const 덕분에 컴파일 단계에서 크기 설정 가능)

 

const vs constexpr

키워드 설명
const 컴파일 or 런타임에 상수 여부 판단
constexpr 컴파일 타임 상수로 고정 (C++11~)
예시 constexpr int x = 5; // 반드시 컴파일 타임 결정

 

const 최종 정리 요약

선언 예시 의미
const int a a는 수정 불가
const int* p *p 값 수정 불가, p는 변경 가능
int* const p p는 변경 불가, *p는 수정 가능
const int* const p p, *p 둘 다 변경 불가
void func(const T&) 읽기 전용 참조 전달
int Get() const 내부 상태 변경 불가 함수