프로그래밍 언어/C언어

C언어 기초이론 (함수)

chobyeonggyu03 2024. 6. 13. 14:16

함수란?

function이란 뜻으로 특정 기능을 수행하는 코드들의 집합

**함수를 만드는 이유**

1) 하나의 main함수에서 모든 것을 관리하지않고 기능별로 세분화하는것이 코드가 복잡해지는 것을 막고 효율적인 유지 및 보수를 가능하게 하기 때문임

2) 반복적인 프로그래밍을 피할 수 있게 해주기 때문임 (코드의 재사용성을 높임)

3) 기능별로 함수를 선언해놓으면 가독성이 좋아짐

4) 절차지향적인 코딩을 객체 지향적인 코딩으로 바꿔줌

**함수의 형태**

int main (int num1) {

( 1.반환형태 ) ( 2.함수이름 ) ( 3.입력형태 )

(함수의 몸체)

 

(4.return result;)

}

1) 반환형 : 마지막 값을 반환시킬 때의 출력형태

2) 함수의 이름 : 함수를 호출할 때 쓰일 이름을 선언해줌

3) 매개변수 : 함수선언시 초기에 입력받는 값을 저장할 변수들을 선언함

(전달인자는 여러개 세팅가능함)

4) 값의 반환 : 함수의 최종적인 출력값을 세팅해주는 것 (함수의 반환값은 1개임)

/*
제목: 함수 예제 9-3
날짜: 2024.01.31.
내용: 함수의 기본 사용 및 이해
*/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 팩토리얼을 계산하는 함수 (재귀적사용, 반환값있음)
int factorial(int num) {
    if (num <= 1)
        return 1;
    else
        return num * factorial(num - 1);
}

// 문자열을 출력하는 함수 (인자 없음, 반환값 없음)
void ShowMessage(void) {
    printf("문자열 출력하는 함수 'ShowMessage' 호출.\n");
}

// 랜덤 수를 반환하는 함수 (인자 없음, 반환값 있음)
int RandomNum(void) {
    return rand() % 100;  // 0에서 99까지의 난수 반환
}

int main() {
    int result;  // 결과 저장 변수
    ShowMessage();  // 문자열 출력 함수 호출

    int num = 6;  // 팩토리얼 계산할 숫자 설정
    result = factorial(num);  // 팩토리얼 함수 호출
    printf("팩토리얼 결과: %d\n", result);

    result = RandomNum();  // 랜덤 수 생성 함수 호출
    printf("랜덤 수 결과: %d\n", result);

    return 0;
}

 

 

 

 


**함수 특징**

-함수는 입력값과 그에 따른 출력값이 존재하기에 입력형태와 출력형태를 둘 다 지정해줘야하는게 기본이지만, 입력값(전달인자)이나 출력값(반환값)이 없거나 둘 중 한개만 있을 수도 있음

-함수를 호출하여 (전달인자를 입력하면) 바로 함수에 대한 호출값으로 대체 되기 때문에 함수를 함수(전달인자) = 함수의 호출값으로 생각할 수 있음

-한번 정의된 함수는 몇번이고 반복하여 호출할 수 있음

-전달인자에 (void)라고 설정한 함수에는 실제로 함수 호출시 전달인자를 입력하면 안됨

-main함수에서 함수를 호출하기 위해서 함수가 이미 선언되어 있어야하기 때문에 main함수보다 위에서 함수를 선언해둬야함

(그렇지 않으면 선언되지않은 변수처럼 에러가 발생하게 됨)

-main 함수위에 함수 전체를 놓게되어 가독성이 떨어지게 되면

int Increment(int n); 과 같은 형태로 함수를 선언만 해놓고 main함수 아래에 다시 함수정의를 선언해두는 것도 가능함

 

/*
제목: 함수 예제 9-4
날짜: 2024.01.31.
내용: 두 수의 최대 공약수 및 최소 공배수 구하기 - 두 수의 비교와 수학적 함수의 적용
*/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 최대 공약수를 구하는 함수
int AbsGcd(int num1, int num2) {
    if (num2 == 0) return num1;
    else return AbsGcd(num2, num1 % num2);  // 유클리드 호제법을 사용
}

// 최소 공배수를 구하는 함수
int AbsLcm(int num1, int num2) {
    return (num1 * num2) / AbsGcd(num1, num2);  // 최소 공배수는 두 수의 곱을 최대 공약수로 나눈 값
}

int main() {
    int num1, num2;
    printf("두 수의 최대 공약수와 최소 공배수를 구합니다: ");
    scanf("%d %d", &num1, &num2);

    printf("최대 공약수: %d\n", AbsGcd(num1, num2));
    printf("최소 공배수: %d\n", AbsLcm(num1, num2));

    return 0;
}

 

 

 

** 알아두면만한기한 학사전 **

-printf함수도 사실 반환값이 존재한다 (출력시키는 문자열의 길이를 반환함)

/*
제목: 함수 예제 9-1
날짜: 2024.02.25.
내용: printf문의 결과값 반환 이해하기
*/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int num1, num2;

    // printf 함수는 출력한 문자의 수를 반환
    num1 = printf("12345 \n");
    num2 = printf("I love my home \n");

    printf("%d %d ", num1, num2);

    return 0;
}