본문 바로가기
프로그래밍/C++

정적변수(static variable)

by Nessie! 2022. 8. 17.

일반적인 지역변수는 {}로 지정된 영역 내에서만 사용이 가능하며, 지정된 영역이 종료된다면 변수 또한 소멸된다.

이는 메모리 구조의 스택(Stack)영역에 저장이 되기 때문인데, 스택 영역의 변수들은 함수 호출시에 메모리에 할당되며 함수 종료시에 메모리에서 사라지는 특징이 있기 때문이다.

 

하지만 static 변수는 데이터(Data)영역에 저장된다. 

따라서, 지역변수이지만 지정된 영역이 종료되더라도 소멸되지 않고 이전 데이터를 저장한 채로 메모리에 계속 남아있는다고 볼 수 있다.

데이터영역은 프로그램 시작할 때 할당되며 프로그램 종료시에 소멸되는 특징이 있기 때문이다.

 

즉, 지역변수이지만 전역변수의 특징을 가지고 있는 변수로 볼 수 있으며 프로그램 종료 시 까지 메모리에 계속 남아있기 때문에 사용에 주의해야한다.

 

static변수에는 몇 가지 특징이 더 있는데,
- static으로 선언한 변수는 0으로 초기화가 된다는 것.
- static 변수는 외부참조가 되지 않는다는 점. (다른 파일 참조를 허용하려면 extern 키워드를 통해 사용해야한다)
- static 변수는 매개변수로 사용할 수 없다는 점.

 

정적변수(static variable)
정적변수는 선언 위치에 따라 활용도가 다르며 변수 앞에 static을 붙여서 선언한다.

함수 외부에 선언
함수 외부에 선언한 정적변수는 선언한 파일에서만 호출이 가능하다. 즉, 선언한 파일 내부의 함수들은 사용 가능하지만 선언한 파일 외부의 함수들은 사용이 불가능하다. 전역변수가 extern 키워드로 다른 파일에서 호출이 가능한 것과는 다르다.

함수 내부에 선언
함수 내부에 선언된 지역변수는 함수가 소멸시 지역변수도 함께 소멸하지만 정적변수는 소멸되지 않고 메모리에 저장되어있다. 따라서 동일 함수를 여러 번 호출하더라도 함수 내 정적변수는 처음 호출된 한 번만 초기화된 후 이후에는 소멸하거나 초기화를 하지 않고 이전 상태를 저장하고 있다.
종료 중괄호를 만나면 지역 변수는 소멸하지만 정적변수로 선언된 변수는 메모리에 남게된다.
종료되더라도 값이 유지되기때문에 전역변수와 비슷하다고 볼 수 있다.

 

정적변수(static variable) vs 전역변수(global variable)


  전역변수 정적변수
생애주기 프로그램 생성부터 소멸까지 프로그램 생성부터 소멸까지
다른파일에서 접근 허용 가능 불가능
0으로 초기화
사용 범위 프로그램 전체 함수 외부 선언 : 선언된 파일
함수 내부 선언 : 중괄호 내부
저장 위치 Data 영역 Data 영역
목적 어디서든 사용이 필요 함수 소멸과 무관한 값의 유지가 필요

(상기 표는 해당 블로그에서 가져왔습니다.) https://hydroponicglass.tistory.com/332

 

 

정적 멤버 함수(static member function)
C++에서는 클래스의 멤버 함수도 정적(static)으로 선언할 수 있습니다.
이렇게 선언된 정적 멤버 함수는 해당 클래스의 객체를 생성하지 않고도, 클래스 이름만으로 호출할 수 있습니다.
정적 멤버 함수는 정적 멤버 변수를 선언하는 방법과 같이 static 키워드를 사용하여 선언합니다.

이러한 정적 멤버 함수는 다음과 같은 특징을 갖습니다.

1. 객체를 생성하지 않고 클래스 이름만으로 호출할 수 있습니다.
2. 객체를 생성하지 않으므로, this 포인터를 가지지 않습니다.
3. 특정 객체와 결합하지 않으므로, 정적 멤버 변수밖에 사용할 수 없습니다.

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

가상함수 및 재정의  (0) 2022.08.19
생성자와 소멸자  (0) 2022.08.18
OOP 알아보기  (0) 2022.08.08
C++ vector  (0) 2022.07.27
STL  (0) 2022.07.27

댓글