static 맴버들은 class에서 유용하게 사용되는 좀 더 기능이 향상된 전역변수이다.
class안에서 static선언이 되면 매모리상에는 전역변수와 같이 프로그램이 시작하면서 외부 변수와 마찬가지로 한번 메모리에 할당을 하게 된다.
따라서 여러 인스턴스에서 접근해야 하면서 같은 data값을 사용해야할 경우 static 맴버 변수를 사용하면 된다.
여러 클래스가 함께 같은 data를 사용할 수 있지만 private등의 형지정을 하면 외부에서 접근 불가능하다.
1. static 맴버 변수
static 맴버 변수는 public외의 지정자로 사용하는 것이 좋다. 한곳에서 static맴버 변수를 수정하면 모든 인스턴스의 data가 바뀌기 때문이다.
static 맴버변수의 값을 바꿀 때는 className::VariableName = Value; 형식법 사용이 좋다. static 변수명(VariableName) 앞에 클래스명(className)과 영역 결정 연산자(::)를 사용하여 전체 오브젝트의 값이 변화 한다는 것을 명시 해주는 것이 프로그램상의 과오를 방지 할 수 있다.
ex) static 맴버 변수의 초기화.
※ static 맴버 변수의초기화를 해더파일에서 하면 여러 번 포함될 수 있기 떄문에 클래스 맴버 함수를 정의한 소스 코드 파일에 있는 것이 바람직하다.
ex) 클래스명과 영역 결정 연산자 사용 (public속성의 static사용시)
2. static 맴버 함수
static맴버 함수는 클래스의 오브젝트가 생성되지 않아도 호출될 수 있지만, 클래스에 국한된다. static맴버 함수는 클래스의 오브젝트가 생성되지 않았을 때 호출해야할 함수가 있다면 사용. static맴버 함수는 클래스 객체가 생성되지 않아도 호출할 수 있기 때문에 this포인터 사용불가능하다. 따라서 static맴버 함수에는 static이 아닌 데이터 맴버에 접근불가 static이 아닌 다른 맴버 함수도 호출 불가능하다.
static맴버 함수도 staic변수와 같이 className::FanctionName = Value; 형식법 사용이 좋다.
영역 결정 연산자를 사용하여 여러 클래스에 영향이 미친다는 것을 표시하는 것이 좋다.
class안에서 static선언이 되면 매모리상에는 전역변수와 같이 프로그램이 시작하면서 외부 변수와 마찬가지로 한번 메모리에 할당을 하게 된다.
메모리 할당은 일반 전역변수와 같지만 사용 범위는 전역변수와는 다르게 class에 국한되어 있다.
따라서 여러 인스턴스에서 접근해야 하면서 같은 data값을 사용해야할 경우 static 맴버 변수를 사용하면 된다.
여러 클래스가 함께 같은 data를 사용할 수 있지만 private등의 형지정을 하면 외부에서 접근 불가능하다.
1. static 맴버 변수
static 맴버 변수는 public외의 지정자로 사용하는 것이 좋다. 한곳에서 static맴버 변수를 수정하면 모든 인스턴스의 data가 바뀌기 때문이다.
static 맴버변수의 값을 바꿀 때는 className::VariableName = Value; 형식법 사용이 좋다. static 변수명(VariableName) 앞에 클래스명(className)과 영역 결정 연산자(::)를 사용하여 전체 오브젝트의 값이 변화 한다는 것을 명시 해주는 것이 프로그램상의 과오를 방지 할 수 있다.
static맴버 변수는 생성자에서 초기화할 수 없다.
static맴버 변수는 private라도 외부 초기화 가능. ( int class::Variable = 38; )
static맴버 변수는 private라도 외부 초기화 가능. ( int class::Variable = 38; )
ex) static 맴버 변수의 초기화.
int class::Variable = 38;
※ static 맴버 변수의초기화를 해더파일에서 하면 여러 번 포함될 수 있기 떄문에 클래스 맴버 함수를 정의한 소스 코드 파일에 있는 것이 바람직하다.
ex) 클래스명과 영역 결정 연산자 사용 (public속성의 static사용시)
int main(void)
{
int class::Variable = 38;
}
{
int class::Variable = 38;
}
2. static 맴버 함수
static맴버 함수는 클래스의 오브젝트가 생성되지 않아도 호출될 수 있지만, 클래스에 국한된다. static맴버 함수는 클래스의 오브젝트가 생성되지 않았을 때 호출해야할 함수가 있다면 사용. static맴버 함수는 클래스 객체가 생성되지 않아도 호출할 수 있기 때문에 this포인터 사용불가능하다. 따라서 static맴버 함수에는 static이 아닌 데이터 맴버에 접근불가 static이 아닌 다른 맴버 함수도 호출 불가능하다.
static맴버 함수도 staic변수와 같이 className::FanctionName = Value; 형식법 사용이 좋다.
int main(void)
{
className A, B;
// 좋지 않은 사용법
A.staticFanction();
// 이런 명확한 표기가 좋다
className::staticFanction();
}
{
className A, B;
// 좋지 않은 사용법
A.staticFanction();
// 이런 명확한 표기가 좋다
className::staticFanction();
}
영역 결정 연산자를 사용하여 여러 클래스에 영향이 미친다는 것을 표시하는 것이 좋다.
추가 내용)
static맴버는 모든 오브젝트에서 필요한 공통되는 자원을 구현하거나, 오브젝트에 대한 상태 정보를 관리하는데 유용하게 사용된다.
static맴버는 모든 오브젝트에서 필요한 공통되는 자원을 구현하거나, 오브젝트에 대한 상태 정보를 관리하는데 유용하게 사용된다.
class ObjectMng
{
public:
static int HowMany() { return m_ObCount; }
ObjectMng() { ++m_ObCount; }
~ObjectMng() { --m_ObCount; }
private:
static int m_ObCount;
}
int ObjectMng::ObCount = 0;
int ClassObCount = ObjectMng::HowMany();
{
public:
static int HowMany() { return m_ObCount; }
ObjectMng() { ++m_ObCount; }
~ObjectMng() { --m_ObCount; }
private:
static int m_ObCount;
}
int ObjectMng::ObCount = 0;
int ClassObCount = ObjectMng::HowMany();