C++에서 싱글톤을 만드는 방법

C Eseo Sing Geulton Eul Mandeuneun Bangbeob



C++에서 싱글톤은 프로그램 전체에서 클래스의 단독 인스턴스가 존재하도록 보장하고 해당 특정 인스턴스에 대한 전역 액세스 지점을 제공하는 디자인 원칙입니다.

싱글톤 패턴은 데이터베이스 연결, 로거 또는 구성 관리자와 같이 전역적으로 액세스해야 하는 단일 공유 리소스가 필요할 때 일반적으로 사용됩니다. 단일 인스턴스를 적용하면 프로그램의 여러 부분이 동일한 개체에 액세스하고 수정할 수 있으므로 데이터 일관성이 향상되고 전역 변수의 필요성이 줄어듭니다. 싱글톤은 자주 사용되거나 생성 비용이 많이 드는 객체를 저장하고 애플리케이션 전체에서 재사용하는 객체 캐시로 사용할 수 있습니다. 이 접근 방식은 중복된 개체 생성 및 초기화를 방지하여 성능을 향상시키는 데 도움이 됩니다.

이 기사에서는 싱글톤 생성을 설명하고 C++ 프로그램에서 싱글톤을 스타일 지정하는 예를 보여줍니다.







예 1: 즉시 초기화를 사용하여 간단한 싱글톤 생성

초기 초기화가 포함된 단순 싱글톤은 클래스의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴이며 정적 초기화 중에 적극적으로 생성됩니다.



즉시 초기화를 통해 간단한 싱글톤을 생성하기 위한 기본 코드 조각을 보여드리겠습니다. 프로그램부터 시작해 보겠습니다.



#include

클래스 싱글턴 {
사적인 :
공전 하나씩 일어나는 것 * 사례 ;
하나씩 일어나는 것 ( ) { }
공공의 :
공전 하나씩 일어나는 것 * getInstance ( ) {
반품 사례 ;
}
} ;


하나씩 일어나는 것 * 하나씩 일어나는 것 :: 사례 = 새로운 싱글톤 ( ) ;

정수 기본 ( ) {

하나씩 일어나는 것 * 싱글톤Instance1 = 하나씩 일어나는 것 :: getInstance ( ) ;

하나씩 일어나는 것 * 싱글톤Instance2 = 하나씩 일어나는 것 :: getInstance ( ) ;

성병 :: 시합 << 'singletonletonInstance1: ' << 싱글톤Instance1 << 성병 :: ;

성병 :: 시합 << 'singletonletonInstance2: ' << 싱글톤Instance2 << 성병 :: ;

반품 0 ;

}

코드에는 'std::cout'과 같은 입력 및 출력 스트림을 사용하는 기능을 제공하는 헤더가 포함되어 있습니다.





헤더 파일을 포함시킨 후 싱글톤 패턴 구현을 나타내는 'Singleton' 클래스를 정의합니다. 여기에는 개인 생성자와 '인스턴스'라는 개인 정적 멤버 변수가 있습니다.

그런 다음 getInstance() 함수가 'Singleton' 클래스의 공개 정적 멤버 함수로 구현됩니다. 정적 멤버 변수 인스턴스에 저장된 싱글톤의 인스턴스를 반환합니다. 정적 멤버 변수 인스턴스는 'Singleton* Singleton::instance = new Singleton();'을 사용하여 클래스 외부에서 정의되고 초기화됩니다. 이 줄은 정적 초기화 중에 'Singleton' 클래스의 인스턴스를 열심히 초기화합니다.



main() 함수에서 'singletonInstance1'과 'singletonInstance2'라는 두 개의 포인터를 선언하고 Singleton::getInstance()를 호출하여 반환되는 값을 할당합니다. 인스턴스가 즉시 초기화되므로 두 포인터 모두 동일한 인스턴스를 가리킵니다. 'std::cout' 문은 '<<' 연산자와 'std::endl'을 사용하여 'singletonInstance1' 및 'singletonInstance2'의 메모리 주소를 콘솔에 인쇄합니다.

코드는 성공적인 프로그램 실행을 나타내는 'return 0'으로 끝납니다.

이 코드를 실행하면 출력은 다음과 같습니다.

출력에는 'singletonInstance1' 및 'singletonInstance2'의 메모리 주소가 표시됩니다. 두 포인터 모두 Singleton::getInstance()에서 얻은 동일한 인스턴스로 할당되므로 동일한 메모리 주소를 갖습니다. 이는 싱글턴 패턴이 클래스의 단일 인스턴스가 있고 향후 getInstance() 호출 시 항상 동일한 인스턴스가 생성됨을 보장하는 방법을 보여줍니다.

예 2: 지연 초기화를 사용한 싱글톤 패턴 구현

이 데모에서는 지연 초기화를 사용한 싱글톤 패턴 구현을 설명하고 main() 함수에서의 사용법을 보여줍니다. 이 프로그램 뒤에는 코드 조각에 대한 단계별 설명이 제공됩니다.

#include

