Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 정적 클래스를 구현하는 방법 완벽 가이드

C++에는 정적 클래스가 존재하지 않습니다

C++에는 Java나 C#처럼 언어 차원에서 제공되는 정적(static) 클래스 문법이 없습니다. 대신 가장 근접한 방식은 정적 데이터 멤버와 정적 메서드만으로 구성된 클래스를 작성하는 것입니다.

클래스의 정적 데이터 멤버는 해당 클래스의 모든 객체가 공유합니다. 객체의 개수와 관계없이 메모리에는 단 하나의 복사본만 존재하기 때문입니다. 또한 정적 메서드는 정적 데이터 멤버, 다른 정적 메서드, 그리고 클래스 외부의 함수에만 접근할 수 있다는 점도 기억해야 합니다.

다음 프로그램은 C++에서 정적 데이터 멤버와 정적 메서드를 사용하는 방법을 보여줍니다.

예제 코드

#include <iostream>
using namespace std;
class Example {
    public :
    static int a;
    static int func(int b) {
        cout << "Static member function called";
        cout << "\nThe value of b is: " << b;
    }
};
int Example::a=28;
int main() {
    Example obj;
    Example::func(8);
    cout << "\nThe value of the static data member a is: " << obj.a;
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Static member function called
The value of b is: 8
The value of the static data member a is: 28

코드 설명

먼저 Example 클래스 내부를 살펴보겠습니다. 여기서 a는 int형 정적 데이터 멤버이며, func()는 "Static member function called"라는 메시지를 출력하고 매개변수 b의 값을 화면에 표시하는 정적 메서드입니다. 해당 코드는 다음과 같습니다.

class Example {
    public :
    static int a;
    static int func(int b) {
        cout << "Static member function called";
        cout << "\nThe value of b is: " << b;
    }
};
int Example::a = 28;

정적 데이터 멤버는 클래스 외부에서 범위 지정 연산자(::)를 사용해 반드시 한 번 정의하고 초기화해야 합니다. 위 코드에서 int Example::a = 28; 부분이 그 역할을 합니다.

이어서 main() 함수에서는 Example 클래스의 객체 obj를 생성합니다. 정적 함수 func()는 객체 이름이 아닌 클래스 이름과 범위 지정 연산자를 통해 호출하며, 이후 정적 멤버 a의 값을 출력합니다.

int main() {
    Example obj;
    Example::func(8);
    cout << "\nThe value of the static data member a is: " << obj.a;
    return 0;
}

추가 팁: 인스턴스 생성 완전히 막기

진정한 "정적 클래스"처럼 동작하도록 만들려면 객체 생성 자체를 차단하는 것이 좋습니다. 생성자를 private 영역에 선언하거나, C++11 이상에서는 delete 키워드를 활용할 수 있습니다.

class Example {
public:
    static int a;
    static int func(int b) {
        cout << "Static member function called";
    }
    Example() = delete; // 인스턴스화 방지 (C++11 이상)
};

이렇게 하면 Example obj;와 같은 객체 생성 코드가 컴파일 오류를 발생시키므로, 오직 정적 멤버와 정적 함수만 사용하는 유틸리티 클래스 형태를 완성할 수 있습니다.