Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 함수 완벽 가이드: 선언, 정의, 매개변수까지 한 번에 이해하기


함수는 마치 하나의 기계와 같습니다. 기계가 입력을 받아 처리한 후 결과물을 출력하듯, 함수도 값을 받아 연산을 수행하고 그 결과를 반환합니다. 사람이 기계에 직접 입력값을 넣어야 기계가 작동하는 것처럼, 프로그래머가 함수를 호출해야 비로소 함수가 실행됩니다.

함수는 프로그래밍 언어마다 부르는 이름은 조금씩 다를 수 있지만, 다음과 같은 두 가지 공통적인 특징을 가집니다.

  • 처리해야 할 명령문들의 나열(sequence)을 포함합니다.
  • 그 명령문들은 하나의 이름으로 식별되며, 이 이름이 곧 해당 함수를 가리킵니다.

함수를 사용하는 이유

  • 재사용성(Reusability) — 동일한 기능이 여러 곳에서 필요할 때, 같은 코드를 반복해서 작성하는 대신 함수를 한 번 만들어두고 필요할 때마다 호출하는 것이 가장 효율적입니다. 재사용성은 함수가 제공하는 가장 큰 장점입니다.
  • 코드의 모듈화(Modularity) — main() 함수 안에 긴 코드를 몰아서 작성하는 대신 기능별로 함수를 분리하면 코드가 깔끔해지고 읽기도, 관리하기도 훨씬 쉬워집니다.
  • 수정 용이성 — 코드 변경이 필요할 때 여러 곳을 일일이 고치는 대신 해당 함수만 수정하면 됩니다. 즉, 함수는 코드의 중복(redundancy)을 줄여주는 효과도 있습니다.
  • 추상화(Abstraction) 제공 — 함수의 이름만 보고도 그 함수가 '무엇을 하는지' 파악할 수 있으며, 내부적으로 '어떻게 동작하는지'는 알 필요가 없습니다. 예를 들어 C 언어의 math.h 헤더 파일에는 pow() 함수가 포함되어 있는데, 이 함수가 내부적으로 거듭제곱을 어떻게 계산하는지 몰라도 바로 호출하여 사용할 수 있습니다.

함수 선언과 정의

함수 선언(function declaration)이란 컴파일러에게 함수의 반환 타입과 이름을 미리 알려주는 과정입니다.

문법(Syntax)

본문 없이 선언하는 경우

반환타입 함수이름(매개변수 목록);  // 매개변수 목록은 생략 가능

본문을 포함하여 정의하는 경우

반환타입 함수이름(매개변수 목록)
{
// 함수 본문
}

구성 요소 설명

  • return_type(반환 타입) — 함수가 값을 반환하는지 여부와, 반환한다면 어떤 데이터 타입인지 컴파일러에게 알려줍니다.
void dummy(){
// 반환 타입이 void이므로 호출자에게 아무것도 반환하지 않으며,
// 따라서 return 문을 포함하지 않습니다.
}
int dummy(){
// 반환 타입이 int이므로 호출자에게 정수 값을 반환해야 하며,
// return 문이 반드시 포함되어야 합니다.
return integer_value;
}
float dummy(){
// 반환 타입이 float이므로 호출자에게 실수 값을 반환해야 하며,
// return 문이 반드시 포함되어야 합니다.
return float_value;
}
  • function name(함수 이름) — 프로그래머가 원하는 어떤 이름이든 지정할 수 있습니다. 위 예제에서는 함수 이름을 dummy로 지정했습니다.
  • parameters list(매개변수 목록, 선택 사항) — 함수가 호출자가 전달한 값을 가지고 연산을 수행해야 한다면 매개변수를 선언해야 합니다.

함수 정의(function definition)에는 함수가 호출될 때 실제로 수행할 기능이 담겨 있습니다.

예제

#include<iostream>
using namespace std;

// 두 매개변수 중 더 큰 값을 계산하는 함수
int greatest(int val_1, int val_2) // 함수의 반환 타입은 정수(int)
{
// 함수 본문(정의)
if(val_1 > val_2){
return val_1;
}
else{
return val_2;
}
}

int main(){
int val_1 = 10, val_2 = 20;
// 함수를 호출하고 반환된 정수 값을 변수에 저장
int highest = greatest(val_1, val_2);
// 가장 큰 값 출력
cout << "The greatest value is : " << highest;
// main의 반환 타입이 int이므로 return 문이 필요
return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

The greatest value is : 20

함수 매개변수

  • 매개변수는 선택 사항입니다. 매개변수가 없어도 함수는 자신의 기능을 충분히 수행할 수 있습니다.
  • 호출자가 전달한 값을 받기 위해 함수 정의 부분에 선언된 변수를 매개변수(Parameter)라고 합니다.
int greatest(int val_1, int val_2)
  • 반면, 함수를 호출할 때 호출자가 실제로 전달하는 변수를 인수(Argument)라고 합니다.
int highest = greatest(val_1, val_2);

실매개변수 vs 형식매개변수

  • 실매개변수(Actual Parameter) — 함수에 실제로 전달되는 데이터입니다. 위 예제에서 10과 20이 실매개변수에 해당합니다.
  • 형식매개변수(Formal Parameter) — 함수가 전달받는 데이터입니다. 위 예제에서 val_1과 val_2가 형식매개변수에 해당합니다.

main() 함수에 대해 알아두어야 할 점

  • 모든 프로그램에는 실행이 시작되는 진입점(entry point)이 있으며, C와 C++에서는 main() 함수가 그 역할을 담당합니다.
  • main() 함수의 반환 타입이 void라면 아무것도 반환하지 않는다는 의미이고, int라면 컴파일러에게 값을 반환한다는 의미입니다. 예를 들어 main()의 "return 0"은 프로그램이 정상적으로 종료되었음을 나타냅니다.
  • C 언어의 경우 — main() 함수의 반환 타입은 void 또는 int만 가능합니다. 즉, 정수 값을 반환하거나 아무것도 반환하지 않아야 합니다.
  • C++의 경우 — main() 함수의 반환 타입은 int만 가능하며, 컴파일러에게 정수 값을 반환해야 합니다.