F.R.I.D.A.Y.

지식인: static 변수의 초기화와 대입 본문

외부활동/지식in

지식인: static 변수의 초기화와 대입

F.R.I.D.A.Y. 2020. 9. 3. 22:53
반응형

 

 

C언어 변수 개념 질문입니다.

안녕하세요. C언어 기본서를 다시 훑어보는 도중에 의문이 생겼습니다. 코딩 대신 해달라는 질문아니고 개념 질문이니 그냥 지나치지 않아주시면 감사하겠습니다.책에서는 정적변수 ( 예시...

kin.naver.com

 C언어 중에서도 static 변수의 초기화와 대입에 대한 내용을 질문하셨습니다.


변수

 많은 변수들은 각각 생존 주기(Life cycle)를 가집니다. 대부분 자신으로부터 가장 가까운 바깥 블록의 생존 주기를 가집니다.

int main(void){
    int a;
    
    {
        int b;
        
        {
            int c;
        
        } // 3
    } // 2
} // 1

이 코드에서 a 변수의 생존 주기는 1번 블럭 안에서, b 변수는 2번 블럭 안에서, c 변수는 3번 블럭 안에서 사용할 수 있습니다.

왼쪽부터 각각 a, b, c 변수를 사용할 수 있는 범위

 만일 자신에게 허용된 범위 바깥에서 변수를 사용하려하면 오류가 발생하지요. 각각의 변수는 생존 주기가 끝나면 가진 데이터를 잃습니다. 이 과정에서 static 키워드를 붙여준다면 생존 주기를 늘릴 수 있게 됩니다.

 

static 키워드

 static 키워드는 대상의 생존 주기를 main 함수와 같이 가도록 합니다.[# main 함수와 같이 간다는 말은, 결국 프로그램의 시작과 끝을 함께 한다고 볼 수 있습니다.]

 다음 코드를 보겠습니다.

int cPlus(int a, int b){
    static int var = 3;
    int result = a + b + var;
    var = a;
    
    return result;
}

int main(void){
    int num1, num2;

    printf("첫 번째: %d\n", cPlus(4, 5));
    printf("두 번째: %d\n", cPlus(1, 5));
    printf("세 번째: %d\n", cPlus(5, 5));
    printf("네 번째: %d\n", cPlus(7, 5));
    printf("다섯 번째: %d\n", cPlus(1, 5));
    
}

 이 코드를 함수로 실행시켜보면 cPlus로 넘긴 값이 연산되어 돌아올 때, 이전 cPlus 함수를 실행하며 넘긴 첫 번째 수가 더해져 옴을 알 수 있습니다.

 이것이 static 키워드의 기능입니다. 함수가 끝날 때, result 변수는 생존 주기를 다해 사라지게 됩니다. 그러나 우리의 var 변수는 static 키워드의 영향으로 자신이 몸담고 있는 cPlus 함수가 연산을 마쳐 끝나더라도 사라지지 않습니다. 그리고 다시 cPlus 함수를 호출할 때는 아래의 코드가 무시된 채 대입, 증감에만 자신의 값을 변경합니다.

static int var = 3; // 두 번째 cPlus 호출부터 무시됨.

 

초기화와 대입

 초기화는 대입의 한 가지 방법이라 볼 수 있습니다. 결국 초기화도 특정 공간에 값을 넣는것, 대입과 별반 차이가 없으니까요. 그러나 초기화는 변수나 요소를 생성하는 그 시점에서만 할 수 있습니다.

int a = 3;

int b;
b = 3;

 a와 b 코드 모두 3으로 값을 집어넣고 있습니다. 그러나 a는 "변수의 선언과 동시에 초기화 한다" 라고 하겠지만, b 변수는 "b 변수를 선언하고 3을 대입한다"라고 말할 수 있습니다.[# 나중에 더 많이 배우게 되면 귀찮아서 b의 선언 방법도 "초기화 한다"라고 말할 수도 있겠습니다.] 즉, 선언과 동시에 대입을 한다면 그것은 초기화로 볼 수 있습니다. 한 편으로 선언은 하지만 대입은 선언이 끝난 뒤에 한다면 그것은 초기화보다는 대입에 가깝습니다.

 

 static 변수의 경우 꼭 한 번 초기화를 해주어야 합니다. 그리고 나선 대입이나 증감 연산자를 통해 값을 바꾸더라도 초기화가 아니므로 값을 변경할 수 있습니다. 선언과 초기화, 대입을 명확히 구분해야 이 문제가 해결되겠군요.

 

# index

728x90
반응형
Comments