C언어 함수
반응형

C언어 함수 정의

함수는 목적에 맞게 특정 기능을 하는 코드 블록입니다.  예를 들어 똑같은 코드를 반복적으로 작성하는 경우가 생깁니다. 이런 경우 반복적인 코드를 함수로 만들어 필요한 곳에 해당 함수를 호출하는 것이 더욱 효율적입니다. 이렇게 작성된 함수를 사용자 정의 함수(User-defined Functions)라고 합니다.

C의 함수는 종류에 따라 다음과 같이 나뉠 수 있습니다.

라이브러리 함수 (Library functions)

C에서 이미 정의된 함수들입니다. 예) printf(), scanf(), strcat() 등등
이러한 함수들을 사용하기 위해선 #include와 함께 적절한 헤더 파일만 정의하면 됩니다.

사용자 정의 함수 (User-defined functions)

필요에 의해 작성된 함수입니다. 반복적인 코드를 피함으로써 시간 및 공간을 절약할 수 있고 버그 예방에도 좋습니다.

함수사용의 이점

  • 작은 단위의 함수들을 사용함으로써 전체 프로그램의 모듈화를 제공합니다.
  • 필요한 곳에 호출하여 작성된 코드의 재사용률을 높일 수 있습니다.
  • 긴 코드의 디버깅 및 수정을 쉽게 합니다.
  • 프로그램을 더 읽기 쉽고 이해하기 쉽게 만듭니다.

함수 선언

리턴타입 함수명(타입1 파라미터1, 타입2 파라미터2,...); 

함수도 사용되기 전 미리 선언해야 합니다. 선언으로 컴파일러에 함수 이름, 파라미터 정보 그리고 러턴 타입들의 정보를 미리 알려줍니다. 이렇게 함수의 바디(Body) 없이 형태만 선언하는 것을 함수 원형(Function Prototyping) 라고 합니다.

리턴 타입 (Return type)

작성한 함수가 어떠한 계산과 동작 후에 함수 호출 부에 값을 돌려줘야 할 때 리턴 되는 값에 따라 리턴 타입이 결정됩니다. 예를 들어 함수의 제일 마지막의 리턴문(Return)의 리턴 값이 int이면 함수의 리턴 타입은 int입니다. 만약 함수가 동작만 수행하고 리턴 값이 없으면 리턴 타입은 void입니다.

함수명 (Function Name)

함수명은 식별자이면서 함수를 나타내는 이름입니다. 또한, 함수명의 작성은 식별자 작성 규칙과 같습니다. 식별자 작성 규칙 글을 참고하세요.

파라미터 (Parameters)

파리미터는 함수에서 필요한 값들을 함수 호출부에서 넘겨받은 값들입니다.

#include<stdio.h>

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

int main() 
{
    int i, j, result;
    printf("곱할 두개의 수를 입력해주세요...");
    scanf("%d%d", &i, &j);
    
    result = multiply(i, j); // 함수 호출
    printf("The result of muliplication is: %d", result);
    
    return 0;
}

// 함수 정의
int multiply(int a, int b)
{
    return (a*b); // 파리미터로 받은 두 개의 값을 곱해 리턴
}

함수의 원형 선언 후 실질적인 코딩은 정의 부분에서 구현하였습니다. 함수명은 함수의 기능을 잘 나타내는 곱한다는 뜻인 multiply라고 했고 리턴 타입은 함수 내부를 보시면 int 두 개값을 곱한 값을 리턴하기 때문에 int 입니다. 또한 함수에 필요한 값들을 함수 호출 부에서 받기 위해 두 개의 int인 두 개의 파라미터를 사용했습니다.

함수 정의

리턴타입 함수명(타입1 파라미터1, 타입 파라미터,...)
{
    // 함수 소스 코드 구현 부분 혹은 함수 바디(body)
}

함수의 정의에서 "리턴타입 함수명(타입1 파라미터1, 타입 파라미터,…)"을 함수 헤더(Function Header)라 하고 함수 소스 코드 구현 부분을 함수의 바디(body)라고 합니다. 주의할점은 함수의 선언에서 함수 원형은 세미콜론(;)을 포함하지만, 함수 헤더에는 없습니다.

함수 바디 (Function Body)

실질적인 기능 구현부분 입니다. 일반적인 C 프로그래밍과 다를 게 없이 목적에 맞게 코드를 작성하면 됩니다.
필요에 따라 로컬 변수를 선언하거나 또 다른 사용자 정의 함수를 호출할 수 있습니다.

함수 호출

함수가 호출되는 시점에 실행의 순서는 호출된 함수로 옮겨 갑니다.

함수명(아규먼트1, 아규먼트2,...);

제일 위의 예제에서 main() 함수 내의 multiply(i, j);가 함수 호출 부분입니다.

함수 리턴 값

함수는 리턴값이 있을 수도 없을 수도 있습니다. 만약 리턴 값이 있다면 함수 바디의 가장 마지막에 리턴 값과 함께 리턴문(return)을 작성해야 합니다. 리턴문은 원래 함수 실행을 끝내는 명령어이기도 하므로 함수의 가장 마지막에 작성돼야 합니다. 리턴문후에 작성된 코드는 당연히 실행이 안 됩니다.

리턴값의 데이터 타입은 선언과 정의에서 정의된 리턴타입과 같아야 합니다. 만약 다르면 컴파일 에러가 발생합니다.

파라미터(Parameters) 아규먼트(Arguments) 차이

차이점은 함수가 불리는 위치에 따라 달리 불립니다. 값을 넘겨주는 곳에서는 아규먼트(Arguments)라하고 값을 받는 곳에서는 파라미터(Parameters)라 불립니다.

함수의 파라미터와 리턴은 있을 수도 있고 없을 수도 있습니다. 파라미터가 필요없는 함수는 파리미터 항목없이 사용하면 되고 리턴이 없으면은 리턴 타입이 void입니다.

함수가 선언될 때 int a, int b 두 개의 파라미터를 같이 선언했기 때문에 함수 호출 부에서 두 개의 값을 함수에 전달해야 합니다. 그렇지 않으면 컴파일 에러가 발생합니다. 또한 함수 정의부의 함수 헤더에서 두 개의 값을 받기 때문에 선언부와 같은 타입인 두 개의 파라미터를 정의해야 합니다.

이렇게 전달받은 값을 형식 인자(Formal parameters)라고도 불립니다. 마지막으로  아규먼트, 파라미터 부분에 사용된 변수명들은 위와 같이 각기 달라도 상관없습니다.

<< 다음 혼자 공부하는 C언어 이전 >>
반응형