C언어 void 함수 선언 - ceon-eo void hamsu seon-eon

hello 함수를 main 함수 아래에 작성하면 어떻게 될까요? 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

function_undefined_error.c

#include <stdio.h>

int main()
{
    hello();    // hello 함수를 찾을 수 없음. 컴파일 에러

    return 0;
}

void hello()    // 반환값이 없는 hello 함수 선언 및 정의
{
    printf("Hello, world!\n");    // Hello, world! 출력
}

컴파일 결과

function_undefined_error.c(5): warning C4013: 'hello'이(가) 정의되지 않았습니다. extern은 int형을 반환하는 것으로 간주합니다.
function_undefined_error.c(11): error C2371: 'hello' : 재정의. 기본 형식이 다릅니다.

hello 함수가 정의되지 않았다고 하면서 컴파일 경고와 에러가 발생합니다. 왜냐하면 C 언어 컴파일러는 위에서부터 아래로 소스 코드를 해석하는데 main 함수 부분에서는 hello 함수에 대한 정보가 없었기 때문입니다.

어떤 함수가 있다는 사실을 알려주려면 함수 선언(function declaration)을 해주어야 합니다. 함수 선언은 다음과 같이 반환값 자료형, 함수 이름, ( ) (괄호)순으로 적어주고 ; (세미콜론)을 붙입니다. 특히 여기서는 함수를 정의할 때와는 달리 { } (중괄호)를 사용하지 않습니다.

  • 반환값자료형 함수이름();

즉, 함수 형태만 선언하기에 이를 함수 원형(function prototype)이라 부릅니다.

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

function_prototype.c

#include <stdio.h>

void hello();    // 반환값이 없는 hello 함수 원형 선언

int main()
{
    hello();    // hello 함수 호출

    return 0;
}

void hello()    // 반환값이 없는 hello 함수 정의
{
    printf("Hello, world!\n");    // Hello, world! 출력
}

main 함수 위에서 void hello();와 같이 반환값 자료형, 함수 이름, ( )을 적어준 뒤 세미콜론을 붙이면 hello 함수가 있다는 것을 알려줄 수 있습니다.

함수 선언이 된 상태에서는 main 함수 아래에서 hello 함수를 정의해주면 됩니다. 단, 함수 선언만 있고 정의가 없다면 링크 에러가 발생합니다.

참고 | 함수 원형과 함수 본체

함수 선언과 정의가 분리된 상태에서는 함수 선언 부분을 함수 원형(function prototype), 함수 정의(function definition) 부분을 함수 헤더(function header)와 함수 본체(function body)라고 부릅니다.

함수 선언

함수 정의

void hello() // ← 함수 헤더
{
    printf("Hello, world!\n");
}
// ↑ 함수 본체

함수를 호출하는 부분 위에 함수가 정의되어 있고, 따로 함수 선언이 없을 때는 함수 정의와 선언이 동시에 이루어집니다.

#include <stdio.h>

void hello()    // 함수 정의와 선언이 동시에 이루어짐
{
    printf("Hello, world!\n");
}

int main()
{
    hello();    // hello 함수 호출

    return 0;
}

지금까지 함수에 대해 배웠는데 함수는 C 언어의 핵심이라 할 수 있습니다. 그러므로 시간을 두고 문법과 사용 방법을 정확히 익히는 것이 좋습니다.

  • 태그
  • 링크 추가
  • 방명록

  • NEW (900)
    • 아이폰 개발 기초 (7)
    • 취미 (16)
      • 아두이노 (16)
    • [안드로이드] 어플만들기 (77)
      • 안드로이드 기초 다지기 (61)
      • 슈팅게임 만들기 (4)
    • [JAVA]자바 공부하기 (48)
    • C언어 알고리즘 (61)
    • [Unity3D]유니티3D 강좌 (7)
    • 컴퓨터 (325)
      • 포토샵CS2 강좌 (6)
      • 유용한 프로그램 (244)
    • 리눅스 노트정리 (22)
      • 임베디드 리눅스 (11)
    • New블로그 (9)
    • 음식의 효능 (4)
    • 일반상식 (56)
    • HTML 공부 (40)
    • 포토샵 공부 (36)
    • 엑셀 (6)
    • 파워포인트 공부 (19)
    • 노트정리 (38)
    • 일상 (33)
    • TV영화 (85)

카테고리

C언어 함수


함수란?

프로그래밍에서 함수(function)란 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합으로 정의할 수 있습니다.

C 프로그램은 이러한 함수들로 구성되며, 포함된 함수들을 사용하여 프로그램의 목적을 달성하게 됩니다.

C언어에서 함수는 크게 표준 함수와 사용자 정의 함수로 구분할 수 있습니다.


함수를 사용하는 이유

함수를 사용하는 가장 큰 이유는 바로 반복적인 프로그래밍을 피할 수 있기 때문입니다.

