-
함수
- 프로그램에서 원하는 특정한 작업을 수행하도록 설계된 독립된 프로그램 단위
- 필요한 입력을 받아 원하는 어떤 기능을 수행한 후 결과를 반환(return)하느 프로그램 단위
- 라이브러리 함수(library function)와 사용자 정의 함수(user defined function)로 구분
- 라이브러리 함수 : 이미 개발환경에 포함되어 있는 함수
- 사용자 정의 함수 : 필요에 의해서 개발자가 직접 개발하는 함수
- C 프로그램
- 여러 함수로 구성되는 프로그램
- 최소한 main() 함수와 필요한 다른 함수로 구성되는 프로그램
- 함수 main() : 이름이 지정된 함수로서 프로그램의 실행이 시작되는 특수한 함수
- C 프로그램 main() 함수
- 첫 줄에서 시작하여 마지막 줄을 마지막으로 실행한 후 종료
- 사용자가 직접 개발한 함수를 사용하기 위해서는 함수선언(function declaration), 함수호출(function call), 함수 정의(function definition)가 필요하다.
- 하나의 응용 프로그램은 하나의 main() 함수와 여러 개의 다른 함수로 구성
- 필요에 따라 여러 소스 파일로 나누어 프로그래밍 가능
절차적 프로그래밍
- 하나의 프로그램을 여러 함수로 나누어 프로그래밍
- 문제 분해(problem decomposition) : 하나의 프로그램을 작은 단위의 여러 함수로 나누는 것, 문제 해결의 한 방법
- 절차적 프로그래밍(procedural programming) 방식
- 함수 중심의 프로그래밍 방식
- 모듈화 프로그램(modular program) 또는 구조화된 프로그램(structured program)
- 적절한 함수로 잘 구성된 프로그램
함수 정의
- 함수머리(function header)와 함수몸체(function body)로 구성
- 함수머리(function header)
- 반환형과 함수이름, 매개변수 목록으로 구성
- 반환형 : 함수 결과값의 자료형
- 함수 이름 : 식별자의 생성규칙을 따름.
- 매개변수 목록 : 자료형 변수이름의 쌍으로 필요한 수만큼 콤마로 구분하여 기술
- 함수몸체(function body)
- {···}와 같이 중괄호로 시작하여 중괄호로 종료
- 함수가 수행해야 할 문장들로 구성
- 마지막은 대부분 결과값을 반환하는 return 문장으로 종료
- 결과값이 없다면 생략 가능
반환형 함수이름 (매개변수 목록) # 함수머리 { ··· # 함수몸체 여러 문장들; return (반환연산식); }
- 이름 add2로 두 정수의 합을 구하는 함수를 정의
- 함수머리는 int add2(int a, int b)로 쓸 수 있으며, 함수몸체는 { int sum = a + b; return (sum); }으로 구현할 수 있다.
- 함수이름에 이어 나오는 (int a, int b)를 매개변수(parameter variable)라 한다.
- 매개변수가 정수이므로 반환형은 int로 하고, 함수이름은 add2, 매개변수 목록은 2개이므로 int a, int b로 구성한다.
- 함수몸체에서는 매개변수 이름이 a, b이므로 이들의 합을 구하여 반환한다. 간단히 return (a+b);의 한문장으로 가능하다.
int add2(int a, int b) { int sum = a + b; return (sum); } int add2(int a, int b) { return (a + b); }
int findMax(int a, int b) { int max = a > b ? a : b; return max; }
반환형과 return
- return : 함수에서 반환값을 전달하는 목적과 함께 함수의 작업 종료를 알리는 문장
- 함수가 반환값이 없다면 반환형으로 void를 기술
return (반환연산식); return 0; return (a + b); return 2 * PI * r; return ;
함수원형 (function prototype)
- 함수를 선언하는 문장
- 함수원형은 함수선언으로 변수선언과 같이 정의된 함수를 호출하기 전에 반드시 선언
- 구문 : 함수머리에 세미콜론을 넣은 문장
- 함수원형 구문에서 매개변수의 변수이름은 생략할 수 있다.
- int add2(int, int);
반환형 함수이름 (매개변수 목록); int add(int a, int b); int add(int, int); int findMin(int x, int y); int findMin(int, int);
함수의 정의와 호출
#include <stdio.h> # int add(int a, int b); int main(void) { int a = 3, b = 5; int add(int a, int b); # int add(int, int)도 가능 # 위 함수원형이 없으면 함수 호출에서 경고 발생 int sum = add(a, b); printf("합: %d\n", sum); return 0; } # 함수 add의 함수 구현 또는 함수 정의 부분 int add(int a, int b) { int sum = a + b; return (sum); // 괄호 생략 가능 } # 위 main() 함수에서 호출이 없으므로 이 함수 구현은 실행되지 않음 int findMin(int x, int y) { int min = x < y ? x : y; return (min); }
합: 8
매개변수
- 함수 매개변수 (parameter)
- 함수를 호출하는 부분에서 함수몸체로 값을 전달할 목적으로 이용
- 함수정의에서 매개변수는 자료형과 변수명의 목록으로 나타내며 필요 없으면 키워드 void를 기술
- 반환값
- 함수를 호출하는 부분에서 함수가 작업을 수행한 후, 다시 함수를 호출한 영역으로 보내는 결과값
형식매개변수와 실매개변수
- 형식매개변수(formal parameters)
- 함수 정의에서 기술되는 매개변수 목록의 변수
- 함수 내부에서만 사용될 수 있는 변수
- 실매개변수(real parameters)와 실인자
- 함수를 호출할 때 기술되는 변수 또는 값
- 실인자(real argument) 또는 인자(argument)라고 부름
- 실인자는 상수와 변수, 함수호출, 그리고 수식도 가능
- 일반적으로 매개변수, 인자, 인수 구분하지 않고 사용하는 경우도 많음
- 값에 의한 호출(call by value)
- 함수가 호출되는 경우 실인자의 값이 형식인자의 변수에 각각 복사된 후 함수가 실행된다.
- 함수에서 일반 매개변수의 값을 수정하더라도 함수를 호출한 곳에서의 실매개변수의 값은 변화되지 않는 특징
- 형식인자 a, b와는 전혀 다른 변수
int findMax(int a, int b) # (형식매개변수) { int max = a > b ? a : b; return max; } int main(void){ int a = 3, b = 5; int max = findMax(a, b); # (실매개변수) int max = findMax(); # 오류발생 int max = findMax(2); # 오류발생 int max = findMax(2.4); # 오류발생 int max = findMax(2.4, 6.8); # 오류발생 }
매개변수로 배열 사용
- 배열이름으로 전달
- 함수의 매개변수로 배열을 전달하면 한 번에 여러 개의 변수를 전달하는 효과
- 함수 sum() : 실수형 배열의 모든 원소의 합을 구하여 반환하는 함수
- 형식매개변수는 실수형 배열 double ary[]와 배열크기 int n
- 첫 번째 형식매개변수에서 배열 자체에 배열크기를 기술하는 것은 아무 의미가 없다. 그러므로 double ary[5] 보다는 double ary[]라고 기술하는 것을 권장
- 실제로 함수 내부에서 실인자로 전달되는 배열크기를 알 수 없으므로 배열크기를 두 번째 인자로 사용한다.
# 둘 다 사용 가능 double sum(double ary[], int n); double sum(double[], int); ··· double data[] = {2.3, 3.4, 4.5, 5.6, 6.7} ··· ...sum(data, 5) # 함수 호출 시 배열이름으로 배열인자를 명시 double sum(double ary[], int n) { double total = 0.0; for (int i = 0; i < n; i++) total += ary[i]; return total; }
배열을 매개변수로 사용하는 방법
- 함수크기를 제외한 int ary[]로 기술
- 배열의 크기도 매개변수로 함께 전달
- 함수 이름인 point 또는 &point[0]을 사용
# 실매개변수인 point와 &point[0] 모두 형식매개변수인 int ary[]의 값이다. printf("함수 sumary() 호출로 구한 합은 %d\n", sumary(point, aryLength)); printf("함수 sumary() 호출로 구한 합은 %d\n", sumary(&point[0], aryLength)); # 배열의 크기는 의미가 없어 어떤 수를 써도 상관없으므로 생략하고 배열크기를 다른 인자로 사용 int sumary(int ary[], int SIZE) { ··· } int sumary(int ary[10], int SIZE) { ··· }
다차원 배열을 함수 인자로 이용하는 방법
- 함수원형과 함수정의의 헤더에서 첫 번째 대괄호 내부의 크기를 제외한 다른 모든 크기는 반드시 기술
'C' 카테고리의 다른 글
[C] 변수 유효범위① (0) 2023.04.26 [C] 재귀함수와 라이브러리 함수 (0) 2023.04.13 [C] 배열② (0) 2023.04.11 [C] 배열① (0) 2023.04.05 [C] 반복 (0) 2023.04.03