본문 바로가기

프로그래밍 언어/C언어

C언어 - static

 

함수가 몇 번 호출되었는지 알려주는 함수를 작성해보자.

 

#include <stdio.h>

void cnt() {
	int b;

	b += 1;
	printf("%d\n", b);
}

int main() {
	cnt();
	cnt();
}

 

 

위 코드를 실행해봤을 때

 

b가 초기화가 되어있지 않다는 오류가 발생한다.

 

 

#include <stdio.h>

void cnt() {
	int b=0;

	b += 1;
	printf("%d\n", b);
}

int main() {
	cnt();
	cnt();
}

 

하지만 이렇게 b를 0으로 초기화한다면

 

우리는 호출한 함수의 횟수를 누적할 수 없게된다.

 

 

 

그렇다면..

 

#include <stdio.h>

int b = 0;

void cnt() {
	b += 1;
	printf("%d\n", b);
}

int main() {
	cnt();
	cnt();
}

 

이렇게 b를 전역변수로 처리해준다면 해결할 수 있다.

 

 

*****물론*****

 

편리하긴 하지만 전역변수는 꼭 필요한 경우가 아니면 안쓰는 것이 좋다.

 

 

그렇기에 우리는 static 을 이용하여 해결해볼 것이다.

 

 

#include <stdio.h>

void cnt() {
	static int b = 0;

	b += 1;
	printf("%d\n", b);
}

int main() {
	cnt();
	cnt();
}

 

코드를 실행한다면 1 2 의 값이 출력되는 것을 볼 수 있다.

 

 

 

static은 무엇일까?!

 

직역하면 "정적" 으로

 

static int b로 선언하여서 b를 정적변수로 만든다.

 

 

전역변수에 대해 설명을 조금 하자면

 

전역변수로 선언한다면 해당 전역변수는

프로그램이 끝날 때까지 메모리가 유지된다.

(끝까지 남아있음)

 

반면 지역변수는 해당 함수 내에서만 사용되고

함수가 끝나면 메모리에서 해제된다.

 

그래서 첫 번째 실행한 cnt() 함수가 실행된 후

b가 메모리에서 해제되고

 

두 번째에 cnt()함수가 실행되면

누적이 된 것이 아닌 처음 본 b라는 것이다.

 

 

하지만 static을 사용해 b를 정적변수로 만든다면

해당 함수가 끝나도 b에 대한 값이 메모리에 남아있다.

 

메모리에 남아있기에 누적이 되고

1 2 가 출력된다는 것을 알 수 있다!

 

 

 

참고로 static 은 다음과 같은 경우에도 쓰인다.

#include <stdio.h>

void sayWelcome() {
	static char msg[] = "Welcome to our fantastic party tonight, we sure you will get an unforgettable experience here";
	printf("%s", msg);
}

int main() {
	int i;
	for (i = 0; i < 1000; i++) {
		sayWelcome();
	}
}

 

위 코드와 같이 긴 문자열을 출력하는 함수를

반복해서 호출해야 하는 경우에 유용하다.

 

static을 붙이지 않는다면 msg[] 변수가 메모리에서 할당되었다가 해제되고

계속 반복되다보니 컴퓨터 입장에서는 부담스럽다.

 

물론 매우 빠르긴 하지만..

 

메모리 할당 및 해제 작업은

컴퓨터에서 오래 걸리는 것 중 하나이기에 숙지해두자!

 

 

 

'프로그래밍 언어 > C언어' 카테고리의 다른 글

C언어 - 포인터 기초  (0) 2021.02.17
C언어 - 전역변수, 지역변수  (0) 2021.02.06
C언어 - 숫자 표현 범위  (0) 2021.02.03
C언어 - 배열 문법  (0) 2021.01.25
C언어 - 배열과 함수  (0) 2021.01.24