정적멤버 (static)
- 인스턴스를 선언하지 않고 직접 호출할 수 있다.
- 변수든 함수든 정적 멤버는 사실상 전역 변수나 함수와 같다. 다른점은 클래스의 멤버라는 점이다.
- static 예약어를 작성해 사용한다.
- this 포인터를 사용할 수 없다.
- 정적 변수는 반드시 선언과 정의를 분리해야한다.
정적 멤버에 접근하는 2가지 방법
1) 인스턴스 및 멤버 접근 연산자 : a.GetCount()
2) 클래스이름 및 범위 지정 연산자 : CTest::GetCount()
정적멤버 사용예
class CTest
{
public:
static int GetCount()
{
return m_nCount;
}
private:
int m_nDta;
//정적 멤버 변수 선언(정의는 아니다!!)
static int m_nCount; //선언과 정의를 분리해야한다. 여기서 초기화하면 안된다.
};
//CTest 클래스의 정적 멤버 변수 정의
int CTest::m_nCount = 0;
int main()
{
CTest a(5), b(10);
//정적 멤버 접근
cout << a.GetCount() << endl; //정적 멤버는 인스턴스로도 호출이 가능하다.
//정적 멤버에 접근. 인스턴스 없어도 접근 가능!
cout << CTest::GetCount() << endl; //인스턴스없이 클래스 이름으로 접근
return 0;
}
개발자 주의사항
인스턴스를 선언하거나 new 연산으로 인스턴스를 생성하지 않아도 사용하기 위해 많은 사람이 전역 함수를 만들어서 해결하려는 경향이 있다. 하지만 이는 결코 좋은 선택이 아니다. 객체지향 프로그래밍에서 소속 객체가 없이 스스로 존재하는 전역함수들은 좋은 설계를 역행하거나 불필요한 의존 관계를 만드는 원인이 될 수 있기 때문. 그래서 나온 대안이 정적 멤버이다.
다시 한번 강조하지만 객체지향 프로그래밍에서 전역 함수와 변수를 남발하면 객체지향 개념과 상관없는 코드로 변질될 가능성이 커진다. 그러므로 적극적으로 정적멤버를 활용하는 것이 바람직.
'◼️C++' 카테고리의 다른 글
[C++] 구조체를 함수로 넘겨서 값 변경하기 (0) | 2023.10.19 |
---|---|
[C++] 2차원 구조체 배열 포인터로 구조체에 접근하기 (0) | 2023.10.19 |
[C++] delete 예약어를 이용한 명시적 메서드 삭제 (0) | 2023.09.17 |
[C++] 상수형 메서드, mutable, const_cast< > (0) | 2023.09.17 |
[C++] 클래스 요구사항에 맞게 코드 구현하기 (0) | 2023.09.17 |