티스토리 뷰

반응형
정적 멤버 변수란?

✅ 정적 멤버 변수란?

C++ 객체지향에서 '공통 정보'를 다루는 정확한 방법

1️⃣ 문제 제기: 객체지향은 왜 "공통 정보"를 다루기 어려운가?


C++에서 클래스를 만들면, 보통 다음과 같이 코딩합니다:
class Person {
public:
    string name;
    int age;
};
이렇게 만들면 `Person` 객체가 100개면, 각각 `name`, `age`를 따로 가집니다.
즉, 객체마다 자기 데이터만 존재하게 됩니다.

✔️ 이것이 객체지향의 기본 원칙입니다:
“객체는 자기 상태를 자기 안에 가진다.”
그러나 이 원칙만으로는 해결되지 않는 상황도 존재합니다.


2️⃣ 어떤 정보는 '객체 개별 정보'가 아니다


예를 들어 다음과 같은 정보는 어떨까요?
  • 모든 Person이 말할 때 사용하는 공통 언어 ("Korean")
  • 모든 NetworkClient가 접속하는 공통 서버 주소
  • 프로그램의 버전 번호
  • 생성된 전체 객체 수
이러한 정보들은 다음과 같은 특징을 가집니다:
항목 특징
공유성 모든 객체가 같은 값을 알아야 함
일관성 누군가 바꾸면 전체가 바뀜
단일성 값이 하나만 존재해야 함
독립성 객체 없이도 존재해야 함

이런 정보는 객체 내부가 아닌 클래스 자체에 속해야 하는 정보입니다.


3️⃣ 해결책: 그 정보를 "클래스에다 직접 붙이자" → 정적 멤버 변수


C++은 이런 요구를 충족시키기 위해 정적 멤버 변수(static member variable)를 제공합니다.
class Person {
public:
    static string language; // 모든 객체가 공유
};
정적 멤버 변수의 주요 특징:
항목 의미
클래스 소속 객체가 아닌 클래스 자체에 속함
공유 메모리 모든 객체가 같은 공간 사용
객체 없이 접근 ClassName::member 형태로 사용
메모리 단 하나 프로그램 전체에 1개만 존재



반응형

 


4️⃣ 예제: 왜 이게 필요한지 실제로 보여주기


🎯 문제: 모든 Person 객체는 공통 언어(language)를 알아야 한다

class Person {
public:
    string name;
    static string language;

    void speak() {
        cout << name << " speaks " << language << endl;
    }
};

// 클래스 외부에서 정의
string Person::language = "Korean";
int main() {
    Person p1, p2;
    p1.name = "Alice";
    p2.name = "Bob";

    p1.speak(); // Alice speaks Korean
    p2.speak(); // Bob speaks Korean

    Person::language = "English";

    p1.speak(); // Alice speaks English
    p2.speak(); // Bob speaks English
}
✅ 결과 해석
  • 각 객체는 독립적이지만
  • 정적 변수 language는 하나의 메모리를 참조
  • 누가 바꾸든 전체에 즉시 반영됨



5️⃣ 정적 멤버 변수를 쓸 때 생기는 장점들


장점 설명
공유 모든 객체가 하나의 값을 공유함
일관성 한 곳에서 바꾸면 전체에 반영됨
편의성 객체 없이 클래스 이름으로 접근 가능
설계 명확성 클래스가 가져야 할 정보임을 명확히 표현 가능



6️⃣ 상위 객체로 해결하면 안 되나?


“Store, Config 같은 상위 객체를 만들어서 공유하면 되지 않나요?”

✔ 가능합니다. 복잡한 시스템에서는 그게 더 나을 수도 있습니다.
하지만 다음 상황이라면 정적 멤버 변수가 더 적합합니다:
  • 정보가 단순하여 별도 클래스가 필요 없는 경우
  • 객체가 독립적으로 생성되는데 공통 설정이 필요한 경우
  • 그 정보가 클래스의 속성처럼 간주되는 경우
예시:
class App {
public:
    static constexpr const char* VERSION = "1.2";
};



7️⃣ 정적 멤버 변수의 사용법 요약


✅ 선언: 클래스 내부에서
class MyClass {
public:
    static int count;
};
✅ 정의: 클래스 외부에서
int MyClass::count = 0;
✅ 접근: 클래스 이름으로
MyClass::count++;



반응형

 


✅ 최종 요약


항목 설명
정의 클래스에 하나만 존재하는 공유 변수
목적 객체끼리 공유해야 할 공통 정보 표현
예시 언어, 버전, 총 개수, 설정 값 등
특징 클래스 소속, 객체 없이 접근, 메모리 하나
장점 공유성, 일관성, 설계 명확성 확보
오해 방지 전역변수 아님. 클래스에 명확히 소속됨



💬 한 문장 정리


정적 멤버 변수는 객체가 아닌 ‘클래스 자체’가 가져야 할 정보를 정확하게 표현하는 도구입니다.
모든 객체가 공유해야 하는 단 하나의 데이터가 필요할 때, 이보다 더 명확한 구조는 없습니다.
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함