프로그래밍/C++

#19. static 정적변수

코딩하는상후니 2022. 7. 17. 22:00

 

*정적 멤버 데이터
 
=> 객체를 만들지 않아도 프로세스 시작할 때 미리 생성.
=> 해당 범위 내에 인스턴스가 하나만 생성.
즉, 클래스마다 생성되지 않음.
=> 초기화는 클래스 외부에서 해주어야함. ( 필드 초기화 사용 불가 )
 
class Player 
{ 
public:   
	static const int Num = 50; 
        const int Num2 = 40;
        int Item[Num]; 
        int Item[Num2];  => 불가.
};
 
* const 변수로 배열 크기를 지정할 수 없는 이유.
정의 시점이 다름.
지금 상황의 const int 는 클래스가 정의된 이후 40 이란 값으로 초기화됨.
근데 Player 클래스를 선언하는 상황에서 Num2 라는 상수 변수는 존재하지 않음.
따라서,
아직 값이 정해지지도 않았는데 Item 의 배열크기로 쓰려니 오류.
 
 
* static const 변수로는 가능한 이유.
static 이 붙음으로써,
컴파일러가 정적 변수 혹은 상수 값으로 Player 클래스가 선언되기 전에
그 값을 알 수 있음.
 

 
*정적 멤버 함수
 
=> 객체 없이 호출 가능.
=> 클래스 범위 :: 를 가짐.
=> 일반 멤버, 일반 함수에 접근할 수 없다.
why??
정적 멤버 함수도 마찬가지로 프로그램 실행 시, 선언되는 함수이다.
즉, 일반 멤버는 아직 선언조차되지 않은 상태이다.
그 시점에서 알 수 있는 것은 정적 멤버변수, 상수값, 전역변수 밖에 없다.
 
 

 

*정적 지역 변수
=> '오직 선언된 블록' 에서만 접근 가능한 전역 변수.
 
 
@중요한 점
정적 지역 변수도 전역 변수처럼 프로세스가 시작될 때 데이터 영역에 생성되고,
프로세스가 종료될 때 소멸된다. 함수가 시작될 때 생성되는게 아님.
 
대신, 정적 지역 변수는
변수 자신이 선언된 함수가 최초로 호출될 때 실질적인 초기화 가 이루어짐.
 
즉, 프로그램 시작 시, 변수가 '선언' 되고
함수가 시작될 때 변수가 '초기화' 되어짐.
 
 

 
*결론
 
=> 정의된 영역 범위 내에서 인스턴스 하나로 전역적으로 쓰기 위해 만들 수 있다.
 
1. 범위를 가짐.
2. 오직 하나의 인스턴스로 범위 내에서 공유.
3. 프로그램 시작 시, 정의되기 때문에
그 시점에서 알 수 없는 데이터는 쓸 수 없음.
4. 초기화 필요.

 

 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

 

'프로그래밍 > C++' 카테고리의 다른 글

#20. 유의사항  (0) 2022.07.17
#19. const, define  (0) 2022.07.17
#18. 비트 연산과 비트 플래그  (0) 2022.07.16
#17. 비교 연산과 논리 연산  (0) 2022.07.16
#16. 산술 연산  (0) 2022.07.16