본문 바로가기
C++

const 는 어디에 위치하느냐에 따라 의미가 달라집니다

by Oz Driver 2026. 1. 2.

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