티스토리 뷰

반응형

 

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 변수는 성능 최적화 힌트용
  • 재귀함수는 자기 자신을 호출하며, 종료 조건 필수

연습 문제 ✍️

  1. 두 정수를 입력받아 더한 결과를 반환하는 함수 작성하기
  2. 전역변수와 지역변수의 차이를 보여주는 프로그램 작성하기
  3. static 변수를 이용하여 호출 횟수를 세는 함수 작성하기
  4. 재귀함수를 이용하여 피보나치 수열의 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 변수: 함수 호출 횟수 유지 가능
  • 재귀함수: 피보나치, 팩토리얼 등 “작게 나누는 문제”에 적합

 

반응형