C : User Defined Functions

m_ngyeong·2024년 9월 25일
0

C

목록 보기
6/16
post-thumbnail

User Defined Functions(사용자 정의 함수)

사용자 정의 함수는 프로그래머가 직접 설계하여 특정 작업을 수행하도록 만든 함수이다. C 언어에서는 기본적인 함수나 수학 함수 외에도, 사용자가 필요에 따라 자신의 함수를 정의할 수 있다. 이렇게 정의한 함수는 프로그램의 재사용성, 가독성, 유지보수성을 높이는데 큰 역할을 한다.


💙 함수의 구성

반환형 함수이름(매개변수) {
    // 함수의 내용 (코드)
    return 반환값;
}
  • 반환형(Return Type): 함수가 호출된 후 반환할 값의 자료형을 지정.
    반환할 값이 없으면 void를 사용.
  • 함수 이름(Function Name): 함수를 호출할 때 사용할 이름.
    C 언어에서 변수 이름과 마찬가지로 의미 있는 이름을 사용하는 것이 좋음.
  • 매개변수(Parameters): 함수에 전달될 값을 지정.
    매개변수는 자료형과 변수명으로 구성되며, 여러 개의 매개변수가 있을 수 있음.
  • 함수의 내용(Body): 함수가 실행될 때 수행될 코드를 작성하는 부분.
  • 반환값(Return Value): 함수가 처리 후 결과값을 반환하는 부분.
    반환할 값이 없으면 return 문을 생략하거나 return;으로 종료할 수 있음.

사용자 정의 함수 'add()'를 만드는 예제:

#include <stdio.h>

// 두 정수의 합을 반환하는 함수
int add(int a, int b) {
    return a + b;  // a와 b의 합을 반환
}

int main() {
    int num1 = 10, num2 = 20;
    int sum = add(num1, num2);  // add 함수를 호출하고 결과를 sum에 저장

    printf("Sum: %d\n", sum);   // 합계 출력
    return 0;
}

함수 선언과 정의

함수는 선언(declaration)정의(definition)로 구분된다.

  • 함수 선언 : 함수가 어떤 반환형을 가지며, 어떤 매개변수를 받는지 미리 알려주는 역할을 함.
    함수 선언은 함수의 사용 전에 컴파일러에 알려줄 필요가 있을 때 사용.
int add(int a, int b);  // 함수 선언
  • 함수 정의 : 함수의 실제 내용을 구현한 부분.
    함수의 작업이 어떻게 이루어지는지 포함됨.
int add(int a, int b) {  // 함수 정의
    return a + b;
}

예제: 두 수의 최대 공약수를 구하는 함수

#include <stdio.h>

// 두 수의 최대 공약수를 구하는 함수
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

int main() {
    int num1 = 56, num2 = 98;
    int result = gcd(num1, num2);  // gcd 함수를 호출하여 최대 공약수를 구함

    printf("GCD of %d and %d is: %d\n", num1, num2, result);
    return 0;
}

C 언어에서 사용자 정의 함수를 선언과 동시에 정의할 수 있지만, 함수 선언과 정의를 분리해서 사용하는 것을 많이 선호한다. 이 방식은 특히 규모가 큰 프로그램이나 여러 파일로 구성된 프로젝트에서 더 중요하게 사용된다.
또한 함수를 선언만 하고 다른 파일에서 정의할 수도 있다. 이 경우, 선언은 헤더 파일에 작성하고, 정의는 소스파일에 작성하는 방식으로 프로그램을 모듈화할 수 있다.

반환형과 반환값

함수의 반환형은 함수가 반환하는 값의 자료형을 나타낸다. 함수는 작업을 완료한 후 하나의 값을 반환할 수 있으며, return 키워드를 사용하여 값을 반환한다.

  • 정수 반환:
int square(int n) {
    return n * n;
}
  • 실수 반환:
double circle_area(double radius) {
    return 3.14159 * radius * radius;
}
  • 반환값이 없는 함수(void) : 반환할 값이 없는 경우 함수의 반환형은 void로 지정.
void printMessage() {
    printf("Hello, world!\n");
}

매개변수와 인수

함수를 정의할 때, 매개변수(parameter)를 통해 외부에서 값을 전달받을 수 있다. 함수가 호출될 때 넘겨주는 실제 값은 인수(argument)라고 부르며, 매개변수와 인수는 1:1로 대응된다.

