const와 static

김펭귄·2025년 5월 2일

C++

목록 보기
2/20

1. const

  • 변수, 객체, 함수, 포인터 등에 붙여서 값이 변경되지 않음을 보장하는 키워드.
  • 특징
    • 선언과 동시에 반드시 초기화해야 하며, 이후 값 변경 불가.
    • 컴파일러가 "읽기 전용"으로 취급하여 실수로 값을 바꾸는 것을 막아줌.
    • 멤버 변수, 함수 매개변수, 반환값, 포인터, 참조자 등 다양한 곳에 사용.
const int a = 10;         // a는 절대 값이 변하지 않음
void foo(const int x);    // x는 함수에서 변경 불가
const int* p;             // *p 값 변경 불가, p는 변경 가능
int* const p;             // p는 변경 불가, *p 값 변경 가능
const int& ref = a;       // ref를 통해 a 변경 불가

1-1. 멤버 함수에서의 const (상수 함수)

  • (기존의 함수 정의) const; 형식으로 선언
class A {
	int c;
	
public:
	int get_c() const;  // 선언
};
int A::get_c() const {return c;}  // 정의
  • 멤버 변수의 값을 바꾸지 않는 함수라고 명시

  • 함수 내에서는 객체들의 '읽기' 만이 수행 (쓰기 하려하면 컴파일 에러)

  • 함수 내에서 호출 할 수 있는 함수도 다른 상수 함수만 가능

  • const 객체로 매개변수를 받았을 시, 이 객체는 이 상수함수만 사용이 가능함.
    그래서 사용하는 것

class Vector2D 
{
    double x, y;
public:
    // 1. 일반 함수: 내부 멤버를 바꿀 가능성이 있다고 간주됨
    void setX(double newX) { x = newX; }

    // 2. const 함수: "멤버 변수를 절대 건드리지 않음"을 선언함
    void print() const 
    { 
        std::cout << x << ", " << y << std::endl; 
    }
};

void func(const Vector2D& v) 	// const 객체로 받았으니 상수함수만 사용 가능
{
    v.print(); // OK! (v를 수정하지 않는 상수 함수이므로)
    v.setX(10.0); // Error! (수정하려 함)
}

2. static

  • 수명(라이프타임)과 접근 범위(스코프) 또는 공유성을 지정하는 키워드

  • 특징

    • 함수 내 static 변수

      함수가 여러 번 호출되어도 초기화는 한 번만 되고, 함수 종료되어도 남아 있음.
      함수 호출되어 생성하는데 오래 걸리는 아주 큰 객체에 static 사용도 좋음

    • 클래스 static 멤버

      클래스의 모든 객체가 공유하는 변수/함수, 객체 없이도 사용 가능

    • 전역/파일 static 변수

      선언된 파일 내에서만 접근 가능(링크 범위 제한)

  void foo() {
      static int count = 0; // 함수 호출 횟수 누적
      count++;
  }

  class MyClass {
      static int shared;           // 모든 객체가 공유
      static void func() { ... }   // 객체 없이 호출 가능
  };
  int MyClass::shared = 0;         // 클래스 외부에서 반드시 정의
  
  int main() {
  	MyClass::func();			 // 객체 없이 호출
  }

3. static const의 조합

  • 공유하면서 값이 변하지 않는 상수(클래스 상수, 전역 상수 등)
  class MyClass {
      static const int MAX = 100; // 모든 객체가 공유, 값은 불변
  };
profile
반갑습니다

0개의 댓글