게임 개발/C++

[C++] const 키워드

유행성바코드 2025. 3. 9. 22:22

목차

  • 01. Intro
  • 02. const
    • 정의 및 특징
    • 변수에서의 const
    • 함수에서의 const
    • 클래스에서의 const
  • 03. 마무리
  • 04. 연관 내용

01. Intro

오늘은 [const]에 대해 알아보겠습니다.

 


02. const

정의 및 특징

const는 constant의 약자입니다.

변수, 포인터, 멤버 함수, 매개 변수 등에 사용됩니다.

사용할 경우, 변수, 포인터 등에 [읽기 전용(Read-Only)] 속성을 부여합니다.

그래서, 수정할 수 없는 상태가 됩니다. 즉, 상수화가 진행됩니다.

 

변수에서의 cosnt

1. const 변수

#include <iostream>

using namespace std;

int main()
{
	const int num = 100;
	// num = 200;

	return 0;
}

타입 앞에 const 키워드를 붙이면, 해당 변수는 상수로 취급됩니다.

이를 코드 상에서 값을 변경하려고 시도하면, 컴파일 타임에서 오류가 발생하게 됩니다.

 

#include <iostream>

using namespace std;

const int SIZE = 200;

int main()
{
	const int num = 100;
	// num = 200;

	return 0;
}

위 방법처럼 const 변수를 전역 변수에 선언하고 변수명을 대문자로 지정하는 경우도 있습니다.

 

2. const 포인터 변수

  • 1) 포인터 변수 앞에 const가 위치
#include <iostream>

using namespace std;

int main()
{
	int num1 = 100;
	int num2 = 50;
	const int* ptr = &num1;

	// *ptr = 50;
	ptr = &num2;
	
	return 0;
}

포인터 변수 앞에 const가 위치하면, 포인터가 가지고 있는 주소값에 있는 메모리 값에 대해 변경할 수 없습니다.

그래서, 변경하려고 시도하면, 컴파일 타임에서 오류가 출력됩니다.

 

const int* ptr을 조금 더 자세히 살펴보겠습니다.

위 코드는 const 키워드의 뒤에 있는 int*에 대해서 상수화를 진행한다고 생각하면 됩니다.

int*에 있는 *(접근 연산자)로 인해, ptr 포인터 변수가 가지고 있는 주소값에 접근합니다.

그래서, const는 ptr 포인터 변수가 가지고 있는 주소값에 이동하고 해당 객체나 변수를 상수화합니다.

따라서, 값에 대해서 변경할 수 없습니다.

 

  • 2) 포인터 변수 뒤에 const가 위치
#include <iostream>

using namespace std;

int main()
{
	int num1 = 100;
	int num2 = 50;
	int* const ptr = &num1;

	*ptr = 50;
	// ptr = &num2;
	
	return 0;
}

포인터 변수 뒤에 const가 위치하면, 포인터가 가지고 있는 주소값에 대해 변경할 수 없습니다.

그래서, 변경하려고 시도하면, 컴파일 타임에서 오류가 출력됩니다.

 

int* const ptr을 조금 더 자세히 살펴보겠습니다.

위 코드는 const 키워드의 뒤에 있는 ptr에 대해서 상수화를 진행한다고 생각하면 됩니다.

즉, ptr의 주소값에 대해서 변경할 수 없습니다.

 

  • 3) 포인터 변수 앞뒤에 const가 위치
#include <iostream>

using namespace std;

int main()
{
	int num1 = 100;
	int num2 = 50;
	const int* const ptr = &num1;

	// *ptr = 50;
	// ptr = &num2;
	
	return 0;
}

변경 시도 시, 오류 출력

포인터 변수 앞뒤에 const가 위치하면, 포인터가 가지고 있는 주소값과 주소값의 값 모두 변경할 수 없습니다.

그래서, 변경하려고 시도하면, 컴파일 타임에서 오류가 출력됩니다.

 

함수에서의 const

1. const 기본 타입 매개 변수

#include <iostream>

using namespace std;

void print(const int num)
{
	// num = 10;
	cout << num << endl;
}

int main()
{
	int num1 = 100;
	int num2 = 50;
	
	print(num1);
	
	return 0;
}

함수에서 입력 매개 변수에 대해 const 키워드를 사용하면, 해당 함수에서 그 매개 변수에 대해 값을 변경할 수 없습니다.

void print(const int num);

