#2-2. extern, static, const 키워드 알아보기

Kal·2021년 7월 17일
0

C언어

목록 보기
3/17

extern, static 키워드의 사용방법을 알아본다.

#1. extern 키워드

- 소스 파일을 분리할 때 발생하는 오류

소스 파일이 길어지게 되면, 함수 별로 하나의 프로젝트에서 쪼개서 .c 파일로 분리하는 경우가 종종 있다.
그러나, 이렇게 함수 별로 파일을 나누게 되면 어떤 파일에서는 전역 함수 선언을 참조하지 못하게 되어 오류가 발생한다.

이 오류를 해결하기 위해 Main.c 파일에 단순히 int result; 라는 전역 변수를 또 추가하게 되면, 링크할 때 두개의 result 전역 변수로 인해 오류가 발생한다.

해결법 : 같은 프로젝트 안에 존재하는 전역 변수를 참조하겠다는 키워드 : extern 을 활용하자.

* extern을 활용한 소스코드 예시 (c.1)

#include <stdio.h>
void Sum(int,int); /*Sum 함수의 함수원형 선언*/
extern int result; /*result 전역 변수를 찾아 참조하겠다*/

void main()
{
Sum(5,3);
printf("5 + 3 = %d\n", result); /* result값을 참조한다는 extern 키워드로 인해 result 값이 같은 프로젝트 
안에 있는 result 변수 참조 */
}

이렇듯 extern 키워드를 이용하면, 다른 파일에 있는 전역 함수를 참조할 수 있다.

- extern 키워드를 사용할 때 주의할 점

A.c ->

int g_data1 = 0;
int g_data2 = 0;
int g_data5 =0; (전역 변수들)

B.c ->

int g_data1; (선언 불가, 같은 이름의 전역 변수 존재),
extern int g_data2; (정상참조),
extern int g_data3; (존재하지 않는 변수라서 참조 불가),
extern int g_data4 = 0; (존재하지 않는 변수지만 초기화했으므로 일반 전역 변수),
extern int g_data5 = 0; (중복되므로 오류 발생)

2. static 키워드

- 특정 소스 파일에서만 전역 변수 사용하기

만일, 전역 변수를 사용하고 해당 전역 변수의 사용 범위를 변수를 선언한 소스 파일로 제한하고 싶다면, 전역 변수 앞에 static 키워드를 사용하면 된다.

다른 파일에서 extern 키워드로 참조할 수 없을 뿐 아니라, 같은 이름의 전역 변수를 다른 소스파일에서 선언해도 오류가 발생하지 않는다. (그 소스 파일 내에서만 제한되는 전역 변수)

즉, 같은 이름의 전역 변수를 두 개 선언하더라도 둘 다 별개의 전역 변수로 사용할 수 있다.

A.c

int g_data1 = 0;
static int g_data2 = 0;
static int g_data3 = 0;

B.c

int g_data1; (오류 발생, 같은 이름의 전역 변수 존재)
int g_data2; (오류 발생 X, 별개의 전역 변수)
extern int g_data3; (extern을 통한 참조 불가능)

- 지역 변수를 사용한 경우 (c.2)

#include <stdio.h>
void Test()
{
int data = 0; /* 지역 변수, Test 함수 내에서 초기화됨 */
printf("%d,", data++);
}
void main()
{
int i;
for(i=0;i<5;i++) Test(); /* 지역 변수 data가 Test 함수 종료 때 함께 종료되기 때문에, 값이 유지되지 않음.
결국 출력 값이 0만 나오게 된다 */
}

출력 결과 : 0, 0, 0, 0, 0,

- static + 변수를 사용한 경우 (c.3)

#include <stdio.h>
void Test()
{
static int data = 0; /* 이 함수에서만 사용할 수 있는 전역 변수 */ 
/* 처음 호출 되었을 때엔 0이 출력되지만, data++ 코드가 적용되어 다음 호출할 때에는 1씩 증가한 값이 출력된다 */
printf("%d,", data++);
}
void main()
{
int i;
for(i=0;i<5;i++) Test();
}

출력 결과 : 0, 1, 2, 3, 4,

3. const 키워드

프로그래밍을 하다 보면 자신이 만든 함수를 다른 사람에게 제공하는 경우가 있다. 이런 경우 함수를 사용할 때 주의 사항을 매뉴얼로 만들어서 제공하거나 소스 코드에 주석을 달아 알려준다.

고정 값이 있는 변수가 있을 때, 사용자가 실수로 그 값을 바꾸어 버려도 오류가 나지 않기 때문에 강력한 키워드가 필요하다.

GetArea 함수를 이용한 예시 (c.4)

double GetArea(double pi, double radius, int limit)
/* GetArea 함수의 첫 번째 인자 pi 값은 절대 변경하지 말 것 */

{
double result;
pi = 3.14; /*변경 불가*/
result = pi * radius * radius;
return result;
}

Const 키워드는 Constant의 약자로, 변수를 상수처럼 쓰고 싶을 때 사용한다.
변수를 상수처럼 사용한다는 뜻은 변수의 값을 변경하지 않겠다는 의미이다.

const 키워드를 이용한 예시 (c.5)

double GetArea(const double pi, double radius, int limit)
{
double result;
pi = 3.14;
result = pi * radius * radius;
return result;
}

const 키워드는 작성한 사람의 의도를 분명하게 표현하는 문법이며, 실수 방지를 위해 사용한다.
디버깅 시 찾아낼 수 있음.

profile
프로그래밍 독학

0개의 댓글