멤버 변수를 이해하기 위해서 먼저 알아야 하는 개념은 일반 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()의 지역 변수에 접근이 불가능
즉 위의 코드는 다음과 같이 변경해서 생각할 수 있다.
// 다섯 번째 예제
#include <stdio.h>
int count = 0; // func1() 함수에서만 접근 가능한 전역 변수
voidfunc1( void )
{
printf( "%d \n", ++count );
}
voidmain( void )
{
func1();
func1();
}
실제로 컴파일러는 static 변수의 값을 위와 같은 형태로 변환하여 전역 변수처럼 취급한다.
여기서 중요한 것은 접근 권한인데, count가 전역 변수이긴 하지만 static으로 선언되었기 때문에
컴파일러는func1() 이외의 다른 함수에서 이 변수를 사용할 수 없도록 막아 준다.막아 준다는
의미는 컴파일 에러가 난다는 얘기이다.
자! 그러면 이렇게 생각하면 될 것이다. 함수 내에서 static으로 변수를 선언해야 하는 경우는
'전역 변수를 선언하고, 특정 함수에서만 사용하고 싶을 때' 라고 생각하면 된다.
이 것 외에도 static전역 변수도 있는데, 이것은 여러 개의 파일을 컴파일 할 때 변수 이름의
충돌을 막아 준다. 즉 '그 파일에서만 그 변수를 사용하고 싶을 때' 사용하면 된다.
또하나 static 함수인데,이 것도 마찬가지로 여러 개의 파일을 컴파일 할 때 함수 이름의 충돌을
막아 준다. 즉 '그 파일에서만 그 함수를 사용하고 싶을 때' 사용하면 된다.
'Development > C/C++' 카테고리의 다른 글
[구조체 초기화] (0) | 2012.12.06 |
---|---|
[memcmp] (0) | 2012.10.12 |
[char형의 비트셋을 출력하고 싶을 때] (0) | 2012.08.19 |
[LPSTR, LPCSTR, LPTSTR, LPCTSTR , LPWSTR, LPCWSTR 의 의미] (0) | 2012.08.19 |
[C언어 문법: Bit field (콜론 연산자)] (0) | 2012.06.16 |