함수 원형

함수 원형 또는 함수 프로토타입, 펑션 프로토타입(function prototype)은 컴퓨터 프로그래밍에서 함수 이름을 지정하는 선언과 형식 시그니처(항수 (수학), 매개변수의 자료형 및 반환형)를 지정하지만, 함수 본문은 생략한다. 함수 정의는 함수가 어떻게 동작하는지("구현")를 지정하는 반면, 함수 원형은 단순히 해당 인터페이스, 즉 어떤 데이터 형식이 들어가고 나오는지 지정한다. "함수 원형"이라는 용어는 특히 C 및 C++ 프로그래밍 언어에서 사용되는데, 전방 선언을 헤더 파일에 배치하여 프로그램을 번역 단위로 분할할 수 있게 한다. 즉, 컴파일러가 개별적으로 오브젝트 파일로 번역하고, 링커에 의해 실행 파일 또는 라이브러리로 결합될 수 있는 부분으로 분할한다. 함수 선언은 함수 정의보다 먼저 나오며, 이름, 반환형, 저장 클래스 및 기타 관련 속성에 대한 세부 정보를 제공한다.

함수 원형은 다음 중 하나의 경우에 사용될 수 있다.

 외부 유형 정의
 인터페이스 부분 생성

원형에서 매개변수 이름은 선택 사항이며(C/C++에서는 함수 원형 영역을 가지며, 해당 영역은 원형 끝에서 끝난다), 그러나 형식은 모든 한정자와 함께 필요하다(예: 포인터 또는  매개변수에 대한 참조인 경우). 단독 는 제외한다.

객체 지향 프로그래밍에서 인터페이스와 추상 메서드는 거의 동일한 목적을 수행한다.

 예시 
다음 함수 원형을 고려한다.

void sum(int a, int b);

또는, 이름 지정된 매개변수 없이:

void sum(int, int);

또는, 후행 반환형과 함께 (C++ 전용):

auto sum(int, int) -> void;

함수 원형에는 함수 시그니처, 함수 이름, 반환형 및 접근 지정자가 포함된다. 이 경우 함수 이름은 "sum"이다. 함수 시그니처는 매개변수의 수와 해당 유형을 정의한다. 반환형은 "void"이다. 이는 함수가 어떤 값도 반환하지 않을 것임을 의미한다. 첫 번째 예시의 매개변수 이름은 선택 사항이다.

 사용법 
C 초기 버전에서는 함수가 이전에 선언되지 않았고 이름이 왼쪽 괄호 뒤에 표현식에 나타나면, int를 반환하는 함수로 암시적으로 선언되었으며 인수에 대해서는 아무것도 가정되지 않았다. 이 경우 컴파일러는 인수의 수와 유형에 대한 컴파일 시간 유효성 검사를 수행할 수 없었다.
C99 표준은 원형 사용을 요구한다.

#include <limits.h>
#include <stdio.h>

// Function prototype
char myFunction(int a);

int main(void) {
    putchar(myFunction(-1)); // Correctly formatted call
    putchar(myFunction(1.5)); // Compiler warning: type mismatch
    putchar(myFunction("IncorrectArgType")); // Compiler warning: type mismatch
    putchar(myFunction()); // Compiler error: too few arguments

    // Although adding 1 to INT_MAX is an integer overflow error,
    // it cannot be detected at compile time
    putchar(myFunction(INT_MAX + 1));

    return 0;
}

// Function definition
char myFunction(int n) {
    if (n > 0) {
        return '>';
    } else if (n < 0) {
        return '<';
    } else {
        return '=';
    }
}

함수 은 정수 인수로 호출될 것으로 예상한다. 함수 원형을 포함함으로써, 함수가 하나의 정수 인수를 취함을 컴파일러에 알리고 컴파일러가 잘못 지정된 호출을 잡을 수 있도록 한다.

 라이브러리 인터페이스 생성 
헤더 파일에 함수 원형을 배치함으로써 라이브러리에 대한 인터페이스를 지정할 수 있다.

 클래스 선언 
C++에서는 함수 원형이 클래스 정의에서도 사용된다.

 같이 보기 
 모듈성 (프로그래밍)
 프로토콜 (객체 지향 프로그래밍)
 추상 메서드

 각주 



분류:C 프로그래밍 언어 계열
분류:컴퓨터 프로그래밍
분류:함수 (프로그래밍)