본문 바로가기
C++

클래스와 Static

by 상레알 2009. 1. 15.

프로그래밍을 하다보면 전역 변수가 어쩔수 없이 필요한 경우가 잇다.

C++은 C언어처럼 절차지향적으로 프로그래밍 하는것도 가능하고 JAVA와 같은 언어처럼 완벽히 객체지향적으로 프로그래밍 하는것도 가능하다.  그래서 C++ 절차지향 프로그래밍에서 주로 사용되는 전역 변수, 전역함수라는 것을 여전히 제공하고 있다.

count 를 전역변수로 하고 객체 생성시마다 1씩 증가하게 한다면  

1.count가 왜 전역 변수로 존재해야 하는지 이해해야된다.
2. 전역 변수 count 는 Person 클래스에 종속적이다. 그럼에도 불구하고 전역 변수로 선언되어 있기 때문에 다른 영역에서 접근할 위험이 있다. 전역 변수 count는 Person 클래스 내에서만 접근을 허용하도록 한다면, 프로그램이 보다 안정적이 될 것이다.

(참고! : 객체 지향에는 전역이라는 개념이 존재하지않는다)
이것을 해결할수 있게 하는게 static 멤버이다

static 멤버의 특징

첫째 main함수가 호출되기도 전에 메모리 공간에 올라가서 초기화된다. 따라서 public으로 선언이 된다면 객체 생성 이전에도 접근이 가능하다.

둘째.객체의 멤버로 존재하는 것이 아니다. 다만 선언되어 있는 클래스 내에서 직접 접근할 수 있는 권한이 부여되는 것이다.

class{
  :
pubilc:
         static int n;
  :
}
int AAA::n=1 ;    // static 멤버 초기화

int main()
{
}

지역변수는 선언되어 있는 함수가 호출되어야 메모리 상에 올라가게되고, 객체는 생성되어야 메모리 공간에 올라간다 그러나
static 멤버는 main 함수가 호출되기 이전에 이미 메모리 공간에 올라가서 초기화된다는 특징을 지닌다( 마치 전역 변수처럼말이다.)
그렇다면 static 멤버 변수 n은 어디서 원하는 값으로 초기화할수 있겟는가? 생성자를 이용하는 것이 좋겟다는 생각을 했는지도 모르겟다 그러나 이것은 적절하지 않다. 왜냐하면 새엉자는 객체 생성시 호출되지만, static 멤버 변수 n은 main함수가 호출되기도 전에 초기화되어야 하기 때문이다. 그래서 C++에서는 static멤버 초기화 라는 문법적 요소를 제공한다.  이것역시 main 함수가 호출되기 이전에 실행된다.

또한 static멤버 특징으로 말했지만 비록 AAA라는 클래스안에 선언 되어 있지만, 이미 메모리 상에 올라갔으므로, 객체 생성과 상관없이 참조가 가능하다.  하지만 이렇게 외부에서 접근이 가능한것은 static멤버 n이 public으로 선언이 되어있기때문이다. 만약 private로 선언이 되어있다면 클래스 외부접근은 허용하지 않았을 것이다.

private 로 static 멤버가 선언이 되어잇다고 한다면  객체를 생성시에 static멤버기 객체의 멤버 로 존재하지 않고
접근 권한만 가지고 있는것이다 .

그리고
static 멤버 변수나 static멤버 함수는 엄밀히 따지면 객체의 멤버가 아니기 때문에 클래스 변수, 클래스 함수라고 표현한다.   그리고 메모리로 생각을 한다면 


static 멤버 변수는 전역변수와 마찬가지로   데이터 영역에 올라간다 는것을 참고하길 바란다.
객체는 당연히  statck  영역에 올라간다

'C++' 카테고리의 다른 글

클래스...  (0) 2009.01.16
상속을 하는 이유  (0) 2009.01.16
protected 멤버  (0) 2009.01.15
상속!!  (0) 2009.01.15
explicit &&&& mutable  (0) 2009.01.15
클래스와 const  (0) 2009.01.14
복사 생성자가 호출되는 시점  (0) 2009.01.08
복사생성자  (0) 2009.01.08
const 함수  (0) 2009.01.06
friend 선언  (0) 2009.01.06