산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C 함수 마스터: 선언, 정의, 호출, 인자 전달(값/참조), 재귀

함수는 코드를 재사용 가능한 단위로 캡슐화합니다. C에서 함수의 구조, 선언/정의 분리, 매개변수 전달 방식, 재귀 호출까지 체계적으로 정리합니다.

함수 구조

반환타입 함수이름(매개변수목록) {
    // 함수 본문
    변수 선언;
    문장들;
    return 표현식;  // void가 아닐 때 필수
}

구성 요소

함수 선언 (프로토타입) vs 정의

예제

// max.h (헤더)
#ifndef MAX_H
#define MAX_H
int max(int a, int b);  // 선언
#endif

// max.c (구현)
#include "max.h"
int max(int a, int b) {  // 정의
    return (a > b) ? a : b;
}

// main.c (사용)
#include <stdio.h>
#include "max.h"
int main() {
    printf("%d\n", max(10, 20));  // 20
}

함수 호출 메커니즘

  1. 인자 평가 (순서 불명확, C 표준상 unspecified)

  2. 스택 프레임 생성: 반환 주소, 지역 변수, 매개변수 저장

  3. 제어권 이동 (칼리 호출)

  4. 함수 실행

  5. return 또는 본문 끝 도달 시 반환값 설정 후 스택 프레임 해제

  6. 호출자 복귀, 반환값 수신

인자 전달 방식

Call by Value (값 전달) - C 기본

void swap_val(int a, int b) {
    int tmp = a; a = b; b = tmp;  // 지역 복사본만 변경
}

int main() {
    int x = 10, y = 20;
    swap_val(x, y);
    printf("%d %d\n", x, y);  // 10 20 (변화 없음)
}

Call by Reference (참조 전달) - 포인터로 시뮬레이션

void swap_ref(int *a, int *b) {
    int tmp = *a; *a = *b; *b = tmp;  // 원본 수정
}

int main() {
    int x = 10, y = 20;
    swap_ref(&x, &y);  // 주소 전달
    printf("%d %d\n", x, y);  // 20 10 (교환됨)
}

배열은 암묵적 참조 전달

void modify(int arr[], int n) {  // 실제로는 int *arr
    arr[0] = 999;  // 원본 배열 변경됨
}
// 호출: modify(arr, size);

재귀 함수 (Recursive Function)

예제: 팩토리얼, 피보나치

// 팩토리얼
unsigned long long factorial(int n) {
    if (n <= 1) return 1;  // 기저 조건
    return n * factorial(n - 1);
}

// 피보나치 (비효율적: 지수 시간)
unsigned long long fib(int n) {
    if (n <= 1) return n;
    return fib(n-1) + fib(n-2);
}

// 꼬리 재귀 (컴파일러 최적화 시 스택 상수)
unsigned long long fib_tail(int n, unsigned long long a, unsigned long long b) {
    if (n == 0) return a;
    return fib_tail(n-1, b, a+b);
}
// 호출: fib_tail(n, 0, 1);

함수 포인터

// 함수 포인터 타입 정의
typedef int (*BinaryOp)(int, int);

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

int calculate(int a, int b, BinaryOp op) {
    return op(a, b);
}

int main() {
    printf("%d\n", calculate(3, 4, add));  // 7
    printf("%d\n", calculate(3, 4, mul));  // 12
}

인라인 함수 (C99)

// 헤더 파일에 정의 (inline + static 또는 extern inline 패턴)
static inline int square(int x) {
    return x * x;
}

가변 인자 함수 (<stdarg.h>)

#include <stdarg.h>
#include <stdio.h>

void print_numbers(int count, ...) {
    va_list args;
    va_start(args, count);
    for (int i = 0; i < count; i++) {
        printf("%d ", va_arg(args, int));
    }
    va_end(args);
    printf("\n");
}
// 호출: print_numbers(3, 10, 20, 30);

모범 사례

C 언어

  1. C 사용자 정의 함수 4가지 검증된 패턴
  2. C 언어에서 1차원 및 2차원 배열을 함수에 전달하는 방법 – 실전 가이드
  3. C 표준 라이브러리 함수 마스터하기: 실전 가이드
  4. 파이썬 람다 함수 마스터하기: 실용 예제 & 모범 사례
  5. Verilog 함수 마스터하기: 효율적인 RTL 설계를 위한 활용법
  6. C 비트필드로 메모리 최적화: 플래그 압축과 하드웨어 매핑
  7. C 파일 입출력 완벽 가이드: 열기, 읽기, 쓰기, 위치 제어, 바이너리 처리
  8. C 언어 가변 인자 마스터하기: 실전 가이드
  9. C++ 다형성 이해하기: virtual 함수와 순수 가상 함수
  10. MATLAB 함수 완전 정복: 정의, 워크스페이스, 입출력, 익명/중첩/비공개 함수
구분선언 (Prototype)정의 (Definition)
목적컴파일러에 인터페이스 알림실제 구현 제공
위치헤더 파일(.h) 또는 파일 상단.c 파일
세미콜론필요 ;불필요 (블록으로 끝)
매개변수 이름생략 가능 (int max(int, int);)필수
빈도여러 파일에서 포함 가능전체 프로그램에 한 번만