목차
- 함수
- 재귀
C 함수
“입력 받아서 처리하고 결과를 돌려주는 코드 묶음”
함수의 기본 모양
반환형 함수이름(매개변수) {
실행할 코드
return 반환값;
}
예시:
int add(int a, int b) {
return a + b;
}
- int : 이 함수가 마지막에 int 값을 돌려준다는 뜻
- add : 함수 이름
- int a, int b : 함수가 받을 입력값
- return a + b : 결과를 호출한 곳으로 반환
호출 방법
int result = add(3, 5);
printf("%d", result); // 8
main → add(3, 5) 실행 → 8 반환 → result에 저장
함수 선언, 정의, 호출
함수가 main 위에 있느냐 아래에 있느냐
#include <stdio.h>
int add(int, int); // 1. 선언
int main() {
printf("%d", add(2, 3)); // 3. 호출
return 0;
}
int add(int a, int b) { // 2. 정의
return a + b;
}
- 선언: “이런 함수가 뒤에 있어요”라고 컴파일러에게 미리 알림
- 정의: 함수의 실제 내용 작성
- 호출: 함수를 실행
함수 정의가 main보다 위에 있으면 선언은 생략 가능
int add(int a, int b) {
return a + b;
}
int main() {
printf("%d", add(2, 3));
}
매개변수와 인자
int add(int a, int b) {
return a + b;
}
int main() {
add(10, 20);
}
| 위치 | 이름 | 값 |
| 함수 정의 쪽 | 매개변수(parameter) | a, b |
| 함수 호출 쪽 | 인자(argument) | 10, 20 |
add(10, 20)
호출 시 10은 a로, 20은 b로 복사돼 들어간다.
C는 기본적으로 값이 복사된다
void change(int x) {
x = 100;
}
int main() {
int n = 10;
change(n);
printf("%d", n);
}
정답: 10
change(n)을 하면 n의 값인 10만 x에게 복사
main의 n = 10
↓ 복사
change의 x = 10
함수 안에서 x를 100으로 바꿔도, 원래 n은 안 바뀜.
void change(int x) {
x = 100;
}
이건 사실상 함수 안의 별도 지역변수 x만 바꿈
원본 값을 바꾸려면 주소를 넘겨야 함.
void change(int *x) {
*x = 100;
}
int main() {
int n = 10;
change(&n);
printf("%d", n); // 100
}
change(&n)
→ n의 주소 전달
→ x가 n의 주소를 가리킴
→ *x = n
→ *x = 100은 n = 100
void 함수
반환값이 없으면 void를 사용해.
void printHello() {
printf("Hello");
}
int main() {
printHello();
}
void 함수에서는 보통 값을 반환 X
void printHello() {
return; // 가능: 함수 종료만 함
}
void printHello() {
return 10; // 오류
}
반대로 int 함수는 보통 int 값을 반환
int add(int a, int b) {
return a + b;
}
지역변수의 범위
함수 안에서 만든 변수는 그 함수 안에서만 유효
void func() {
int x = 10;
}
int main() {
printf("%d", x); // 오류
}
x는 func() 안에서만 존재하는 지역변수
그리고 같은 이름을 써도 서로 다른 변수일 수 있음.
int x = 1;
void func() {
int x = 10;
printf("%d ", x);
}
int main() {
func();
printf("%d", x);
}
정답: 10 1
재귀함수
기본 구조
int func(int n) {
if (종료 조건) {
return 값;
}
return func(더 작은 문제);
}
1. 종료 조건(base case)
2. 자기 자신을 다시 호출하는 부분(recursive case)
ㅈ종료 조건이 없으면 계속 자기 자신을 부르다가 프로그램이 터져.
가장 기본적인 재귀 예시
int sum(int n) {
if (n == 0) {
return 0;
}
return n + sum(n - 1);
}
sum(4)의 흐름:
sum(4)
= 4 + sum(3)
= 4 + 3 + sum(2)
= 4 + 3 + 2 + sum(1)
= 4 + 3 + 2 + 1 + sum(0)
= 4 + 3 + 2 + 1 + 0
= 10
호출 내려감:
sum(4) → sum(3) → sum(2) → sum(1) → sum(0)
반환 올라감:
0 → 1 → 3 → 6 → 10
팩토리얼
int fact(int n) {
if (n == 1) {
return 1;
}
return n * fact(n - 1);
}
fact(4)
= 4 * fact(3)
= 4 * 3 * fact(2)
= 4 * 3 * 2 * fact(1)
= 4 * 3 * 2 * 1
= 24
재귀에서 지역변수는 호출마다 따로 생긴다
void func(int n) {
int x = n;
printf("%d ", x);
if (n > 0) {
func(n - 1);
}
}
func(3)의 x = 3
func(2)의 x = 2
func(1)의 x = 1
func(0)의 x = 0
각 함수 호출은 서로 다른 공간에서 실행
func(3)
└─ func(2)
└─ func(1)
└─ func(0)
그래서 매개변수 n도 호출마다 따로 존재
재귀 문제에서 자주 터지는 함정
종료 조건이 없는 경우
int func(int n) {
return func(n - 1);
}
끝나는 시점이 없어서 무한 호출
값이 줄어들지 않는 경우
int func(int n) {
if (n == 0) {
return 0;
}
return func(n);
}
n이 계속 그대로라 종료 조건인 n == 0에 도달하지 못함.
n-- 함정
int func(int n) {
if (n == 0) {
return 0;
}
return func(n--);
}
이건 위험해.
n--은 현재 n 값을 먼저 넘긴 뒤 감소
즉 func(3)이면 재귀 호출에는 여전히 3이 들어간다는 의미
func(3)
→ func(3)
→ func(3)
→ ...
아래는 괜찮음
return func(n - 1);
또는
return func(--n);
연습문제
문제 1
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int x = 3;
int y = 5;
printf("%d", add(x, y));
return 0;
}
답 : 8
문제 2
#include <stdio.h>
void change(int x) {
x = x + 10;
}
int main() {
int n = 5;
change(n);
printf("%d", n);
return 0;
}
답 : 5 (함수 안에서 n이 x로 복사됨)
문제 3
#include <stdio.h>
int sum(int n) {
if (n == 0) {
return 0;
}
return n + sum(n - 1);
}
int main() {
printf("%d", sum(3));
return 0;
}
답 : 6
문제 4
#include <stdio.h>
int func(int n) {
if (n <= 1) {
return 1;
}
return func(n - 1) + func(n - 2);
}
int main() {
printf("%d", func(5));
return 0;
}
답 : 8
문제 5
#include <stdio.h>
void printNum(int n) {
if (n == 0) {
return;
}
printf("%d ", n);
printNum(n - 1);
printf("%d ", n);
}
int main() {
printNum(3);
return 0;
}
답 : 3 2 1 1 2 3
'정보처리기사' 카테고리의 다른 글
| [정처기] 03. C언어 배열, 포인터 +연습문제 (0) | 2026.06.27 |
|---|---|
| [정처기] 01-1. C언어 변수, 연산자, 출력 형식, 제어문 & 반복문 연습문제 (0) | 2026.06.26 |
| [정처기] 01. C언어 변수, 연산자, 출력 형식, 제어문 & 반복문 (0) | 2026.06.26 |
| 정처기 공부해라 (0) | 2026.06.24 |