그래서, 위 코드처럼 print 함수에서는 num 매개 변수에 대해 값을 변경할 수 없습니다.

 

위 함수가 동작할 때, num1의 값이 복사되어서 num 매개 변수에 대입됩니다.

그래서, 두 변수에 대한 메모리 주소가 다른 것을 확인할 수 있습니다.

 

2. const 참조 타입 매개 변수

#include <iostream>

using namespace std;

void print(const int& num)
{
	// num = 10;
	cout << num << endl;
}

int main()
{
	int num1 = 100;
	int num2 = 50;
	
	print(num1);
	
	return 0;
}

함수에서 입력 매개 변수에 대해 const 키워드를 사용하면, 해당 함수에서 그 변수에 대해 값을 변경할 수 없습니다.

그래서, 위 코드처럼 print 함수에서는 num 매개 변수에 대해 값을 변경할 수 없습니다.

 

const 기본 타입 매개 변수와 차이점은 아래와 같습니다.

위 함수가 동작할 때, num1의 자체가 num 매개 변수에 대입됩니다.

즉, num과 num1은 서로 같은 객체를 가지고 있습니다.

그래서, 두 변수에 대한 메모리 주소가 같은 것을 확인할 수 있습니다.

 

만약에 const 키워드가 없으면, print 함수에서 num 매개 변수의 값을 변경하면, main 함수에서도 num1에 대한 값도 변경됩니다.

 

 

3. 기본 타입의 const 반환

#include <iostream>

using namespace std;

const int ten()
{
	// num = 10;
	return 10;
}

int main()
{
	int num1 = ten();
	int num2 = 50;
	
	num1 = 20;
	cout << num1 << endl;
	
	return 0;
}

반환 타입 앞에 const를 붙였을 때의 경우입니다.

기본적으로 복사가 되기 때문에, const로 상수화를 만들어도 의미가 없습니다.

 

4. 참조 타입의 const 반환

#include <iostream>

using namespace std;

class Sport
{
public:
	Sport() : _num(0) {}
	~Sport() {}

public:
	int _num;
};

const Sport& getSport(const Sport& sport)
{
	return sport;
}

참조 타입 앞에 const를 붙이면, 반환값에 대해 const 참조를 유지합니다.

위 코드로 작성하면, 복사를 방지할 수 있습니다.

즉, 객체 자체가 전달된다고 생각하면 됩니다.

클래스에서의 const

1. const 멤버 함수

#include <iostream>

using namespace std;

class Sport
{
public:
	Sport() : _num(100) {}
	~Sport() {}

	// const 멤버 함수
	void print() const;

public:
	int _num;
};

void Sport::print() const
{
	cout << this->_num << endl;
}

int main()
{
	Sport sport;

	sport.print();
	
	return 0;
}

const 멤버 함수는 클래스에서만 선언할 수 있습니다.

이는 this 포인터가 const 멤버 함수에서 상수화가 되어 값을 변경할 수 없습니다.

즉, const 멤버 함수에서 this 포인터는 const Sport* this가 됩니다.

 

const 멤버 함수 내부에서는 값을 변경할 수 없다는 특징을 가지고 있습니다.

 

2. const 객체

#include <iostream>

using namespace std;

class Sport
{
public:
	Sport() : _num(100) {}
	~Sport() {}

	// const 멤버 함수
	void print() const;
	// 멤버 함수
	void change()
	{
		_num = 200;
	}

public:
	int _num;
};

void Sport::print() const
{
	cout << this->_num << endl;
}

int main()
{
	const Sport sport;

	sport.print();
	// sport.change();
	
	return 0;
}

객체를 const로 만들 수 있습니다.

const로 된 객체는 const 멤버 함수만 호출할 수 있습니다.

비-const 멤버 함수는 호출이 불가능합니다.

 


03. 마무리

오늘은 const 키워드를 통해 변수, 함수, 클래스 등에 다양하게 사용해 봤습니다.

다음 글은 다른 주제에 대해서 다뤄보도록 하겠습니다.


04. 연관 내용

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!

'게임 개발 > C++' 카테고리의 다른 글

[C++] 포인터 vs 참조  (0) 2025.03.11
[C++] mutable 키워드  (0) 2025.03.10
[C++] 캐스팅 - 5. reinterpret_cast  (0) 2025.03.08
[C++] 캐스팅 - 4. const_cast  (0) 2025.03.07
[C++] 캐스팅 - 3. dynamic_cast  (0) 2025.03.06