[C/C++] 15. 함수(3)

찰규

·

2026년 8월 31일 (오늘)

앞서 함수 호출 원리와 스택 메모리의 동작 방식을 알아보았다. 이번 글에서는 반복문을 활용한 팩토리얼(Factorial) 알고리즘 구현을 통해 로직을 직접 짜보고, 중복 코드를 제거하기 위한 함수 모듈화(Modularization)의 필요성과 소프트웨어 설계 관점에서의 이점을 정리한다.

1. 팩토리얼(Factorial) 알고리즘 설계

팩토리얼(n!n!)은 11부터 특정 숫자 nn까지의 모든 자연수를 곱하는 연산이다. (예: 4!=1×2×3×4=244! = 1 \times 2 \times 3 \times 4 = 24)

이를 코드로 구현할 때 핵심은 초기값 설정반복문의 유연성이다.

  • 초기값: 곱셈 연산의 누적 결과를 담는 변수는 반드시 1로 초기화해야 한다. (0으로 초기화하면 어떤 수를 곱해도 결과가 0이 됨)

  • 반복문 활용: 반복 횟수(루프 인덱스)를 조작하여 매 단계마다 곱해질 숫자를 유연하게 생성한다.

#include <stdio.h>

int main() {
    int target = 4; // 4! 계산 목표
    int result = 1; // 곱셈 누적용 변수 (1로 초기화)

    for (int i = 0; i < target - 1; ++i) {
        result *= (i + 2); // 1에 2, 3, 4를 순차적으로 곱함
    }

    printf("%d! = %d\n", target, result); // 결과: 24
    return 0;
}

2. 코드 중복과 모듈화의 필요성

만약 프로그램의 여러 위치에서 4!4!, 7!7!, 10!10! 등 서로 다른 팩토리얼 계산이 반복적으로 필요하다면 어떻게 해야 할까?

  • 단순 복사-붙여넣기(Copy-Paste)의 문제점:

    • 동일한 반복문 코드가 여러 곳에 산재하여 전체 코드 길이가 불필요하게 늘어난다.

    • 계산 로직에 버그가 발생하거나 수정이 필요할 때 모든 복사본을 일일이 찾아 고쳐야 하므로 유지보수가 매우 어려워진다.

    • 협업 시 가독성을 심각하게 저하시킨다.

이러한 비효율을 해결하기 위해 독립적인 작업 단위를 별도의 함수로 분리(모듈화)해야 한다.

3. 팩토리얼 함수의 구현 및 호출

팩토리얼 계산 로직을 Factorial이라는 단일 함수로 캡슐화하면, 입력값(매개변수)에 따라 재사용 가능한 유연한 코드를 만들 수 있다.

#include <stdio.h>

// 팩토리얼 계산을 모듈화한 함수 정의
int Factorial(int _iNum) {
    int iValue = 1;

    for (int j = 0; j < _iNum - 1; ++j) {
        iValue *= (j + 2);
    }

    return iValue; // 계산된 결과값 반환
}

int main() {
    // 함수 호출을 통해 간결하게 다양한 값 산출
    int fact4 = Factorial(4);
    int fact7 = Factorial(7);
    int fact10 = Factorial(10);

    printf("4! = %d\n", fact4);
    printf("7! = %d\n", fact7);
    printf("10! = %d\n", fact10);

    return 0;
}

4. 함수 단위 설계(Bottom-Up)의 장점

프로그래밍에서 복잡한 시스템을 구축할 때 가장 중요한 것은 작은 단위부터 차근차근 쌓아 올리는 방식이다.

  • 가독성과 유지보수성 향상: 메인 로직 흐름이 단순해지며, 팩토리얼 계산 방식이 바뀌더라도 Factorial 함수 내부만 수정하면 호출부 전체에 즉시 반영된다.

  • 소프트웨어 모듈화: 기능을 최소 단위의 함수로 나누어 두면, 이후 더 복잡한 알고리즘(예: 순열, 조합 등)을 작성할 때 이미 검증된 작은 함수들을 레고 블록처럼 조합하여 쉽게 구현할 수 있다.

마무리하며

  • 곱셈 누적 로직 구현 시 변수의 초기값은 반드시 1로 설정해야 한다.

  • 반복되는 로직을 함수로 모듈화하면 코드의 재사용성을 극대화하고 유지보수 비용을 획기적으로 낮출 수 있다.

  • 견고한 프로그램을 만들기 위해서는 작은 단위의 기능을 수행하는 함수를 먼저 설계하고 조합해 나가는 개발 습관이 중요하다.