C++ 코딩을 하다보면 안전성을 위해 쓰이는 코드가 있다.
값이 바뀌지 않으며 고정되는 상수로 만드는 키워드, 바로 const다
const는 보통 변수 이름 앞에 쓰여 해당 변수의 값을 바꿀 수 없게 만들어준다.
const float FRAME_RATE = 60f;
단순하게 쓰면 저정도이지만, const는 함수와 포인터 등 다양한 곳에 쓰일 수 있다.
오늘은 const와 C++11부터 도입된 constexpr에 대해 자세히 알아보자.
1. 함수의 반환 타입 앞에 붙는 const
const [type] Function()
가장 기본적인 형태로, 함수의 반환값(Return Value)을 상수로 만들겠다는 의미다.
const int GetSomeValue() {
return 10;
}
// 사실 기본 자료형(int, float 등)에 return const를 붙이는 것은 큰 의미가 없다.
// 하지만 Class 객체를 반환할 때 '수정 불가능한 상태'로 전달하고 싶을 때 유용하다.
2. 함수 선언 뒤에 붙는 const
[type] Function() const
이러한 형태의 const는 클래스의 멤버 함수에서만 사용할 수 있다.
이 함수의 의미는 이 함수 안에서는 멤버 변수의 값을 절대 바꾸지 않겠다는 뜻이다.
- 상수 멤버 함수라고도 한다.
- 함수 내부에서 멤버 변수를 수정하려고 하면 컴파일 에러가 발생한다.
- const로 선언된 객체는 오직 const가 붙은 멤버 함수만 호출할 수 있다
class Player {
private:
int health = 100;
public:
int GetHealth() const {
// health = 150; // 컴파일 에러!
return health;
}
void TakeDamage(int damage) {
health -= damage; // 가능
}
};
3. 포인터와 함께 쓰이는 const
const가 포인터(*)의 왼쪽에 있느냐, 오른쪽에 있느냐에 따라 보호하는 대상이 달라진다.
- const int* ptr (또는 int const* ptr): 포인터가 가리키는 값을 상수로 만든다 (값 변경 불가)
- int* const ptr: 포인터 자체(주소값)를 상수로 만든다 (다른 주소 가리키기 불가)
- const int* const ptr: 값과 주소 둘 다 상수로 만든다
int a = 10, b = 20;
const int* ptr1 = &a;
// *ptr1 = 20; (X) 값 변경 불가
ptr1 = &b; (O) 다른 주소 가리키기 가능
int* const ptr2 = &a;
*ptr2 = 20; (O) 값 변경 가능
// ptr2 = &b; (X) 다른 주소 가리키기 불가
4. 매개변수에서의 const (참조와 함께)
객체를 함수에 전달할 때, 복사 비용을 줄이면서도 값의 안전성을 보장하기 위해 주로 사용한다
// 1. 값 복사
void PrintName(std::string name);
// 2. 참조 전달
void PrintName(std::string& name);
// 3. const 참조 전달
void PrintName(const std::string& name) {
// name = "New Name"; // 에러 발생!
std::cout << name << std::endl;
}
5. const vs constexpr
constexpr은 C++11에서 도입되었다. 둘 다 상수를 뜻하지만 결정적인 차이점은 "언제 값이 결정되는가"이다.
const (Runtime Constant)
- 실행 중에 값이 결정될 수 있다
- 예: 함수의 인자로 들어온 값을 const 변수에 담는 경우
constexpr (Compile-time Constant)
- 컴파일 타임에 반드시 값이 결정되어야 한다.
- 컴파일러가 컴파일 중에 미리 계산을 끝내버리기 때문에 런타임 성능이 최적화된다
- 템플릿 인자나 배열 크기 선언처럼 "반드시 컴파일 타임에 값을 알아야 하는 곳"에 쓰인다.
int size;
std::cin >> size;
const int c_size = size; // 가능
// constexpr int e_size = size; // 에러 (컴파일 타임에 size를 알 수 없음)
constexpr int MAX_LEVEL = 100; // 가능 (컴파일 타임에 100으로 고정)
이 외에도 const에 대한 많은 내용이 있으므로 공부할 때마다 추가될 예정이다.
'언어 > C,C++' 카테고리의 다른 글
| [C++] 컴파일 상수 constexpr (1) | 2024.08.10 |
|---|---|
| [Win32] Visual Studio Win32 LNK2019 오류 해결 (0) | 2023.12.28 |
| C language Chapter 7. 배열 (0) | 2022.10.09 |
| C Language Chapter 6. 반복문 (0) | 2020.08.03 |
| C language Chapter 5. C언어의 조건문(+switch문) (0) | 2020.04.17 |