객체지향적 C++

 

static (정적변수)

#include <stdio.h>

void increaseNumber()
{
    int num1 = 0;    // 변수 선언 및 값 초기화

    printf("%d\n", num1);    // 변수 num1의 값을 출력

    num1++;    // 변수의 값을 1씩 증가
}

int main()
{
    increaseNumber();    // 0
    increaseNumber();    // 0
    increaseNumber();    // 0
    increaseNumber();    // 0: 변수가 매번 생성되고 사라지므로 0이 출력됨

    return 0;
}
0
0
0
0
  • num1은 increaseNumber 함수의 지역변수이므로 호출이 끝나면 사라짐
  • 이를 static을 통해 사라지지 않게 할 수 있음
#include <stdio.h>

void increaseNumber()
{
    static int num1 = 0;     // 정적 변수 선언 및 값 초기화

    printf("%d\n", num1);    // 정적 변수 num1의 값을 출력

    num1++;    // 정적 변수 num1의 값을 1 증가시킴
}

int main()
{
    increaseNumber();    // 0
    increaseNumber();    // 1
    increaseNumber();    // 2
    increaseNumber();    // 3: 정적 변수가 사라지지 않고 유지되므로 값이 계속 증가함

    return 0;
}
0
1
2
3
  • 위 코드를 자세히 풀면 아래와 같음
void increaseNumber()
{ //            ↓ 0
    static int num1 = 0;    // 프로그램이 시작될 때 정적 변수가 생성되고 초기화됨
    num1++;                 // 0에서 1로 증가
}

void increaseNumber()
{ //            ↓ 1
    static int num1 = 0;    // 다시 함수가 호출될 때는 값 초기화 무시
    num1++;                 // 1에서 2로 증가
}

void increaseNumber()
{ //            ↓ 2
    static int num1 = 0;    // 다시 함수가 호출될 때는 값 초기화 무시
    num1++;                 // 2에서 3으로 증가
}

void increaseNumber()
{ //            ↓ 3
    static int num1 = 0;    // 다시 함수가 호출될 때는 값 초기화 무시
    num1++;                 // 3에서 4로 증가
}
  • 이때의 num1은 정적변수이면서 지역변수임
    • 정적변수인 이유: scope 밖으로 벗어나도 메모리에서 해제되지 않음
      • 즉 정적변수의 의미는 메모리 해
    • 지역변수인 이유: increaseNumber() 함수의 scope를 통해서만 접근 가능
  • 좀더 개념을 확장해서 num1을 만약 전역변수란에 선언한다면?
    • 그냥 전역변수를 static 키워드 없이 선언해도 main 함수 바깥에 선언되어있기 때문에 메모리에서 해제되지 않음
      • 이렇게 선언한 변수는 다른 외부 소스파일에서도 extern 키워드를 통해 접근이 가능함. 말그대로 전역변수
    • static 키워드를 붙이면 다른 파일에서는 접근 불가능. 즉 접근제한자의 역할
// main.c

#include <stdio.h>

static int num1 = 10;

void printNumber()
{
    printf("%d\n", num1);    // 10: 정적 전역 변수 num1의 값 출력
}
// 같은 디렉토리의 다른 .c++ 파일

#include <stdio.h>

extern int num1;    // 다른 소스 파일(외부)에 있는 정적 전역 변수는 extern으로 사용할 수 없음
                    // 컴파일 에러

int main()
{
    printf("%d\n", num1);     // 정적 전역 변수 num1의 값 출력

    return 0;
}