프로그램에서 특정 작업을 여러 번 반복해야 할 때는 해당 작업을 수행하는 함수를 작성하면 됩니다.

그리고서 프로그램이 필요할 때마다 작성한 함수를 호출하면 해당 작업을 반복해서 수행할 수 있습니다.

또한, 프로그램을 여러 개의 함수로 나누어 작성하면, 모듈화로 인해 전체적인 코드의 가독성이 좋아집니다.

그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수를 할 수 있습니다.

함수의 크기에 대해서 정확히 명시된 규칙은 없으나, 대략 하나의 기능을 하나의 함수로 만드는 것이 가장 좋습니다.


함수의 정의

C언어에서 사용자 정의 함수를 정의하는 방법은 다음 그림과 같습니다.

C언어 void 함수 선언 - ceon-eo void hamsu seon-eon

1. 반환 타입(return type) : 함수가 모든 작업을 마치고 반환하는 데이터의 타입을 명시합니다.

2. 함수 이름 : 함수를 호출하기 위한 이름을 명시합니다.

3. 매개변수 목록(parameters) : 함수 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시합니다.

4. 함수 몸체 : 함수의 고유 기능을 수행하는 명령문의 집합입니다.

함수 호출 시에는 여러 개의 인수를 전달할 수 있지만, 함수가 반환할 수 있는 값은 1개를 넘지 못합니다.

또한, 함수의 특성에 따라 인수나 반환값이 하나도 없는 함수도 존재할 수 있습니다.

다음 예제에서는 인수로 전달받은 두 수 중에서 더 큰 수를 반환하는 bigNum() 함수를 정의하여 사용합니다.

예제

#include <stdio.h>

int bigNum(int num01, int num02) // 함수의 정의

{

    if (num01 >= num02)

    {

        return num01;

    }

    else

    {

        return num02;

    }

}

int main(void)

{

    int result;  

    result = bigNum(3, 5); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    result = bigNum(3, 1); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    result = bigNum(7, 5); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    return 0;

}  

코딩연습 ▶

실행 결과

두 수 중 더 큰수는 5입니다.

두 수 중 더 큰수는 3입니다.

두 수 중 더 큰수는 7입니다.


함수의 원형 선언

C언어에서 함수를 정의할 때는 그 위치가 매우 중요합니다.

다음 예제는 앞서 살펴본 예제에서 함수 정의의 위치만을 바꾼 예제입니다.

예제

#include <stdio.h>

int main(void)

{

    int result;  

    result = bigNum(3, 5); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    result = bigNum(3, 1); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    result = bigNum(7, 5); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    return 0;

}  

int bigNum(int num01, int num02) // 함수의 정의

{

    if (num01 >= num02)

    {

        return num01;

    }

    else

    {

        return num02;

    }

}

C언어에서는 가장 먼저 main() 함수가 컴파일러에 의해 컴파일됩니다.

위의 예제에서 컴파일러는 main() 함수에 등장하는 bigNum() 함수를 아직 알지 못하기 때문에 컴파일 오류를 발생시킵니다.

따라서 컴파일러에 bigNum() 함수는 나중에 정의되어 있다고 알려줘야 합니다.

그 역할을 하는 것이 바로 함수의 원형(prototype) 선언입니다.

위와 같이 차례대로 한 번에 컴파일하는 방식을 단일 패스(one pass) 컴파일 방식이라고 합니다.

하지만 하드웨어의 발달로 컴파일러에 따라 여러 번에 걸쳐 컴파일하는 다중 패스(multi-pass) 방식이 많아지고 있습니다.

다중 패스 방식의 컴파일러에서는 함수의 원형을 선언하지 않아도 컴파일 오류를 발생시키지 않습니다.

하지만 오래된 컴파일러는 대부분 단일 패스 방식으로 컴파일하므로, C 표준에서는 여전히 함수의 원형을 정의하고 있습니다.

함수의 원형 선언은 다음과 같은 방식으로 선언됩니다.

다음 예제는 앞서 살펴본 예제에 함수의 원형 선언을 추가한 예제입니다.

이렇게 함수의 원형은 main() 함수 앞에 미리 선언되어야 합니다.

예제

#include <stdio.h>

int bigNum (int, int); // 함수의 원형 선언  

int main(void)

{

    int result;  

    result = bigNum(3, 5); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    result = bigNum(3, 1); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    result = bigNum(7, 5); // 함수의 호출

    printf("두 수 중 더 큰수는 %d입니다.\n", result);

    return 0;

}  

int bigNum(int num01, int num02) // 함수의 정의

{

    if (num01 >= num02)

    {

        return num01;

    }

    else

    {

        return num02;

    }

}

코딩연습 ▶

실행 결과

두 수 중 더 큰수는 5입니다.

두 수 중 더 큰수는 3입니다.

두 수 중 더 큰수는 7입니다.


연습문제

  • 연습문제1
  • 연습문제2
  • 연습문제3
  • 연습문제4
  • 연습문제5