함수는 특정 기능을 제공하는 일련의 코드를 묶어서 이름을 붙인것이다. 종류에는 1.진입점 함수 2.라이브러리 함수 3.사용자 정의 함수가 있다.
1.진입점 함수는 프로그램이 시작될 때 운영체제에 의해 호출된다. ex) int main(void)
2.라이브러리 함수는 입출력과 같은 고유의 기능을 제공한다. 라이브러리 함수를 호출하려면 라이브러리 함수가 필요하다. 라이브러리가 제공하므로 만들 필요가 없고 사용만 하면 된다.
ex) #include <stdlib.h>
char ch;
printf("%c", ch);
scanf("%c", &ch);
3.사용자 정의 함수는 프로그래머가 직접 정의하는 함수이다.
1)리턴값과 매계변수가 없는 함수의 사용
#include <stdio.h>
void hi(void) // 리턴형과 매개변수가 없는 함수
{
printf("Hi! Let's enjoy C progrmaming.\n");
} // 함수의 끝을 만나면 리턴한다.
void bye() { printf ("Bye!\n"); } // 간단한 함수는 한줄로 작성할 수 있다.
int main(void)
{
hi();
bye();
hi();
bye();
return 0;
}
실행결과
Hi! Let's enjoy C programming
Bye!
Hi! Let's enjoy C programming
Bye!
함수는 특정 기능을 수행하는 코드를 한 번만 작성해두고, 필요할 때마다 불러쓰는(호출) 기능이다. 함수를 호출할 때는 함수 이름 다음에 ()를 쓰고, ()안에 함수의 인자를 쓴다.
ex) 함수이름(함수인자) 함수를 호출할 때 넘겨준 인자가 매개변수로 전달된다.
리턴값과 매개변수가 없는 함수에는
hi(); // 함수 이름 다음에 빈 괄호를 적어준다. ()가 없으면 함수 호출이 아니다.
2)지역 변수의 생성과 소멸과정
#include <stdio.h>
void dummy()
{
int y = 456; // 함수가 호출 될 때마다 매번 다시 생성된다.
printf("y = %d\n", y);
y--; // 감소된 y는 함수가 리턴할 때 소멸된다.
}
int main(void)
{
int i;
for (i = 0; i < 3; i++)
dummy();
for (i = 0; i < 3; i++)
{
int x = 123;
printf("x = %d\n", x);
x++;
}
return 0;
}
실행결과
y = 456
y = 456
y = 456
x = 123
x = 123
x = 123
함수안에 선언된 지역변수는 함수가 호출되는 횟수 만큼 생성되고 소멸된다. 마찬가지로 반복문안에 선언된 지역변수는 반복문이 호출되는 횟수 만큼 생성된고 소멸된다.
구분 | 지역변수 | 전역변수 |
선언 위치 | 함수나 블록 안 | 함수 밖 |
사용 범위 | 변수가 선언된 함수나 블록 안 | 소스파일 전체 |
생존 기간 | 변수가 선언된 블록에 들어갈 때 생성되고 블록을 빠져나갈 때 소멸 | 프로그램이 시작될때 때 생성되고 프로그램이 종료될 때 소멸 |
초기화 하지 않는 경우 | 쓰레기 값 | 0으로 초기화 |
3)[리턴값은 있고 매개변수는 없는 함수] 다음과 같이 메뉴를 출력하고 선택된 메뉴 항목의 번호를 리턴하는 choose_menu함수를 작성하시오. 만일 잘못된 번호를 선택하면 올바른 번호를 선택할 때까지 계속 메뉴를 출력하고 다시 선택 받아야한다. 즉, choose_menu 함수는 반드시 0~3 사이의 값을 리턴해야 한다. choose_munu의 리턴값에 따라 어떤 메뉴가 선택되었는지 간단히 출력하는 프로그램을 작성하시오.
#include <stdio.h>
int choose_menu(void)
{
int menu = 0;
do{
printf("[1.파일열기 2.파일저장 3.인쇄 0.종료] 선택?");
scanf("%d", &menu);
} while(menu < 0 || menu > 3);
return menu;
}
int main(void)
{
while(1)
{
int menu = choose_menu();
if(menu == 0)
break;
switch(menu)
{
case 1:
printf("파일 열기를 수행합니다.\n");
break;
case 2:
printf("파일 저장을 수행합니다.\n");
break;
case 3:
printf("파일 인쇄를 수행합니다.\n");
break;
}
}
return 0;
}
실행결과
[1.파일열기 2파일저장 3.인쇄 0.종료] 선택? 2
파일 저장을 수행합니다.
[1.파일열기 2파일저장 3.인쇄 0.종료] 선택? 5
[1.파일열기 2파일저장 3.인쇄 0.종료] 선택? 0
case뒤에 띄어쓰기를 하지 않으면 올바르게 실행값이 나오지 않으니 주의하자.
4)[표준C라이브러리 함수] 프로그램을 작성하다보면 0~(N-1)범위에 있는 정수를 생성해야 하는 경우가 자주 있다. 표준 C 라이브러리의 rand 함수를 이용해서 0에서 (N-1) 사이에 있는 정수를 리턴하는 random 함수를 정의하시오. random 함수를 이용해서 0~99범위에 있는 임의의 정수 10갸룰 생성하고 그 합계를 구하는 프로그램을 작성하시오.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int random(int range)
{
return rand() % range;
}
int main(void)
{
int sum = 0;
int i;
srand((unsigned int) time(0));
printf("0~99사이의 임의의 정수를 10개 생성해서 합계를 구합니다.\n");
for (i=0; i<10; i++)
{
int num = random(100);
printf("%4d", num);
sum += num;
}
printf("\n 합계: %d\n", sum);
return 0;
}
실행결과
0~99사이의 임의의 정수를 10개 생성해서 합계를 구합니다.
0 85 12 32 12 48 60 55 2 77
합계 : 383
stdlib.h 헤더파일은 주로 exit(), atoi(), rand(), srand(), system() 등의 함수가 쓰인다.
rand()는 난수를 생성하고, srand()는 난수의 시드를 생성하여 rand()가 매번 다른값이 나오도록 한다.