6장. 함수
#include <stdio.h>
int main(void) {
int num;
printf(“Please enter an integer: ");
scanf("%d", &num);
if ( num < 0 )
printf("Is negative.\n");
printf("num = %d\n", num);
return 0;
}
■ 기본적인 함수의 개념에 대해 알아본다.
■ 함수를 정의할 때 필요한 함수의 리턴형, 함수의 이름, 함수의 매개 변수에 대해 알아본다.
■ 함수 호출시 주의 사항과 함수의 선언(또는 원형)에 대해 알아본다.
■ 지역 변수와 전역 변수에 대해 알아본다.
■ 함수의 인자 전달 방법에 대해 알아본다.
학습목표
함수의 기본
•함수의 정의
•함수의 호출
•함수의 선언
지역 변수와 전역 변수
•지역 변수
•전역 변수
•변수의 영역 규칙
함수의 인자 전달 방법
•값에 의한 전달
•포인터에 의한 전달
목차
지역 변수
함수 안에 선언된 변수
지역 변수가 선언된 함수 안에서만 사용될 수 있다.
전역 변수
함수 밖에 선언된 변수
여러 함수에서 사용될 수 있는 변수
지역 변수와 전역 변수
지역 변수(1/4)
함수 안에서 만들어지고, 함수 안에서만 사용되는 변수 지역 변수는 함수가 리턴할 때 항상 자동으로 없어진다.
변수는 함수의 시작 부분이나 블록의 시작 부분에서 선언할 수 있다.
지역 변수
지역 변수와 전역 변수
지역 변수(2/4)
지역 변수는 선언된 블록 안에서만 사용 가능하다.
지역 변수
지역 변수와 전역 변수
다른 함수에 선언된 변수의 사용
01: /* Ex06_07.c */
02: #include <stdio.h>
03: 04: void PrintCount(void);
05: 06: int main(void) 07: {
08: int count = 0;
09: 10: printf("main: count = %d\n", count);
11: 12: return 0;
13: }
14: 15: void PrintCount(void) 16: {
17: printf("PrintCount: count = %d\n", count);
지역 변수
지역 변수와 전역 변수
main 함수 안에서는 count 사용 가능
PrintCount 함수 안에서 count
지역 변수(3/4)
서로 다른 함수에서 같은 이름의 변수를 선언하면, 이름은 같지만 서로 다른 변수 가 된다.
지역 변수
지역 변수와 전역 변수
서로 다른 함수에서 같은 이름의 변수를 선언하는 경우
지역 변수
지역 변수와 전역 변수
01: /* Ex06_08.c */
02: #include <stdio.h>
03: 04: void PrintCount(void);
05: 06: int main(void) 07: {
08: int count = 0;
09: printf("main: count = %d\n", count);
10: 11: PrintCount( );
12: 13: return 0;
14: }
15: 16: void PrintCount(void) 17: {
18: int count = 100;
19: printf("PrintCount: count = %d\n", count);
main 함수 안에 지역 변수 count 선언
main 함수 안에 선언된 count 사용
PrintCount 함수 안에 지역 변수 count 선언
같은 함수를 여러 번 호출하는 경우
지역 변수
지역 변수와 전역 변수
01: /* Ex06_09.c */
02: #include <stdio.h>
03: 04: void TestLocal(void);
05: 06: int main(void) 07: {
08: TestLocal( );
09: TestLocal( );
10: 11: return 0;
12: }
13: 14: void TestLocal(void) 15: {
16: int num = 0;
17: 18: printf("num = %d\n", num++);
19: }
지역 변수 num은 함수가 호출될 때마다 새로 생성 같은 함수를 여러 번 호출
지역 변수(4/4)
함수의 매개변수도 지역 변수이다.
지역 변수는 따로 초기화하지 않으면 쓰레기 값을 갖는다.
지역 변수
지역 변수와 전역 변수
전역 변수(1/2)
프로그램 전체에서 사용될 수 있는 변수
프로그램이 시작될 때 한 번만 생성 되고, 프로그램이 수행되는 동안 여 러 함수에서 사용되다가, 프로그램 이 종료될 때 비로소 해제된다.
전역 변수
지역 변수와 전역 변수
전역 변수의 선언 및 사용(1/2)
전역 변수
지역 변수와 전역 변수
01: /* Ex06_11.c */
02: #include <stdio.h>
03: 04: void PrintCount(void);
05: void Increment(void);
06: void Decrement(void);
07: 08: int count;
09: 10: int main(void) 11: {
12: count = 0;
13: 14: PrintCount( );
15: Increment( );
16: Increment( );
17: PrintCount( );
전역 변수 num의 선언
전역 변수 num의 사용
함수 사이에 선언된 전역 변수(2/2)
전역 변수
지역 변수와 전역 변수
19: Decrement( );
20: PrintCount( );
21: 22: return 0;
23: }
24: 25: void PrintCount(void) 26: {
27: printf("count = %d\n", count);
28: }
29: 30: void Increment(void) 31: {
32: count++;
33: }
34: 35: void Decrement(void) 36: {
37: count--;
전역 변수 num의 사용
전역 변수 num의 사용
전역 변수 num의 사용
전역 변수(2/2)
전역 변수의 선언문 다음에 정의된 함수에서만 전역 변수를 사용할 수 있다.
전역 변수의 선언문은 소스 파일의 시작 부분에 넣어주는 것이 좋다.
전역 변수는 따로 초기화하지 않으 면 자동으로 0으로 초기화된다.
전역 변수
지역 변수와 전역 변수
함수 사이에 선언된 전역 변수(1/2)
전역 변수
지역 변수와 전역 변수
01: /* Ex06_12.c */
02: #include <stdio.h>
03: 04: void PrintCount(void);
05: void Increment(void);
06: void Decrement(void);
07: 08: int main(void) 09: {
10: count = 0;
11: 12: Increment( );
13: PrintCount( );
14: 15: return 0;
16: }
17: 18: int count;
19:
선언 전에 전역 변수 count를 사용했으므로 컴파일 에러
전역 변수 count의 선언
10번째 줄에서 컴파 일 에러가 발생하므 로 실행할 수 없다!
함수 사이에 선언된 전역 변수(2/2)
전역 변수
지역 변수와 전역 변수
20: void PrintCount(void) 21: {
22: printf("count = %d\n", count);
23: }
24: 25: void Increment(void) 26: {
27: count++;
28: }
29: 30: void Decrement(void) 31: {
32: count--;
33: }
전역 변수 num의 사용
전역 변수 num의 사용
전역 변수 num의 사용
변수의 영역 규칙(1/2)
블록 범위가 달라질 때는 같은 이름의 변수를 여러 번 선언할 수 있다.
항상 가까운 블록 안에 선언된 변수 이름이 우선적으로 사용된다.
변수의 영역 규칙
지역 변수와 전역 변수
변수의 영역 규칙(2/2)
전역 변수와 지역 변수의 이름이 같아지는 것 을 막기 위해서 전역 변수 이름에는 g_를 접두 사로 붙인다.
변수의 영역 규칙
지역 변수와 전역 변수
변수의 영역 규칙(1/2)
변수의 영역 규칙
지역 변수와 전역 변수
01: /* Ex06_13.c */
02: #include <stdio.h>
03: 04: void Test(void);
05: int num = 10;
06: 07: int main(void) 08: {
09: int num = 20;
10: 11: while( 1 ) 12: {
13: int num = 30;
14: 15: printf("num = %d\n", num++);
16: 17: if(num > 25) 18: break;
19: }
전역 변수 num의 선언
지역 변수 num의 선언
지역 변수 num의 선언
while 안에 선언된 지역 변수 num 사용
변수의 영역 규칙(2/2)
변수의 영역 규칙
지역 변수와 전역 변수
20: printf("num = %d\n", num);
21: 22: Test( );
23: 24: return 0;
25: }
26: 27: void Test(void) 28: {
29: printf("num = %d\n", num);
30: }
main 안에 선언된 지역 변수 num 사용
전역 변수 num 사용
다음값을 예측하세요
#include <stdio.h>
int intcall(int x);
int main(void) {
int i;
i=10;
printf("함수 호출전 i=%d\n", i);
intcall(i);
printf("함수 호출후 i=%d\n", i);
return 0;
}
int intcall(int x) {
x++;
return x;
다음값을 확인하세요
#include <stdio.h>
int intcall(int x);
int main(void) {
int i;
i=10;
printf("함수 호출전 i=%d\n", i);
intcall(i);
printf("함수 호출후 i=%d\n", i);
return 0;
}
int intcall(int x) {
x++;
printf("x=%d\n", x);
값에 의한 전달 방법
포인터에 의한 전달 방법
함수의 인자 전달 방법
값에 의한 전달 방법
함수를 호출할 때 넘겨주는 인자의 값 을 함수 정의에 있는 매개변수로 복사 해서 전달하는 방식
복사에 의한 전달
함수 안에서 매개변수의 값을 변경해 도 함수를 호출한 곳에 있는 인자의 값은 바뀌지 않는다.
값에 의한 전달
함수의 인자 전달 방법
Swap 함수의 예(1/2)
값에 의한 전달
함수의 인자 전달 방법
Swap 함수의 선언
Swap 함수의 호출 01: /* Ex06_14.c */
02: #include <stdio.h>
03: 04: void Swap(int x, int y);
05: 06: int main(void) 07: {
08: int a = 10;
09: int b = 20;
10: 11: printf("Swap 전의 a = %d, b = %d\n", a, b);
12: 13: Swap(a, b);
14: 15: printf("Swap 후의 a = %d, b = %d\n", a, b);
16: 17: return 0;
18: } 19:
Swap 함수의 예(2/2)
값에 의한 전달
함수의 인자 전달 방법
20: void Swap(int x, int y) 21: {
22: int temp;
23: 24: temp = x;
25: x = y;
26: y = temp;
27: }
Swap 함수의 정의
두 변수의 값이 맞 교환되지 않았다.
Swap 함수의 수행 과정(1/2)
값에 의한 전달
함수의 인자 전달 방법
Swap 함수의 수행 과정(1/2)
값에 의한 전달
함수의 인자 전달 방법
매개변수로 함수의 처리 결과를 받아오는 경우
값에 의한 전달
함수의 인자 전달 방법
01: /* Ex06_15.c */
02: #include <stdio.h>
03: 04: void GetSumProduct(int a, int b, int sum, int product);
05: 06: int main(void) 07: {
08: int sum = 0, product = 0;
09: 10: GetSumProduct(10, 20, sum, product);
11: 12: printf("sum = %d, product = %d\n", sum, product);
13: 14: return 0;
15: }
16: 17: void GetSumProduct(int a, int b, int sum, int product) 18: {
19: sum = a + b;
20: product = a * b;
결과를 받아올 변수의 선언 함수 호출
매개변수에 결과 저장
합과 곱이 구해 지지 않았다!
포인터에 의한 전달 방법
변수의 값을 전달하는 대신 변수의 주소를 전달하는 방식
포인터에 의한 전달
함수의 인자 전달 방법
함수의 기본
함수의 정의 : 함수의 리턴형, 함수의 이름, 함수의 매개변수를 써준 다음 { } 안에 실제 로 함수가 처리할 내용을 기술한다.
함수의 호출 : 함수의 이름 다음에 ( )안에 인자를 써준다.
함수의 선언 : 함수 호출에 필요한 리턴형, 함수의 이름, 매개변수 정보를 미리 알려주 는 문장이다.
학습정리
지역 변수와 전역 변수
지역 변수 : 함수 안에서 선언되고, 함수 안에서만 사용된다.
따로 초기화하지 않으면 쓰레기 값을 갖는다.
전역 변수 : 함수 밖에서 선언되고, 프로그램 전체에서 사용된다.
따로 초기화하지 않아도 0으로 초기화된다.
영역 규칙 : 가장 가까운 블록에 선언된 변수가 항상 우선적으로 사용된다.
함수의 인자 전달 방법
값에 의한 전달 : 인자의 값을 매개변수에 복사해서 전달한다.
함수 안에서 매개변수의 값을 변경해도 함수를 호출한 곳에 있는 인자의 값은 바뀌지 않는다.
포인터에 의한 전달 : 함수의 인자로 변수의 주소를 전달한다.
학습정리
6장. 함수
NEXT Chapter 7장. 배열과 문자열
수고하셨습니다.
질문 있습니까?
다음 값을 구하세요.
#include <stdio.h>
void f(void);
int x;
int main(void) {
f();
f();
f();
return 0;
}
void f(void) {
int y=0;
x++;
y++;
1. 연도를 입력받아서 윤년인지 여부를 판단하는 IsLeaYear함수를 정의하시오.
IsLeaYear함수는 윤년이면 1을, 그렇지않으면 0을 리턴해야 한다. (윤년 : 4 로 나누어 떨어지는 해는 윤년입니다. 4로 나누어 떨어지는 연도중에서 100으로 나누어 떨어진 연도는 윤년이 아닙니다. 400으로 나누어 떨어지는 연도는 윤년입 니다.)
2. 정수값을 인자로 받아서 소수인지 판단하는 IsPrime함수를 정의하고 IsPrime함수 를 이용하여 1부터 100사이의 소수를 모두 구해서 출력하는 프로그램을 작성하시 오.
3. 실수를 인자로 받아서 정수부만 리턴하는 GetIntegral함수와 소수부만을 리턴하 는 GetFractional함수를 각각정의하시오.
4. 반지름을 인자로 받아서 원의 면적을 구하는 GetArea함수와 원의 둘레를 구하는 GetPerimeter함수를 정의하시오. (단, pi=3.142592)
//6-1
#include <stdio.h>
int IsLeapYear(int year);
int main(void) {
int num;
printf("연도를입력하세요: ");
scanf("%d", &num);
if( IsLeapYear(num) )
printf("%d년은 윤년입니다.\n", num);
else
printf("%d년은 윤년이아닙니다.\n", num);
return 0;
int IsLeapYear(int year) {
return (((year%4==0) && (year%100!=0))
|| (year%400==0)) ? 1 : 0;
}
//6-2
#include <stdio.h>
#include <math.h>
int IsPrime(int num);
int main(void) {
int i, cnt;
for( i = 2, cnt = 0 ; i <= 100 ; i++ ) {
if( IsPrime(i) ) {
printf("%3d ", i);
cnt++; //5개씩 표기 위한 수 if( cnt % 5 == 0 )//5개씩 표기
printf("\n"); //5개씩 표기 후 줄바꿈 }
}
printf("\n");
return 0;
}
int IsPrime(int num) {
int i, result=1;
for(i=2; i<=num/2; i++) {
if(num%i==0) {
result=0;
break;
} }
if(result)
return result;
return 0;
}
int GetIntegral(double num) {
return (int) num;
}
double GetFractional(double num) {
return num - (int) num;
} //6-3
#include <stdio.h>
int GetIntegral(double num);
double GetFractional(double num);
int main(void) {
double x;
printf("실수를입력하세요: ");
scanf("%lf", &x);
printf("%lf의정수부는%d입니다.\n", x, GetIntegral(x));
printf("%lf의소수부는%lf입니다.\n", x, GetFractional(x));
return 0;
}
//6-4
#include <stdio.h>
const double pi = 3.142592;
double GetArea(double radius);
double GetPerimeter(double radius);
int main(void) {
double radius;
double area;
double perimeter;
printf("반지름을입력하세요: ");
scanf("%lf", &radius);
area = GetArea(radius);
printf("반지름이%lf인원의면적: %lf\n", radius, area);
perimeter = GetPerimeter(radius);
printf("반지름이%lf인원의둘레: %lf\n", radius, perimeter);
return 0;
}
double GetArea(double radius) {
return pi * radius * radius;
}
double GetPerimeter(double radius) {
return 2 * pi * radius;
}