
1. 기본 개념
C++ 에서 const 는 값을 고정할 때 사용됩니다.
const int x = 10;
여기서 x 는 고정이므로 x 는 10 이 아닌 다른 값을 가질 수 없습니다.
x = 11;
이것은 컴파일 오류를 일으키고, 대부분 여기까지는 자연스럽게 받아들입니다.
2. const 의 진짜 의미
C++ 에서 const 는 일반적으로 바로 다음에 오는 대상을 고정시킨다는 의미로 해석해야 합니다.
그리고 이 사실을 깨닫는 것은 굉장히 중요합니다.
2-1. 기본 타입에서의 const
먼저 가장 단순한 경우부터 보겠습니다.
int const x = 10;
이 코드는 말 그대로 x 라는 값 자체를 고정시킵니다.
이후에는 어떤 경우에도 x 에 다른 값을 대입할 수 없습니다.
보통은 앞에서 보신 것 처럼, 아래와 같은 형태를 더 많이 사용합니다.
const int x = 10;
두 표현은 의미도 동일하고, 컴파일 결과도 동일합니다.
다만 const 는 다음에 오는 것을 고정한다라는 관점에서 보면, int const x 쪽이 문법적으로 더 솔직한 표현이라고 볼 수도 있습니다.
2-2. 포인터에서의 const
const 는 포인터와 함께 쓰일 때 헤깔립니다만, const 바로 다음에 오는 대상을 고정한다라는 사실을 기억하고 살펴보겠습니다.
const char* p;
char* const p;
이 둘은 전혀 다른 의미를 가집니다.
const char* p 의 의미
여기서 const 바로 다음에 오는 것은 char 입니다.
즉, 고정되는 대상은 char 입니다.
이 말은 곧, p가 가리키는 문자 내용은 변경할 수 없다는 뜻입니다.
p = "hello"; // 가능
p[0] = 't'; // 컴파일 에러
포인터 p 자체는 고정이 아닙니다.
다른 문자열을 가리키는 것은 가능합니다.
다만, p를 통해 접근한 문자 하나하나는 읽기 전용으로 취급됩니다.
char* const p 의 의미
이번에는 const 바로 다음에 오는 것이 p입니다.
즉, 포인터 자체가 고정됩니다.
이 말은 곧, p가 다른 곳을 가리키는 것이 불가능하다는 뜻입니다.
// 컴파일 에러
p = "hello";
// 대신, 포인터가 가리키는 내용은 수정할 수 있습니다.
p[0] = 'w';
p[1] = 'o';
• const char* p 는 내용 고정, 포인터 자유
• char* const p 는 포인터 고정, 내용 자유
2-3. 객체 앞에 오는 const
다음으로 자주 보게 되는 형태가 이것입니다.
void MyFunction( const MyClass& obj )
void SetName( const std::string& name )
이것은 객체 앞에 붙어서 그 객체를 고정시킨다는 의미입니다.
참조로 넘긴 것은 함수 인자로 전달될 때 불필요한 복사 비용을 줄이기 위함이며, 참조는 다른 객체를 다시 가리킬 수는 없지만 참조 대상 객체의 수정은 가능합니다.
여기에 const 를 붙였다는 것은, 이 함수 안에서는 참조 대상 객체를 수정하지 않겠다는 의미가 됩니다.
즉, this 를 const 로 취급하여 읽기 전용으로 사용하겠다는 의미입니다.
2-4. 함수 뒤에 오는 const
이제까지는 const 다음에 오는 대상을 고정시킨다는 의미로 설명드렸는데, 이번에는 멤버 함수 뒤에 붙는 const 입니다.
int GetValue() const;
이 형태는 멤버 함수에서만 의미가 있습니다.
의미는 다음과 같습니다.
이 함수 안에서는 this 객체를 const로 취급하여 멤버 변수를 수정 불가 상태로 만든다는 의미입니다.
class A
{
int x;
int Get() const
{
return x; // 가능
}
void Set(int v) const
{
x = v; // 불가능. 컴파일 오류
}
};
함수 뒤에 오는 const 는 일반 함수에는 붙일 수 없습니다.
일반 함수에는 this 포인터와 멤버 변수가 존재하지 않기 때문입니다.
또 다른 예로는 static 멤버 함수에도 붙일 수 없습니다.
static 멤버 함수에는 this 포인터가 존재하지 않기 때문입니다.
3. 정리
• const 는 바로 다음에 오는 대상을 고정합니다.
• 기본 타입에서는 값 자체를 고정합니다.
• 포인터에서는 내용을 고정할지, 포인터를 고정할지에 따라 const 의 위치가 달라집니다.
• 함수 인자 앞에서 쓰일 때는 객체를 읽기 전용으로 만듭니다.
• 멤버 함수 뒤에서는 this 객체를 수정하지 않겠다는 의미입니다.
• 따라서 객체가 없는 일반 함수나 static 멤버 함수에서는 사용할 수 없습니다.
'C++' 카테고리의 다른 글
| 전방 선언 (0) | 2026.01.05 |
|---|---|
| TCHAR 에 대한 이해 (0) | 2026.01.04 |
| 헤더(.h)와 소스(.cpp)를 분리하는 이유 (0) | 2025.12.27 |
| 프로그래밍 언어란 무엇인가? (0) | 2025.12.21 |
| C++ 소개 (0) | 2025.12.11 |