본문 바로가기

Programming

[C언어] C언어 기초강좌 3 / C언어 / 프로그래밍 기초 / 프로그램 만들기

이번 강좌 에서는 지역 변수와 전역 변수, 정적 변수 그리고 

입출력 함수인 printf, scanf를 배워 보겠습니다. 


1. 지역 변수 



지역 변수란 어떤 한정되 지역 에서만 사용할수 있는 변수를 말합니다. 

블럭 안에서 선언된 변수는 모두 지역 변수이고, 이때 이 블럭이라는 

한정된 지역에서만 이 변수를 사용할수 있습니다. 

그리고 지역 변수는 그 변수가 선언된 블럭이 끝나면 그 변수에 들어있는 값을 잃게 됨니다. 참고로 지역 변수를 선언할때는 블럭의 윗부분에 선언을 해야 합니다. 모든 작업 전에 선언해야 하죠. 그렇지 않으면 에러가 납니다. 예제 소스 하나를 보도록 하죠. /* 파일 이름 : C4-1.C 프로그램 내용 : 지역 변수를 설명하는 프로그램. */ void main() { int a; { int b; a=5; b=10; } a=10; } 이 소스는 지역 변수를 설명하기 위한 간단한 소스 입니다. 우선 a라는 변수는 main함수의 블럭 안에 있으므로 지역 변수가 됨니다. 그러므로 main함수의 블럭 안에서만 사용 가능하죠. 그리고 main함수 안에는 또 블럭이 있습니다. 그리고 그 블럭 안에는 변수 b가 선언 되어 있는데 이것두 블럭 안에 있으므로 지역 변수가 되죠 또한 이거 역시 그 블럭 안에서만 사용할수 있습니다. 그런데 그 블럭에서 변수 a에 5를 대입하고 있는데 a는 이 블럭 밖에 선언되어 있죠..? 이렇게 블럭 밖에 있는 변수에 대해서는 모두 사용이 가능합니다. 2. 전역 변수 전역 변수는 지역 변수와는 다르게 한정된 지역이 아닌 모든 지역에서 사용이 가능한 변수를 말하는 것 입니다. 블럭 밖에서 선언된 변수는 모두 전역 변수 이죠. 그리고 전역 변수는 프로그램이 끝날때까지 들어있는 값을 계속 유지합니다. 그럼 예제 소스를 /* 파일 이름 : C4-2.C 프로그램 내용 : 전역 변수를 설명하는 프로그램. */ int a; void func() { a=5; } void main() { func(); a=10; } 이 소스에서 모든 블럭 밖에 a라는 변수가 선언되어 있으므로 a는 전역 변수 입니다. 그러므로 어느 곳에서든지 사용이 가능하죠 소스에소 볼수 있는것 처럼 a라는 변수는 main함수와 func라는 함수에서 모두 사용할수 있습니다. 그러면 에제 하나를 더 볼까요? /* 파일 이름 : C4-3.C 프로그램 내용 : 전역 변수를 설명하는 프로그램. */ void func() { a=5; } int a; void main() { func(); a=10; } 이 소스는 위에 것과 똑같지만 전역 변수 선언을 func함수와 main함수 사이에 한 것 입니다. 전역 변수를 쓰려면 그 변수가 그것을 쓰는 부분의 위쪽에 선언되어 있어야 합니다. func함수 안에서 a를 사용하고 있는데 a는 그 아래에 선언되어 있죠? 이럴땐 func함수 위에 a라는 전역 변수가 있다는 것을 알려주면 됨니다. 방법은 간단한데 extern 데이터형 변수명; 이렇게 해 주면 됨니다. 아까 그 소스를 고쳐보면 /* 파일 이름 : C4-4.C 프로그램 내용 : 전역 변수를 설명하는 프로그램. */ extern int a; void func() { a=5; } int a; void main() { func(); a=10; } 이렇게 해 주면 간단히 해결 되죠 하지만 특별한 경우가 아니라면 a라는 변수 선언을 위에 해 주는 것이 좋겠죠? 3. 정적 변수 정적 변수에는 크게 두가지로 나눌수 있는데 정적 지역 변수와 정적 전역 변수 입니다. (1) 정적 지역 변수 지역변수를 배울때 지역변수는 그 변수가 선언된 블럭이 끝나면 그 변수안에 들어있는 값을 잃는다고 했습니다. 그런데 이걸 잃게 하지 않을때 쓰는 것이 정적 지역 변수 입니다. 정적 지역 변수는 지역 변수 선언 앞에 static키워드만 붙여 주면 됨니다. 예를 들어 static int a; 이런 식으로 이렇게 해주면 이 변수가 선언된 블럭이 끝나도 그 안에 들어있는 값을 잃지 않죠. /* 파일 이름 : C4-5.C 프로그램 내용 : 정적 지역 변수를 설명하는 프로그램. */ #include void func() { int a=0; a=a+1; printf("%d\n",a); } void main() { func(); func(); func(); } 이 프로그램의 실행 결과는 어떻게 될까요? C:\>C4-5.EXE 1 1 1 C:\> 이렇게 나옴니다. 왜 그런줄은 다 아실꺼에요. 그런데 여기서 func함수 내의 a변수를 정적 변수로 선언하면 /* 파일 이름 : C4-6.C 프로그램 내용 : 정적 지역 변수를 설명하는 프로그램. */ #include void func() { static int a=0; a=a+1; printf("%d\n",a); } void main() { func(); func(); func(); } 이렇게 그러면 결과는 어떻게 바꿜까요???? a라는 변수는 func함수가 끝나도 그 안의 값이 보관 되므로 C:\>C4-6.EXE 1 2 3 C:\> 이런 결과가 나오겠죠? 이제 정적 지역 변수에 대해서는 이해가 되셨죠?? (2) 정적 전역 변수 정적 전역 변수를 하기 전에 한가지 의문정이 생기실 겁니다. 변수는 프로그램이 끝날때까지 그 값이 유지되는데 정적 전역 변수라는게 왜 따로 있을까요??? 사실 정적 전역 변수와 정적 지역 변수의 의미는 크게 다름니다. static키워드를 붙여 전역 변수를 선언하면 즉 정적 전역 변수를 선언하면 외부 소스에서 이 변수를 엑세스 할수 없게 되죠 그게 정적 전역 변수의 주 목적 입니다. 그런데 외부 소스의 전역 변수 엑세스를 배우지 않았으므로 아직 이해가 되지 않으실 겁니다. 자세한건 나중에 배우기로 하고 넘어가죠. 이것으로 C언어의 데이터 부분은 마치도록 하죠. 다음 강좌때는 기타 입출력 함수들을 배우고, 연산자 공부에도 들어가도록 하죠.