Skip to content

53. 함수(Function)


1. 키워드

  • 함수(Function)
  • 지역 변수(Local Variable)
  • 함수 원형(Function prototype)


2. 함수 사용하기

  • C에서는 함수라는 기능을 제공하는데 특정 용도의 코드들을 한 곳에 모아놓은 것을 뜻한다.


3. "Hello, world!" 출력 함수 만들기

  • 함수를 정의하는 방법은 다음과 같이 반환값 자료형, 함수 이름, ()(괄호) 순으로 적어준 뒤 {}(중괄호) 안에 원하는 코드를 작성하면 된다.


반환값자료형 함수이름()
{
    코드;
}
#include <stdio.h>

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

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

    return 0;
}

// Hello, world!


  • 이제 함수를 만들려면 main 함수 바깥에서 작성해야 한다.
  • 다음과 같이 main 함수 위에서 반환값의 자료형은 void 타입, 이름은 hello인 함수를 정의했다.
  • 그리고 {} 안에서 printf"Hello, world!" 문자열을 출력했다.


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


  • 여기서 함수의 반환값 부분에 void 타입을 적어주면 함수의 반환값이 없다는 뜻이 된다.
  • 즉, void 타입은 함수의 반환값이 없음을 나타낼 때와 포인터로 사용할 때의 의미가 다르다.


  • main 함수 안에서 hello();와 같이 함수 이름과 ()를 적어준 뒤 ;(세미콜론)을 붙이면 함수를 사용할 수 있다.


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

    return 0;
}


  • 다음은 main 함수와 hello 함수의 실행 순서이다.


1] main 함수 실행

2] hello 함수 호출

3] hello 함수 실행

4] printf 함수 실행 및 "Hello, world!" 출력

5] hello 함수 종료

6] 0 반환 및 main 함수 종료


001


지역 변수

  • 함수 안에 선언된 변수를 지역 변수라고 부르는데, 이 지역 변수의 특징은 함수가 끝나면 사라진다는 점이다.


#include <stdio.h>

void hello()
{
    int num1 = 10; // 지역 변수. hello 함수가 끝나면 사라짐

    printf("Hello, %d", num1);
}

int main()
{
    hello();
    printf("%d", num1); // 컴파일 에러. hello 함수의 지역 변수 num1은
                        // 함수 hello 안에서만 사용할 수 있음

    return 0;
}


  • hello 함수 안에 선언된 지역 변수 num1hello 함수 안에서만 사용할 수 있고, 함수 바깥에서는 사용할 수 없다.


4. 함수 선언과 정의 분리하기

  • 다음과 같이 hello 함수를 main 함수 아래에 작성해 보자.


#include <stdio.h>

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

    return 0;
}

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


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


  • 어떤 함수가 있다는 사실을 알려주려면 함수 선언을 해줘야 한다.
  • 함수 선언은 다음과 같이 반환값 자료형, 함수 이름, () 순으로 적어주고 ;을 붙인다.
  • 특히 여기서는 함수를 정의할 때와는 달리 {}를 사용하지 않는다.


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


  • 즉, 함수 형태만 선언하기에 이를 함수 원형이라 부른다.


#include <stdio.h>

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

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

    return 0;
}

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

// Hello, world!


  • main 함수 위에서 void hello();와 같이 반환값 자료형, 함수 이름, ()을 적어준 뒤 ;을 붙이면 hello 함수가 있다는 것을 알려줄 수 있다.
  • 이때 만약 함수 선언만 있고 정의가 없다면 링크 에러가 발생한다.


함수 원형과 함수 본체

  • 함수 선언과 정의가 분리된 상태에서는 함수 선언 부분을 함수 원형, 함수 정의 부분을 함수 헤더(Function Header)와 함수 본체(Function Body)라고 부른다.


#include <stdio.h>

void hello(); // ← 함수 원형

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

    return 0;
}

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


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


#include <stdio.h>

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

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

    return 0;
}

References