※ LIG Nex1 The SSEN Embedded SW School에서 진행된 내용을 정리한 포스팅입니다.
Static과 Singleton 패턴
변수의 특징
global | static | local | register | |
메모리 | data | data | stack | register |
선언 위치 | 함수 밖 | 함수 안/함수 밖 | 함수 안 | 함수 안 |
유효 범위 | 선언 후 파일 전체 + 외부 파일 |
선언 위치에 따라 결정 | 함수 안 | 함수 안 |
life span | 프로그램 종료 전 (프로그램의 life span과 같음) |
프로그램 종료 전 (프로그램의 life span과 같음) |
함수 종료 전 | 함수 종료 전 |
초기화 | 자동 | 자동 | 쓰레기 값 | 쓰레기 값 |
static 멤버 변수
- 인스턴스에서 접근할 수도 있으나, class의 멤버 변수라고 생각하는 것이 좋다.
class Test {
public:
static int a;
int b;
}
- 사용 시 test::a 형식으로 사용할 수 있다.
- 인스턴스에서 접근할 경우 예상치 못한 변경의 위험이 있다.
- 전역에서 초기화 해야한다.
- 생성자에서 초기화 시, 인스턴스가 생성될 때마다 생성자가 호출되어 초기화값으로 덮어써지기 때문에 적합하지 않다.
class StaticTest{
public:
static int a; // static 멤버 변수
int b; // 일반 멤버 변수
StaticTest(): b(0) {}
void add() {
a += 1;
b += 1;
}
void print() {
cout << a << ", " << b << endl;
}
};
// 전역에서 초기화 해야한다.
int StaticTest::a = 0;
- 객체가 없더라도 접근이 가능하다.
- static 멤버 변수도 데이터 영역에 위치해 있기 때문에 가능하다.
- 객체 안에서도 호출이 가능하다.
- 각 인스턴스들이 static 변수에 접근하는 경우 같은 메모리 영역을 참조한다.
- 객체 사이의 공유할 정보를 저장하는 데 사용된다.
static 멤버 함수
- 클래스 소속의 함수
- 객체 생성 전에도 사용이 가능하다.
- 일반 멤버 변수/함수에 접근 불가
- static 멤버 변수/함수에만 접근이 가능하다.
- 객체 생성 없이 제공할 기능을 static으로 선언한다.
- 순수하게 기능을 제공할 목적의 클래스인 경우
- 계산기 등의 프로그램에 적합
Singleton 패턴
https://refactoring.guru/ko/design-patterns/singleton
싱글턴 패턴
/ 디자인 패턴들 / 생성 패턴 싱글턴 패턴 다음 이름으로도 불립니다: Singleton 의도 싱글턴은 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근(액세스) 지점을 제공하
refactoring.guru
Singleton 패턴의 구현
요구사항
private 생성자
객체를 클래스 안에서 생성
생성한 객체를 반환하는 static 멤버 변수
+ 객체를 삭제하는 static 멤버 변수
// private static 변수
Singleton* Singleton::ptr = NULL;
// static으로 선언
Singleton& Singleton::getInstance(void)
{
if (ptr == NULL)
ptr = new Singleton();
return (*ptr);
}
// clean up 함수
void Singleton::cleanUp(void)
{
if (ptr != NULL)
delete ptr;
}
※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)
'Language > C++' 카테고리의 다른 글
[TheSSEN/C++] 8. 다형성 (0) | 2025.01.27 |
---|---|
[TheSSEN/C++] 7. 상속 (0) | 2025.01.27 |
[TheSSEN/C++] 5. 객체 지향 프로그래밍 기법 (0) | 2025.01.27 |
[TheSSEN/C++] 4. 객체 지향 프로그래밍 (0) | 2025.01.27 |
[TheSSEN/C++] 3. 클래스 (0) | 2025.01.27 |