본문 바로가기

Programming/C / C++

[C++] 클래스와 static

 C 에서의 static  
 :  C언어에서 static을 사용했던 이유는 전역변수는 프로그램어느 곳에서 접근 가능하지만, 지역변수에다가 static을 붙여주면, 지역변수가 전역변수의 특성을 지니게 하면서 접근할 수 있는 범위에 제한을 둔다는 특징이 있기 때문이었다. 

 Class, Static 멤버의 등장  
 : C++에서는 전역이라는 개념이 존재하지 않는다. 그럼 왜 C++은 왜 전역을 쓰지 않나? 기본적으로 전역변수는 접근 범위가 제한되어 있지 않기 때문에 프로그램 관리가 어려운 점도 있지만, 근본적으로 OOP에서는 전역이라는 개념이 존재하지 않기 때문이다. 그래서 전역 변수와 전역 함수를 일부 대체하기 위해서 static 멤버 라는 개념이 등장한 것이다. 
 위의 예제는 전역 변수 count가 있고, person이 생성 될때마다 count 값을 한번씩 증가 시키고 출력시키는 프로그램이다. 생성되는 person 객체는 전역변수 count를 참조해서 값이 일정하게 증가될 것이다. 하지만 C++로 넘어 오면서 우리는, OOP, 객체지향 프로그래밍을 위하여 전역 변수, 전역 함수를 쓰지 않도록 해야 한다!!

 static 멤버의 특징  
 1. static 멤버(변수 or 함수)는 C++에서 일반적으로 클래스 변수, 클래스 함수라 불리운다. 그럼 왜 클래스 변수,함수 라 불리우는가?  객체를 생성했을 때, 객체의 멤버로 존재하는것이 아니라, 클래스 내에 선언이 되어 클래스를 기반으로 생성되는 모든 객체는 다 공유 하기 때문에(즉, 객체 단위가 아니라 클래스 단위로 사용되기 때문에) 이렇게 불리운다. 
 2. main 함수 호출 이전에 메모리 공간에 올라가서 초기화 한다. (전역변수와 동일)
 3. 선언된 클래스의 객체 내에 직접 접근을 허용한다.
 4. static 멤버 초기화문으로 초기화해야 한다. 왜 초기화문이 필요한가? 예제를 통해 알아 봅시다.

 static 멤버는 메인 함수 호출 되기 이전에 초기화가 이루어진다. 하지만 이 count를 생성자 내에서 초기화 시킬 경우에 메모리 공간에 올라감과 동시에 초기화가 이루어 지는게 아니라, 객체가 생성될때마다 값이 리셋될것이다. 그래서 항상 같은 결과만을 출력하게 되기 때문에 초기화를 위해 static 멤버 초기화문이 등장했다.