[C++] const 정리 (+constexpr이란?)

2026. 2. 4. 23:03·언어/C,C++

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가 포인터(*)의 왼쪽에 있느냐, 오른쪽에 있느냐에 따라 보호하는 대상이 달라진다.

  1. const int* ptr (또는 int const* ptr): 포인터가 가리키는 값을 상수로 만든다 (값 변경 불가)
  2. int* const ptr: 포인터 자체(주소값)를 상수로 만든다 (다른 주소 가리키기 불가)
  3. 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
'언어/C,C++' 카테고리의 다른 글
  • [C++] 컴파일 상수 constexpr
  • [Win32] Visual Studio Win32 LNK2019 오류 해결
  • C language Chapter 7. 배열
  • C Language Chapter 6. 반복문
깜냥c
깜냥c
게임 개발/클라이언트/AI/PS/기타 연구
  • 깜냥c
    Choice Program
    깜냥c
  • 전체
    오늘
    어제
    • 분류 전체보기 (62) N
      • 언어 (12)
        • C,C++ (10)
        • C# (1)
        • Python (1)
      • PS (20)
        • 백준 문제 (19)
        • 알고리즘 (1)
      • 인공지능 (2)
      • 게임제작 (7)
      • 게임개발 (18) N
        • Unity (9)
        • Unreal Engine (7) N
        • Godot Engine (1)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 블로그 소개
  • 링크

    • 김병장의 IT 블로그
    • 식품영양과 데이터사이언스
  • 공지사항

  • 인기 글

  • 태그

    Unreal
    UE5
    unity
    백준
    배낭 문제
    BOJ
    입출력
    Godot
    C++
    C언어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
깜냥c
[C++] const 정리 (+constexpr이란?)
상단으로

티스토리툴바