C프로그래밍 6강 - 함수와 기억 클래스(1)
함수가 프로그램을 의미 있는 작업 단위로 나누는 방식을 이해하고 표준함수와 사용자 정의 함수를 구별한다. 함수의 헤더와 몸체, 매개변수, 반환값, 호출과 복귀, 함수 원형의 역할을 코드와 함께 학습한다.
1. 함수의 개념과 호출 흐름
함수(function)는 특정 작업을 수행하도록 설계한 독립적인 코드 블록이다. 같은 계산이 여러 곳에서 반복된다면 그 코드를 함수로 만들고 필요한 위치에서 호출하여 중복을 줄일 수 있다.
int minimum(int v1, int v2, int v3)
{
int min = v1 < v2 ? v1 : v2;
return min < v3 ? min : v3;
}
minimum(a, b, c)처럼 함수를 호출하면 매개변수를 통해 인수가 전달되고 제어가 호출된 함수로 이동한다. 함수는 정의된 작업을 수행한 뒤 호출한 위치로 복귀하며 필요하면 결과값을 반환한다. 함수 안에서 다른 함수를 호출하는 중첩 호출도 가능하다.
C 프로그램은 함수를 기본 단위로 구성한다. 함수 호출은 인수 전달 → 피호출 함수 실행 → 결과 반환 → 호출 위치로 복귀의 흐름으로 이해해야 한다.
2. 함수의 장단점과 유형
함수 사용의 장점과 단점
| 구분 | 내용 |
|---|---|
| 장점 | 크고 복잡한 프로그램을 작고 의미 있는 작업 단위로 분할할 수 있다. |
| 장점 | 프로그램이 간결하고 이해하기 쉬워지며 유지 관리가 편리하다. |
| 장점 | 반복 코드의 중복을 줄이고 잘 설계한 함수를 다른 응용에서 재사용할 수 있다. |
| 단점 | 함수 호출과 복귀 과정에 부대비용이 추가된다. |
표준함수와 사용자 정의 함수
표준함수는 C 언어의 표준 라이브러리가 제공하는 함수이다. 입출력, 파일, 문자열, 메모리, 수학, 문자 판별과 변환, 난수, 정렬과 검색 등에 사용할 수 있다. 사용자 정의 함수는 프로그래머가 필요에 따라 특정 기능을 수행하도록 직접 정의한 함수이다.
3. 표준함수와 헤더 파일
표준함수는 프로그램 작성에 필요한 기본 기능을 표준 라이브러리 형태로 제공한다. 각 함수의 원형(prototype)은 기능별 헤더 파일에 선언되어 있으므로 함수를 사용하기 전에 해당 헤더 파일을 #include로 포함해야 한다.
| 헤더 파일 | 기능 | 함수 예 |
|---|---|---|
stdio.h | 입출력·파일 처리 | printf, scanf, getchar, fopen, fclose |
string.h | 문자열 처리 | strcat, strcmp, strcpy, strlen |
math.h | 수학 계산 | sqrt, sin, cos, log, fabs |
ctype.h | 문자 판별·변환 | isalpha, isdigit, islower, tolower, toupper |
stdlib.h | 수치 변환·난수·정렬·검색 등 | atoi, strtol, rand, srand, qsort, bsearch |
함수 원형은 함수 이름, 매개변수, 반환 자료형 등 컴파일러가 함수를 올바르게 호출하는 데 필요한 정보를 제공한다.
4. 표준함수 활용 예
수학 함수와 유틸리티 함수
abs(-5)는 절댓값 5를 반환한다. ceil(12.34)는 13, floor(12.34)는 12를 만들며, pow(4, 2)는 16, sqrt(2)는 약 1.414214를 반환한다. cos(10)과 exp(2)도 math.h의 수학 함수이다.
강의 예제에서는 ceil, floor, pow가 반환한 값을 int형으로 명시적 변환하여 저장하고, abs를 위해 stdlib.h, 나머지 수학 함수를 위해 math.h를 포함한다.
문자열 길이와 문자 판별
strlen(s)로 문자열 길이를 구해 각 문자를 순회하고, isalpha(s[i])로 알파벳인지, isdigit(s[i])로 숫자인지 판별할 수 있다. 입력 KNOU1234567890-#*?$에서는 알파벳 4개, 숫자 10개, 기타 문자 5개로 분류된다.
5. 사용자 정의 함수의 구조
함수 헤더
반환자료형 함수명(매개변수리스트)
{
지역변수 선언;
처리 문장;
return 반환식;
}
함수 헤더에는 반환 자료형, 함수명, 매개변수 리스트를 차례로 작성한다. 함수명은 C의 명칭 규칙을 따르며 역할을 드러내는 의미 있는 이름을 정하는 것이 좋다.
매개변수는 피호출 함수에 자료를 전달하기 위해 헤더에 선언한 변수이며 함수 안에서 지역변수처럼 사용한다. 여러 매개변수는 콤마로 나열한다. 매개변수가 없으면 괄호를 비워 두거나 void로 표시한다.
반환 자료형은 함수가 돌려줄 결과값의 자료형이다. 반환값이 없는 함수는 void로 선언한다. C99 이후에는 반환 자료형을 생략할 수 없다.
함수 몸체
함수 몸체는 중괄호 블록 안에 지역변수 선언과 작업 문장을 작성한 부분이다. return은 함수 실행을 끝내고 호출한 곳으로 복귀하게 하며, void가 아닌 함수에서는 반환 자료형에 맞는 식을 함께 반환한다.
6. 함수 호출과 매개변수
함수는 이름과 인수를 제공하여 호출한다. c = sum(x, y);에서 x와 y는 호출문에 쓰인 실 매개변수이고, int sum(int a, int b)의 a와 b는 피호출 함수 헤더에 선언된 형식 매개변수이다.
| 구분 | 위치 | 역할 |
|---|---|---|
| 실 매개변수 | 함수를 호출하는 문장 | 피호출 함수에 전달할 실제 값 또는 식 |
| 형식 매개변수 | 피호출 함수의 헤더 | 전달받은 값을 함수 안에서 지역변수처럼 사용 |
실 매개변수와 형식 매개변수는 자료형과 개수가 맞아야 한다. 자료형이 다르면 가능한 경우 묵시적 형변환을 하지만, 개수가 맞지 않으면 에러를 유발한다.
실 매개변수는 호출하는 쪽의 인수이고 형식 매개변수는 정의된 함수가 값을 받아들이는 변수이다. 둘의 순서와 개수를 대응시켜야 한다.
7. 함수 종료와 반환값
함수는 마지막 문장을 실행하거나 return 문을 실행하면 종료된다. return expr;은 함수를 끝내고 제어와 수행 결과를 호출 함수로 넘긴다. 반환식은 헤더의 반환 자료형과 일치하거나 그 자료형으로 묵시적 변환할 수 있어야 한다.
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;
}
max(10, 20)은 20을, min(10, 20)은 10을 반환한다. void형 함수는 반환할 결과식이 없으므로 값을 동반하지 않는 return만 사용할 수 있다.
8. 함수의 선언 순서와 원형
C의 모든 명칭은 사용하기 전에 선언해야 한다. 피호출 함수가 호출 위치보다 앞에 정의되어 있으면 그 정의가 선언 역할도 하므로 바로 호출할 수 있다. 반대로 함수가 호출 위치 뒤에 정의되었거나 다른 파일에 있다면 호출에 필요한 정보를 미리 알려야 한다.
#include <stdio.h>
int sum(int, int); /* 함수 원형 */
int main()
{
int c = sum(10, 20);
}
int sum(int a, int b)
{
return a + b;
}
함수 원형은 반환형, 함수명, 전달할 매개변수의 자료형과 개수를 알린다. 원형의 매개변수 이름은 중요하지 않으므로 int sum(int u, int v);, int sum(int, int);처럼 작성해도 같은 정보를 제공한다.
함수 원형 뒤에는 세미콜론을 붙인다. 함수 정의의 헤더 뒤에는 세미콜론을 붙이지 않고 곧바로 몸체 블록을 작성한다.
핵심 개념 정리
- 함수는 특정 작업을 수행하는 독립적인 코드 블록이며 호출 후 작업을 마치면 호출 위치로 복귀한다.
- 함수는 복잡한 프로그램을 분할하고 코드 중복을 줄이며 재사용성과 유지 관리성을 높인다.
- C 함수는 표준 라이브러리의 표준함수와 프로그래머가 작성하는 사용자 정의 함수로 나뉜다.
- 표준함수를 사용하려면 그 원형이 선언된 헤더 파일을 포함해야 한다.
- 함수 헤더는 반환 자료형, 함수명, 매개변수 리스트로 구성되고 몸체는 지역변수와 처리 문장을 담는다.
- 실 매개변수는 호출문에, 형식 매개변수는 피호출 함수 헤더에 있으며 개수와 자료형이 대응해야 한다.
- return은 함수를 종료하고 호출 위치로 복귀시키며 필요하면 결과값을 전달한다.
- 호출보다 뒤에 정의된 함수는 사용 전에 함수 원형으로 호출 정보를 선언해야 한다.
최종 정리: 함수 호출을 정확히 이해하려면 호출 위치의 실 매개변수, 함수 헤더의 형식 매개변수와 반환형, 몸체의 return, 그리고 원형의 선언 정보를 하나의 흐름으로 연결해야 한다.
예상문제 20선
1. 함수의 의미로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
함수는 특정 기능을 독립적인 작업 단위로 구성한 코드 블록이다.
2. 함수 사용의 단점으로 강의에서 제시한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
함수는 많은 장점이 있지만 호출하고 복귀하는 과정에 추가 비용이 생긴다.
3. 다음 중 사용자 정의 함수에 대한 설명은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
사용자 정의 함수는 프로그래머가 필요한 기능을 직접 구현한 함수이다.
4. 문자열 길이를 구하는 strlen의 원형이 선언된 헤더는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④strlen, strcpy, strcmp 등 문자열 함수는 string.h에 선언된다.
5. sqrt, sin, cos가 선언된 헤더는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
제곱근과 삼각함수 등 수학 표준함수의 원형은 math.h에 있다.
6. 문자가 알파벳인지 판별하는 표준함수는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②isalpha는 ctype.h에 선언된 문자 형태 판별 함수이다.
7. ceil(12.34)의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
강의 예에서 ceil은 12.34보다 작지 않은 정수값 13을 반환한다.
8. 사용자 정의 함수의 헤더에 포함되지 않는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
함수 헤더는 반환 자료형, 함수명, 매개변수 리스트로 구성된다.
9. 반환할 값이 없는 함수의 반환 자료형은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
처리 결과로 돌려줄 값이 없으면 함수의 반환 자료형을 void로 선언한다.
10. c = sum(x, y);에서 x와 y는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
호출문에서 함수에 전달하는 x와 y는 실 매개변수이다.
11. int sum(int a, int b)에서 a와 b는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
피호출 함수의 헤더에 선언되어 인수를 받는 변수는 형식 매개변수이다.
12. 실 매개변수와 형식 매개변수의 개수가 맞지 않으면?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
매개변수 개수는 일치해야 하며 자료형 차이는 가능한 경우 묵시적으로 변환된다.
13. return 문의 역할로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
return은 함수 실행을 종료하고 호출 위치로 복귀하며 반환식을 전달할 수 있다.
14. max(10, 20)이 두 값 중 큰 값을 반환한다면 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
강의의 max 함수는 두 인수 중 큰 값인 20을 반환한다.
15. 함수 원형이 필요한 경우로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
호출 시점에 정의를 볼 수 없으면 원형으로 반환형과 매개변수 정보를 미리 제공해야 한다.
16. 올바른 함수 원형은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
원형에는 반환형, 이름, 매개변수 자료형을 쓰고 끝에 세미콜론을 붙인다.
17. 함수 원형의 매개변수 이름에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
원형은 매개변수 자료형과 개수가 핵심이므로 이름을 다르게 쓰거나 생략할 수 있다.
18. C99 이후 함수의 반환 자료형에 대한 설명은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
함수 헤더에서 반환 자료형을 명시해야 하며 값이 없을 때는 void를 쓴다.
19. 함수 몸체에서 선언한 변수의 성격은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
함수 몸체의 블록 안에서 선언한 변수와 형식 매개변수는 그 함수의 지역변수처럼 사용된다.
20. 표준함수를 쓰기 전에 해야 할 일은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
컴파일러가 호출 정보를 알 수 있도록 해당 표준함수의 원형이 있는 헤더를 include해야 한다.
댓글
댓글 쓰기