티스토리 뷰
반응형
C언어 기초 Chapter 09: 함수의 정의, 호출, 변수의 범위와 수명
09-1. 함수를 정의하고 선언하기
함수란?
- 특정 기능을 수행하는 코드 묶음
- 재사용 가능, 코드 가독성 향상, 유지보수 편리
기본 구조
반환형 함수이름(매개변수목록) {
실행문;
return 값;
}
예제:
#include <stdio.h>
int add(int a, int b) { // 함수 정의
return a + b;
}
int main(void) {
int result = add(3, 5); // 함수 호출
printf("3 + 5 = %d\n", result);
return 0;
}
함수 선언(프로토타입)
- 함수 정의보다 먼저 호출하려면 선언 필요
int add(int a, int b); // 함수 선언(프로토타입)
int main(void) {
printf("%d\n", add(2, 4));
return 0;
}
int add(int a, int b) { return a + b; } // 함수 정의
09-2. 변수의 존재기간과 접근범위 1: 지역변수
지역변수(local variable)
- 함수 안에서 선언
- 함수 실행 시 생성, 종료 시 소멸
- 같은 이름이라도 함수마다 별개
예제:
#include <stdio.h>
void func() {
int x = 10; // 지역변수
printf("x = %d\n", x);
}
int main(void) {
func();
// printf("%d", x); // 오류! main에서는 x 접근 불가
return 0;
}
09-3. 변수의 존재기간과 접근범위 2: 전역변수, static 변수, register 변수
전역변수(global variable)
- 함수 밖에서 선언 → 프로그램 전체에서 접근 가능
- 장점: 어디서든 접근 가능
- 단점: 남용 시 디버깅 어려움, 유지보수 악화
#include <stdio.h>
int g = 100; // 전역변수
void print() { printf("%d\n", g); }
int main(void) {
g = 200;
print(); // 200 출력
return 0;
}
static 변수
- 정적 지역변수: 함수 내에서 선언되지만 프로그램 종료 시까지 값 유지
#include <stdio.h>
void counter() {
static int cnt = 0;
cnt++;
printf("cnt = %d\n", cnt);
}
int main(void) {
counter(); // 1
counter(); // 2
counter(); // 3
return 0;
}
👉 호출이 끝나도 값이 유지되는 특징!
register 변수
- CPU 레지스터에 저장 요청(컴파일러가 보장하지 않을 수도 있음)
- 매우 빠른 접근 필요할 때 사용
#include <stdio.h>
int main(void) {
register int i;
for (i = 0; i < 5; i++) {
printf("%d ", i);
}
return 0;
}
09-4. 재귀함수에 대한 이해
재귀함수란?
- 자기 자신을 호출하는 함수
- 문제를 작게 쪼개서 해결할 때 유용
예제: 팩토리얼
#include <stdio.h>
int factorial(int n) {
if (n == 1) return 1;
return n * factorial(n - 1);
}
int main(void) {
printf("5! = %d\n", factorial(5));
return 0;
}
👉 출력: 120
재귀 함수 주의점
- 반드시 종료 조건이 있어야 함
- 종료 조건 없으면 → 무한 호출 → 스택 오버플로우
핵심 정리 ✅
- 함수는 정의 → 호출 → 반환 흐름
- 지역변수는 함수 내부에서만, 전역변수는 모든 함수에서 접근 가능
- static 변수는 프로그램 종료까지 값 유지
- register 변수는 성능 최적화 힌트용
- 재귀함수는 자기 자신을 호출하며, 종료 조건 필수
연습 문제 ✍️
- 두 정수를 입력받아 더한 결과를 반환하는 함수 작성하기
- 전역변수와 지역변수의 차이를 보여주는 프로그램 작성하기
- static 변수를 이용하여 호출 횟수를 세는 함수 작성하기
- 재귀함수를 이용하여 피보나치 수열의 n번째 항 구하기
👉 연습문제 정답은? ▼
Chapter 09 연습문제 풀이
1) 두 정수를 입력받아 더한 결과를 반환하는 함수 작성하기
#include <stdio.h>
int add(int a, int b) { // 함수 정의
return a + b;
}
int main(void) {
int x, y;
printf("두 정수를 입력하세요: ");
scanf("%d %d", &x, &y);
printf("합 = %d\n", add(x, y));
return 0;
}
2) 전역변수와 지역변수의 차이를 보여주는 프로그램 작성하기
#include <stdio.h>
int g = 100; // 전역변수
void test() {
int g = 50; // 지역변수 (이 블록 안에서는 전역변수 g를 가림)
printf("test 함수 내부 g = %d\n", g);
}
int main(void) {
printf("main 함수에서의 전역 g = %d\n", g);
test();
printf("main 함수에서의 전역 g = %d\n", g);
return 0;
}
👉 출력 예시
main 함수에서의 전역 g = 100
test 함수 내부 g = 50
main 함수에서의 전역 g = 100
3) static 변수를 이용하여 호출 횟수를 세는 함수 작성하기
#include <stdio.h>
void counter() {
static int cnt = 0; // 호출 횟수를 유지
cnt++;
printf("함수가 %d번 호출되었습니다.\n", cnt);
}
int main(void) {
for (int i = 0; i < 5; i++) {
counter();
}
return 0;
}
👉 출력 예시
함수가 1번 호출되었습니다.
함수가 2번 호출되었습니다.
함수가 3번 호출되었습니다.
함수가 4번 호출되었습니다.
함수가 5번 호출되었습니다.
4) 재귀함수를 이용하여 피보나치 수열의 n번째 항 구하기
#include <stdio.h>
int fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
int main(void) {
int n;
printf("n번째 피보나치 수를 구합니다. n 입력: ");
scanf("%d", &n);
printf("%d번째 피보나치 수 = %d\n", n, fibonacci(n));
return 0;
}
👉 입력: 10
👉 출력: 10번째 피보나치 수 = 55
핵심 정리 ✅
- add 함수: 입력값 받아 합 반환
- 전역/지역 변수: 범위와 생존 기간 다름
- static 변수: 함수 호출 횟수 유지 가능
- 재귀함수: 피보나치, 팩토리얼 등 “작게 나누는 문제”에 적합
반응형
'[문법] C언어' 카테고리의 다른 글
8) C언어 포인터와 배열 완전정리: 관계, 연산, 문자열, 포인터 배열 (2) | 2025.09.01 |
---|---|
7) C언어의 1차원 배열과 포인터에 대해 알아보자 (2) | 2025.09.01 |
5) C언어 조건문 완전정리: if / switch / break / continue (0) | 2025.08.31 |
4) C언어 반복문 완전정리: while, do~while, for 한눈에 배우기 (4) | 2025.08.31 |
3) C언어 입출력 완전정복: printf와 scanf 쉽게 배우기 (4) | 2025.08.31 |