1.함수의 개념
함수란 특정 작업을 수행하도록 설계된 독립적인 프로그램
c프로그램은 함수들로 구성
- 모듈로 분류
- 실행순서에 따라 그 함수들을 차례로 호출하여 실행
함수의 특성
-서로 자유롭게 호출 가능
- 모든 함수는 서로 독립적
함수의 장점
- 수정 용이
- 재사용으로 코드 중복 최소화
- 유지관리 쉽다
함수의 개념
단위 프로그램을 하나의 함수에 기술한 경우
-길어짐, 가독성 문제, 수정 어려움, 일부분만 재호출 어려움
기능별 독립된 단위로 구성하여야 효율적
-필요할 때마다 불러 사용할 수 있다.
2. 표준 함수
c언어에서의 함수
표준함수 c언어 자체에서 제공하는 함수
-표준함수의 원형은 헤더파일에 정의
-표준함수의 실체는 라이브러리 파일에 수록
-표준함수를 사용하려면 원형이 선언되어 있는 헤더파일을 #include 시켜 주어야 한다.
표준함수의 원형 예
-printf(), scanf() 함수의 원형
int printf(const char *format, ...);
int scanf(const char *format, ...);
-헤더파일에 정의되어 있음 stdio.h
-표준함수 사용하려면 stdio.h를 #include
-sin(), cos()함수의 원형
double sin(double x);
double cos(double x);
-헤더파일 math.h 를 #include
/*표준함수의 사용 예 1*/
//삼각함수 사용을 위한 헤더파일 math.h를 선행처리 해야함
double x = 12.34;
int i = 5, j = 2;
int a, b, c;
a = ceil(x);
b = floor(x);
c = pow(4, j);
printf("abs(-5)=%d\n", abs(i)); // x의 절댓값
printf("ceil(12.34)=%d\n", a); // x이상의 최소 정숫값
printf("cos(10) = %f\n", cos(10));
printf("exp(2)=%f\n", exp(j)); // x의 지숫값
printf("floor(12.34)=%d\n", b); // x미만의 최대 정숫값
printf("sqrt(2)=%5f\n", sqrt(j));
printf("pow(4,2)=%d\n", c); // x의 y승 값
//예2: 문자형태 판별 함수<ctype.h>
int i, alp = 0, no = 0, et = 0;
char s[20];
printf("문자");
scanf("%s", s);
for (i = 0; i < strlen(s); i++) { // 문자열 길이를 구하는 함수
if (isalpha(s[i])) //영문자 여부를 구하는 함수
alp++;
else if (isdigit(s[i])) // 숫자 여부를 구하는 함수
no++;
else
et++;
}
printf("알파벳 = %d\n", alp);
printf("숫자 = %d\n,", no);
printf("기타 = %d\n", et);
3. 사용자 정의 함수
main()함수 안에 표준함수를 사용하는 형태
-단위프로그램으로 나누어 정의하여 나눌 필요가 있다.
사용자 정의함수
-사용자가 단위 프로그램을 함수로 정의하여 사용
//사용자정의함수 예: 메인함수 = 주 프로그램
void main() {
int sum(int a, int b);
int x, y, c;
scanf("%d %d", &x, &y);
c = sum(10, 20);
printf("%d", c);
}
//사용자 정의 함수 부분 (단위 프로그램의 분리로 가독성 높임)
int sum(int a, int b) {
int d;
d = a + b;
return(d);
}
함수 정의의 구조
반환자료형 함수형 (자료형 매개변수1, 자료형, 매개변수 2, ...){ 함수몸체 }
- 크게 함수헤더, 함수시작과 끝으로 구분된다
1)함수 헤더(반환자료형)
반환자료형 함수명 (자료형 매개변수1, 자료형 매개변수2, ...)
- 함수에서 계산된 결과값을 호출된 함수에 되돌려 줄 떄의 자료형
- 모든 자료형 가능
- 생략 가능하고 int형으로 간주
- 반환값이 없는 함수인 경우 void형으로 선언
함수명
-변수명을 정하는 큐칙과 동일한 방식으로 정한다
- 의미있는 함수명
자료형과 매개변수
-자료형은 매개변수의 자료형을 나타냄
-매개변수는 호출함수와 피호출 함수 사이에 자료를 주고받기 위해 사용
-변수 처럼 사용
-콤마로 구분
-매개변수 없으면 void형 사용
2) 함수 몸체
-함수가 하는 일을 정의
- 중괄호를 이용하여 시작과 끝을 나타냄
- c언어의 기본구조와 동일
main함수의 예
-반환자료형이 있는 경우 return값 명시
-반환자료형이 없으면 void 명시(생락시 ini로 처리)
- int d 함수 내에서 새로 사용되는 함수 선언
- return(d) 값을 되돌려 줄 때 사용
함수 사용 순서: 함수의 원형선언 - 함수의 호출 - 함수의 정의
함수의 원형 선언
- 함수는 변수와 같이 사용되기 전에 미리 선언
- 함수의 원형선언은 일반적으로 main()함수 이전에 한다.
- 원형선언은 함수정의 부분의 헤더부분에 세미콜론만 추가
원형선언 3가지 성질
- 함수의 반환형
- 매개변수의 개수
- 매개변수의 자료형
//함수 원형선언 예1 원형선언 필요한 경우
#include <stdio.h>
//함수의 원형 선언이 필요
int sum(int a, int b);
void main() {
printf("sum =%d", sum(10, 20));
}
// 피호출 함수가 main함수 뒤에 선언된 경우
int sum(int a, int b) {
return(a + b);
}
//예2 원형선언이 필요 없는 경우
// 피호출 함수가 main() 함수 이전에 선언된 경우로서 함수의 원형 선언이 필요 없다.
int sum(int a, int b) {
return(a + b);
}
void main() {
printf("sum = %d", sum(10, 20));
}
함수는 일종의 부 프로그램이므로 함수의 호출이 있어야 한다.
호출 방법은 매개변수와 나열
함수의 호출이 발생되면, 함수의 실행이 사용자정의 함수이 먼저 진행되고 복귀한다.
매개변수
-실매개변수: 함수를 호출하는 함수(호출함수)에 쓰이는 매개변수
-형식 매개변수: 호출당하는 함수(피 호출함수)에 쓰이는 매개변수
자료형과 변수의 개수가 일치해야한다.
매개변수의 예
void main() {
// 호출함수로서 a, b, c는 실매개변수
...
fcn1(a, b, c);
...
}
//피호출함수로서 x, y, z는 형식매개변수
fcn(intx, float y, double z) {
...
}
-자료형이 일치하지 않을 경우는 형 변환이 발생
-변수의 갯수가 일치하지 않을 경우 컴파일 에러 발생
결과값 반환(return문)
함수를 끝내고 제어와 함수 수행결과를 호출 함수로 넘긴다.
ex)
return 0; 상수 0 반환(정상적인 종료를 의미)
return 0; 상수 1 반환
return x; x값 반환
return (x + y * z) 수식의 결과 값 반환
return (sum(10, 20)); 다른 함수 호출
//return문의 사용 예
#include <stdio.h>
int max(int x, int y);
int min(int x, int y);
void main() {
int i = 10, j = 20;
printf("max(%d, %d) = %d\n", i, j, max(i, j));
printf("min(%d, %d) = %d\n", i, j, min(i, j));
}
int max(int x, int y) {
return(x > y ? x : y)
}
int min(int x, int y) {
if (x > y)
return y;
else
return x;
}
// 함수 여러 가지 사용 예
#include <stdio.h>
int sum(int, int);
test();
void main() {
int s;
test();
sum(10, 20);
s = sum(30, 40);
printf("sum from 30 to 40 = %d\n", s);
printf("sum from 100 to 200 = %d\n", sum(100, 200));
}
test() {
printf("함수의 여러 가지 사용 방법\n");
}
int sum(int a, int b) {
int i, s = 0;
for (i = a; i <= b; i++)
s = s + i;
return s;
}