멤버 변수를 이해하기 위해서 먼저 알아야 하는 개념은 일반 static 변수이다.

다음 코드는 함수 내에서 static을 선언하는 경우이다.이 것이 우선 이해가 되어야 클래스에서 사용되는

static을 이해할  있을 것이다.

 

// 첫 번째 예제

#include <stdio.h>

 

voidfunc1( void )
{
    static int count = 0;

    printf( "%d \n", ++count );
}

 

void main( void )
{
    func1();
   // count = 9;   ,  컴파일 에러,func1()의 지역 변수에 접근이 불가능

    func1();
}

 

위 코드를 실행하면 결과는 다음과 같다.

 

count = 1
count = 2

 

위 코드를 설명하자면, static은 func1() 함수가 사용하는 전역 변수이다. 전역 변수라면

다음과 같이 코드를 변경해 볼 수 있다.

 

// 두 번째 예제

#include <stdio.h>

 

int count = 0;

voidfunc1( void )
{
    printf( "%d \n", ++count );
}

 

voidmain( void )
{
    func1();
    count = 9;    // 전역 변수에 접근이 가능
    func1();

}

 

위 코드를 실행하면 결과는 다음과 같다.

 

count = 1
count = 10

 

이와 같이 변경해도 우리는 같은 결과를 얻을 수 있다.

그렇다면 '차라리 이렇게 사용하는 것이 낫지 않을까?' 라는 생각이 드는데, 맞는 얘기이기는

하다. 하지만 아주 중요한 하나의 차이점이 있다. 무엇일까? 이미 이 답을 알면 본인의 C언어

실력을 한 번쁨 의심(?)해 봐야 한다. 왜냐하면 보통 내공은 아니기 때문이다. 실력이 매우 좋다는

얘기다.

 

 번째 예제와 두 번째 예제의 차이점은 변수의 결합성과 관련이 있다. 첫 번째 변수는 main()

함수에서 절대로 사용할 수 없다. 하지만 두 번째 변수는 main() 함수에서도 사용할 수 있다.

결합성(결합도)은 변수가 다른 곳에서 얼마나 참조될 수 있는가에 대한 것으로,이 것은 좋은 프로그램과

나쁜 프로그램을 구별하는 기준이 된다.  결합도가 낮을 수록 좋은 프로그램이 된다.

 

그래서 결합도를 낮추기 위해 func1() 함수에서만 사용하는 변수는 그 함수 내에 선언하고 사용하는 것이

좋다. 그런데 다음과 같이 func1() 함수의 count 변수에 static 사용하지 않으면, 실행 결과는 첫 번째

예제와 전혀 다르게 나온다.

 

// 세 번째 예제

#include <stdio.h>

 

void func1(void )
{
    int count = 0;

    printf( "%d \n"++count );
}

 

void main( void)
{
    func1();
    func1();
}

 

 func1() 함수가 호출될 때 마다 count 변수는 새로 선언되고0으로 초기화된다.

위 코드를 실행하면 결과는 다음과 같다.

 

count = 1
count = 1

 

우리가 원하는 것은 func1() 함수가 호출될 때마다 1씩 증가하는 것이다.그리고 변수의 결합성을 낮추는

(다른 함수에서 사용하지 못하도록 하는) 것이다.그러기 위해서는 다시 첫 번째 예제로 돌아가야 하는데,

다음과 같이static 변수를 사용하면, count 변수는 func1()에서 선언되었기 때문에, func1()에서만 사용하는

전역 변수가 된다.

 

// 네 번째 예제

#include <stdio.h>

 

void func1( void )
{
    static int count = 0;

    printf( "%d \n", ++count );
}

 

voidmain( void )
{
    func1();
    // count = 9;   ,  컴파일 에러, func1()의 지역 변수에 접근이 불가능

   func1();
}

 

즉 위의 코드는 다음과 같이 변경해서 생각할 수 있다.

 

// 다섯 번째 예제

#include <stdio.h>

 

int count = 0;         // func1() 함수에서만 접근 가능한 전역 변수

voidfunc1( void )
{
    printf( "%d \n", ++count );
}

 

voidmain( void )
{
    func1();
    func1();
}

 

실제로 컴파일러는 static 변수의 값을 위와 같은 형태로 변환하여 전역 변수처럼 취급한다.

여기서 중요한 것은 접근 권한인데, count가 전역 변수이긴 하지만 static으로 선언되었기 때문에

컴파일러는func1() 이외의 다른 함수에서 이 변수를 사용할 수 없도록 막아 준다.막아 준다는

의미는 컴파일 에러가 난다는 얘기이다.

 

자! 그러면 이렇게 생각하면 될 것이다. 함수 내에서 static으로 변수를 선언해야 하는 경우는

'전역 변수를 선언하고, 특정 함수에서만 사용하고 싶을 때' 라고 생각하면 된다.

 

이 것 외에도 static전역 변수도 있는데, 이것은 여러 개의 파일을 컴파일 할 때 변수 이름의

충돌을 막아 준다. 즉 '그 파일에서만 그 변수를 사용하고 싶을 때' 사용하면 된다.

 

또하나 static 함수인데,이  것도 마찬가지로 여러 개의 파일을 컴파일 할 때 함수 이름의 충돌을

막아 준다. 즉 '그 파일에서만 그 함수를 사용하고 싶을 때' 사용하면 된다.

Posted by cyj4369
,