본문 바로가기

C++

C++ Static

Static 변수
Static 지역변수 같은 경우에는 함수가 끝나도 해당 변수가 소멸하지 않고 그대로 데이터를 유지하고 있는 특징이 있다.
static은 Data 영역에 등록되어 프로그램이 시작하면 변수의 초기화가 진행된다.

 

 

static 변수
변수를 static 선언하게 되면 내가 몇 개의 변수를 만들든 해당 변수는 오로지 한 개만 존재한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
void numberAdd()
{
    static int number;
    number++;
    cout << number << endl;
}
 
int main()
{
    for (int i = 0; i < 3; i++)
    {
        numberAdd();
    }
}
cs

2~7행 : numberAdd 함수에 static number 변수를 만들고 number의 값을 올려주는 함수를 구현했다.
11~14 : 해당 함수 호출을 하는 포문을 실행
해당 예제의 결괏값은 당연히 쓰레기 값의 1을 더한 값이 나와야 정상이지만 해당 변수는 static이기 때문에
1~4의 값이 출력된다. 즉 처음에 0으로 초기화된 후 함수가 끝나도 값이 사라지지 않고 계속 해당 값을 가지고 있는 것이다.
static 변수의 특징은 지역변수와 전역변수의 특징을 가지고 있는 것인데
지역변수의 특징인 해당 함수인에서만 사용 가능하다
전역변수의 특징인 프로그램이 끝나야 메모리가 해제된다.

 

static 변수의 초기화
아무런 값을 입력하지 않으면 0으로 초기화가 되었다.
그렇다면 10의 값으로 초기화하려면 어떻게 해야 할까?
static int number = 10;으로 하게 되면 에러가 출력될 것이다.
static 변수의 초기화는 전역변수처럼 해야 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
 
class A
{
public:
    static int number;
public :
    void NumberAdd(int num)
    {
        number = num;
    }
};
 
int A::number = 10;
int main()
{
    A a_1;
    A a_2;
    a_1.NumberAdd(50);
    a_2.NumberAdd(100);
    cout << a_1.number << endl;
    cout << A::number << endl;
}
 
cs

5행 : static 변수 생성
13행 : static 변수의 초기화 static 변수는 프로그램 시작 시 초기화가 되기 때문에 객체를 생성하지 않아도 초기화를 할 수 있다. 단 이때 number가 어디에 있는 변수인지는 알려주어야 하기 때문에 A::를 이용해 알려서야 한다.
21행 : static 변수는 객체 생성을 안 해도 메모리에 존재한다. 그렇기 때문에 해당 문법이 가능하다. Aclass는 생성되지 않았지만 Aclass 안에 number는 존재하기 때문이다.

 

static 함수
static 함수 또한 static 변수와 동일하다.
다만 static 함수를 사용할 때 주의사항으로는 static 함수에서는 오로지 static 변수만 사용 가능하다.
static 변수에서 일반 변수를 사용하면 객체를 만들기도 전에 사용해버리는 상황이 존재할 수 있기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
 
class A
{
public:
    static int number;
public :
    static void NumberAdd(int num)
    {
        number = num;
    }
};
 
int A::number = 0;
int main()
{
    A a_1;
    A a_2;
    a_1.NumberAdd(50);
    a_2.NumberAdd(100);
    cout << a_1.number << endl;
}
cs

7행 : static 함수 선언
18행 : a_1객체 number 값을 50으로 초기화
19행 : a_2객체 number 값을 100으로 초기화
20행 : a_1객체의 number 값을 출력하였다.
결괏값으로 당연히 50이 출력되어야 하지만 static 변수는 오로지 하나만 존재하고 static 함수도 오로지 하나만 존재하기 때문에 결괏값은 100이 출력된다.

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

C++ 상속  (0) 2020.09.17
C++ 복사생성자  (0) 2020.09.16
C++ Const  (0) 2020.09.14
C++ 조건부 컴파일  (0) 2020.09.07
C++ 매크로,매크로 함수  (0) 2020.09.07