카테고리:

Static : 정적 키워드

static은 지역 변수, 또는 멤버 변수에 붙여 정적의 의미를 부여할 수 있는 키워드이다.

지역 변수

지역 변수의 경우 static은 해당 변수를 전역 변수로 만들어 준다.

static이 없는 경우 value의 스코프는 해당 함수 범위이기 때문에 함수를 호출 할때마다 value를 생성하고 함수가 종료될 때 value가 사라진다.

value 값은 함수 호출마다 0으로 초기화되게 된다.

#include <iostream>
#include <vector>

using namespace std;

void StaticTest()
{
    int value = 0;

    cout << value++ << endl;
}

int main()
{
    for (int i = 0; i < 5; i++)
        StaticTest();

    return 0;
}

static이없을때

value에 static을 붙인다면 value의 스코프는 더이상 함수 범위가 아니라 프로그램이 되는 전역 변수로 바뀌기 때문에, 함수를 호출할때마다 이전 값이 유지된다.

#include <iostream>
#include <vector>

using namespace std;

void StaticTest()
{
    static int value = 0;

    cout << value++ << endl;
}

int main()
{
    for (int i = 0; i < 5; i++)
        StaticTest();

    return 0;
}

static이있을때

멤버 변수

멤버 변수로 선언된 static 변수도 비슷한 의미를 가진다.

기존 멤버 변수들은 해당 클래스 타입으로 생성된 객체마다 다른 메모리를 할당받고 다른 값을 받게 된다.

하지만 static으로 선언된 멤버 변수는 동일한 클래스 타입의 모든 객체에서 같은 값을 갖게 되는 변수이다.

static 멤버 변수는 해당 클래스 타입을 가진 객체의 갯수 등에 사용할 수 있으며

헤더에서 정의 후 소스 코드에서 전역으로 선언해주어야 한다.

//헤더 파일
#pragma once

class Test
{
public:
	static int value; //헤더에서는 초기화를 할 수 없다.
};

//소스 파일
int Test::value = 0;

메모리 공간

메모리구조

기존 지역 변수는 Stack 공간, 멤버 변수는 Heap에 할당되지만

static으로 선언된 변수들은 프로그램 종료 시까지 데이터를 유지하는 Data공간에 저장된다.