클래스 싱글턴 {

사적인 :

공전 하나씩 일어나는 것 * 사례 ;

하나씩 일어나는 것 ( ) {

성병 :: 시합 << '싱글톤 인스턴스가 생성되었습니다.' << 성병 :: ;

}

공공의 :

공전 하나씩 일어나는 것 * getInstance ( ) {

만약에 ( 사례 == nullptr ) {

사례 = 새로운 싱글톤 ( ) ;

}

반품 사례 ;

}

무효의 쇼메시지 ( ) {

성병 :: 시합 << '싱글턴에서 안녕하세요!' << 성병 :: ;

}

~싱글턴 ( ) {

성병 :: 시합 << '싱글턴 인스턴스가 파괴되었습니다.' << 성병 :: ;

}

} ;

하나씩 일어나는 것 * 하나씩 일어나는 것 :: 사례 = nullptr ;

정수 기본 ( ) {

하나씩 일어나는 것 * 싱글톤Instance1 = 하나씩 일어나는 것 :: getInstance ( ) ;

싱글톤Instance1 -> 쇼메시지 ( ) ;

하나씩 일어나는 것 * 싱글톤Instance2 = 하나씩 일어나는 것 :: getInstance ( ) ;

싱글톤Instance2 -> 쇼메시지 ( ) ;

반품 0 ;

}

프로그램은 입력/출력 작업을 수행하기 위해 헤더 파일을 추가하는 것으로 시작됩니다. 그런 다음 'Singleton' 클래스를 선언하고 정의합니다. 클래스의 유일한 인스턴스는 'instance'라는 전용 정적 멤버 변수 내에 유지됩니다.

'Singleton' 클래스의 생성자가 호출될 때마다 'Singleton' 클래스의 인스턴스가 생성됩니다. 'std::cout << … << std::endl;'을 사용하여 'Singleton 인스턴스 생성됨' 메시지를 콘솔에 출력합니다. 생성자는 기본 생성자이므로 매개변수가 없습니다. 인수 없이 Singleton()으로 정의됩니다. 우리는 이를 비공개로 선언합니다. 이는 클래스 내부에서만 호출할 수 있음을 의미합니다. 이는 'Singleton' 클래스의 직접적인 인스턴스화를 방지하고 인스턴스를 얻는 유일한 방법은 getInstance() 함수를 통해서임을 보장합니다.

'Singleton' 클래스의 getInstance() 메서드는 공개 정적 멤버 함수로 선언됩니다. 싱글톤 인스턴스에 대한 접근성을 설정하고 부여하는 역할을 합니다. getInstance() 내부에서는 인스턴스가 'nullptr'인지 확인합니다. 그렇다면 인스턴스가 아직 존재하지 않음을 나타내기 위해 전용 생성자를 사용하여 'Singleton' 클래스의 새 개체를 인스턴스화합니다.

showMessage() 함수는 'Hello from Singleton!'을 표시하는 간단한 멤버 함수입니다. 메시지. 싱글톤의 소멸자가 정의됩니다. 프로그램이 종료되고 '싱글턴 인스턴스가 파괴되었습니다.'를 인쇄할 때 암시적으로 호출됩니다. 싱글톤 인스턴스가 삭제되었음을 나타내는 메시지입니다. 정적 멤버 변수 인스턴스는 처음에 'nullptr'로 정의됩니다.

int main()은 main() 함수의 정의를 시작합니다. 그런 다음 'Singleton* SingletonInstance1 = Singleton::getInstance();' 싱글톤 인스턴스에 대한 포인터를 얻기 위해 '싱글톤' 클래스의 getInstance() 함수를 호출합니다. 이 포인터를 'singletonInstance1' 변수에 할당합니다.

그 후 “singletonInstance1->showMessage();” 화살표 연산자(->)를 사용하여 'singletonInstance1' 포인터에서 showMessage() 함수를 호출합니다. 이 함수는 지정된 메시지를 콘솔에 표시합니다. 이후에는 'Singleton* SingletonInstance2 = Singleton::getInstance();' getInstance() 함수를 다시 호출하여 싱글톤 인스턴스에 대한 또 다른 포인터를 얻습니다. 이번에는 'singletonInstance2' 변수에 포인터를 할당합니다. 'singletonInstance2->showMessage();' 'singletonInstance2' 포인터에서 showMessage() 함수를 호출합니다. 이 함수는 'Hello from Singleton!'을 표시합니다. 콘솔에 다시 메시지를 보내세요.

마지막으로 '0을 반환합니다.' 는 main() 함수의 끝을 의미하고 프로그램은 성공적인 프로그램 실행을 의미하는 0 값을 반환합니다.

이전에 설명한 코드 조각의 출력은 다음과 같습니다.

이 결과는 'Singleton' 클래스가 단 하나의 인스턴스 생성을 보장하고 getInstance() 함수에 대한 추가 호출이 안정적으로 동일한 인스턴스를 생성한다는 것을 확인합니다.

결론

C++에서 싱글톤을 만드는 것은 매우 유용한 개념입니다. 이번 포스팅에서는 처음에 싱글톤의 소개 부분을 다루었습니다. 또한 C++에서 싱글톤을 구현하기 위한 두 가지 예제가 생성됩니다. 첫 번째 그림은 Eager 싱글톤 초기화의 구현을 보여줍니다. 싱글톤 패턴의 지연 초기화 구현은 이 기사의 두 번째 예에서 제공됩니다. 또한 해당 프로그램에 대해 생성된 출력의 스냅샷도 표시됩니다.