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 |
내부 상태 변경 불가 함수 |