int multiply(int a, int b) {
    return a * b;
}

int main() {
    int result = multiply(3, 4);  // 3과 4를 인수로 전달
    printf("Result: %d\n", result);  // 결과 출력
    return 0;
}

⭐️ 함수 선언과 정의

C 언어에서 사용자 정의 함수를 선언과 동시에 정의할 수 있지만, 함수 선언과 정의를 분리해서 사용하는 것을 많이 선호한다.

함수 선언과 정의를 분리하는 이유:

⚫️ 코드 구조화와 가독성:

  • 함수 선언과 정의를 분리하면, 프로그램이 더 구조적으로 조직될 수 있음. 선언은 함수가 어떤 역할을 할지 미리 알려주고, 정의는 그 기능을 실제로 구현.
  • 여러 파일로 나누어진 대형 프로젝트에서는 함수 선언을 헤더 파일(.h)에 모아두고, 정의는 소스 파일(.c)에 두는 것이 일반적임. 이 방식은 프로그램 구조를 명확하게 만들어 유지보수와 협업을 용이하게 함.

⚫️ 다른 파일에서 함수 호출 가능:

  • 함수를 선언과 정의로 분리하면, 다른 소스 파일에서 그 함수를 미리 선언만 해두고 호출할 수 있음. 예를 들어, A라는 파일에 정의된 함수를 B라는 파일에서 사용하려면, A 파일에서 함수 선언을 헤더 파일에 두고 B 파일에서 그 헤더 파일을 #include로 포함하면 됨. 이처럼 헤더 파일을 통해 선언된 함수는 여러 소스 파일에서 정의를 공유할 수 있음.

⚫️ 코드 유지보수와 확장성:

  • 함수 선언과 정의를 분리하면, 코드의 유지보수가 쉬워짐. 함수의 선언부를 변경하지 않고, 정의부에서만 코드를 수정해도 됨.
  • 선언과 정의를 분리하면 한 함수의 변경이 다른 부분에 최소한의 영향을 미침. 예를 들어, 함수 정의가 바뀌더라도 호출부는 그대로 유지될 수 있음.

⚫️ 컴파일 최적화:

  • 함수 선언이 각 소스 파일에 미리 알려져 있으면, 컴파일러가 여러 파일을 병렬로 처리할 수 있어 컴파일 속도가 빨라짐. 컴파일러는 선언된 함수의 정보를 미리 알고 있어 정의된 부분을 나중에 처리할 수 있기 때문.

example:

1. 헤더 파일(myfunc.h) - 함수 선언

// myfunc.h
#ifndef MYFUNC_H
#define MYFUNC_H

int multiply(int a, int b); // 함수 선언

#endif

2. 소스 파일(myfunc.c) - 함수 정의

// myfunc.c
#include "myfunc.h"

int multiply(int a, int b) {
    return a * b;
}

3. 메인 프로그램(main.c) - 함수 호출

// main.c
#include <stdio.h>
#include "myfunc.h"  // 함수 선언을 포함

int main() {
     int result = multiply(6, 7);  // 함수 호출
    printf("Result: %d\n", result);
    return 0;
}

이 예제에서 함수 선언은 myfunc.h 파일에 위치하고, 함수 정의는 myfunc.c 파일에 있다. 그리고 main.c 파일에서 myfunc.h#include하여 multiply 함수를 호출할 수 있다.

함수 선언과 정의를 동시에 사용하는 경우 :

물론, 작은 프로그램이나 단순한 작업을 할 때는 함수 선언과 정의를 동시에 사용할 수 있다. 예를 들어, 하나의 파일에 모든 코드를 작성할 때는 함수 선언 없이 바로 정의할 수 있다.

#include <stdio.h>

int add(int a, int b) {  // 선언과 정의를 동시에
    return a + b;
}

int main() {
    int result = add(3, 4);
    printf("Sum: %d\n", result);
    return 0;
}

이 경우, 코드가 단일 파일로 작성되기 때문에 선언 없이 바로 정의만 해도 충분히 동작한다. 그러나 프로그램 규모가 커지고 여러 파일로 나뉘면, 선언과 정의를 분리하는 것이 더 효율적이다.



profile
사용자 경험 향상과 지속적인 성장을 추구하는 프론트엔드 개발자 ʚȉɞ

0개의 댓글