본문 바로가기

Theory/Lecture

[C/C++] 함수 Function 上


본 자료는 국립 창원대학교 메카트로닉스 공학부 학생을 대상으로 한 컴퓨터 언어 응용 수업 자료입니다. 본 자료는 수업의 교재인 (핵심요약판) C++로 시작하는 객체지향 프로그래밍 (Y. Daniel Liang 저, 권기형 / 김응성 공역) 의 내용을 재구성한 것으로 수업보조 자료 이외의 목적이 없음을 알립니다.


함수의 선언 및 사용
이번에는 함수의 선언과 사용에 대해 이야기해볼려고 합니다. 내용이 좀 길어질듯해서 상/하로 나눠서 다룰려고 합니다.

 
함수는 위에 보듯이 선언합니다. 먼저 함수의 해더(function header)에 들어가야할 내용은

return_type function_name(parameter_type parameter_name, ...);
 
위의 형태를 가져야만 합니다. 함수 내부에서 사용해야할 파라미터를 선언해야하고 그 함수의 출력값을 선언해야합니다. 만약 해당함수가 출력값이 없다면 void라고 선언해 주면 됩니다. 그리고 함수의 제일 마지막 부분에 return 명령을 이용해서 반환값을 돌려줘야만 합니다. 위와 같이 선언된 함수를 사용하는 방법은

 
위와 같습니다. 즉,

 
위 그림처럼 main함수에서 max를 호출해서 그 결과를 k라는 변수에 저장하겠다는 이야기이고 이때 입력값으로 i, j를 사용하고 있습니다. 그러면 max라는 함수를 호출하는 순간 max함수의 내용이 실행되는 것이지요. 

함수 내에서의 변수
<예제코드1>

#include <iostream>
using namespace std;

void swap(int n1, int n2)
{
  cout << "\t Inside the swap function" << endl; 
  cout << "\t\t Before swapping n1 is " << n1 << " n2 is " << n2 << endl;

  // Swap n1 with n2
  int temp = n1;
  n1 = n2;
  n2 = temp;
  cout << "\t\t After swapping n1 is " << n1 << " n2 is " << n2 << endl;
}

int main()
{
  // Declare and initialize variables
  int num1 = 1;
  int num2 = 2;
  cout << "Before invoking the swap function, num1 is “<< num1 << " and num2 is " << num2 << endl;

  // Invoke the swap function to attempt to swap two variables
  swap(num1, num2);
  cout << "After invoking the swap function, num1 is " << num1 << " and num2 is " << num2 << endl;

  system("pause");
  return 0;
}
 
위 코드의 swap함수는 입력된 두 변수의 내용을 바꿔서 출력하는 함수입니다. main문에서 사용하는 num1(1), num2(2)를 함수내에 n1과 n2에 입력하고 swap에서 그 n1과 n2의 내용을 변경하는 것이지요. 당연히 n1과 n2는 내용이 변경되겠지만, num1 num2는 그 내용이 변하질 않습니다. 실행결과를 보면


변하지 않는 다는 것을 알 수 있습니다. 이는


위 그림을 보면 이해에 도움이 될것입니다. 


참조변수의 사용
예제코드1번에서와는 달리 원 변수의 내용을 알아서 갱신하게 하고 싶을 때도 있을 수 있습니다. 즉, 예제코드1의 실행결과를


처럼 하고 싶다는 것이지요. 이럴때 사용하는 것이 참조변수(reference variable)입니다. 간단히 앰퍼샌드(&)를 사용하면 됩니다. 예제코드1에서와 바뀐것을 확인해보세요.

<예제코드2>

#include <iostream>
using namespace std;

void swap(int &n1, int &n2)
{
  cout << "\t Inside the swap function" << endl; 
  cout << "\t\t Before swapping n1 is " << n1 << " n2 is " << n2 << endl;

  // Swap n1 with n2
  int temp = n1;
  n1 = n2;
  n2 = temp;
  cout << "\t\t After swapping n1 is " << n1 << " n2 is " << n2 << endl;
}

int main()
{
  // Declare and initialize variables
  int num1 = 1;
  int num2 = 2;
  cout << "Before invoking the swap function, num1 is “<< num1 << " and num2 is " << num2 << endl;

  // Invoke the swap function to attempt to swap two variables
  swap(num1, num2);
  cout << "After invoking the swap function, num1 is " << num1 << " and num2 is " << num2 << endl;

  system("pause");
  return 0;
}
확인하셨나요^?^ 예 4번행에서 단지 앰퍼샌드(&)를 원하는 변수에 넣어줬을 뿐입니다. 그렇게 하면 원변수인 num1, num2도 변경됩니다. 

함수의 오버로드 Overload
변수든 오늘 이야기하는 함수든 같은 이름으로 선언하면 안되겠지요? 하지만 사실 가능합니다. 그리고 유용하게 사용할 수도 있구요. 

<예제코드3>

#include <iostream>
using namespace std;

/** Return the max between two int values */
int max(int num1, int num2)
{
  if (num1 > num2)
    return num1;
  else
    return num2;
}

/** Find the max between two double values */
double max(double num1, double num2)
{
  if (num1 > num2)
    return num1;
  else
    return num2;
}

/** Return the max among three double values */
double max(double num1, double num2, double num3)
{
  return max(max(num1, num2), num3);
}

int main()
{
  // Invoke the max function with int parameters
  cout << "The maximum between 3 and 4 is " << max(3, 4) << endl;
  // Invoke the max function with the double parameters
  cout << "The maximum between 3.0 and 5.4 is " << max(3.0, 5.4) << endl;
  // Invoke the max function with three double parameters
  cout << "The maximum between 3.0, 5.4, and 10.14 is " << max(3.0, 5.4, 10.14) << endl;
  system("pause");
  return 0;
}

위 코드를 보면 같은 이름의 함수 max가 3번에 걸쳐 선언된 것이 보이실 겁니다. 그런데 같은 이름이지만 차이가 조금씩 있지요. 첫번째 max는 함수의 출력이 정수형이구요. 두번째 max는 입력변수를 2개를 가지고, 출력은 double형이구요. 세번째 max는 두번째처럼 출력이 double형이지만, 입력변수는 3개입니다. 이렇게 같은 이름으로 함수를 선언(Overload)했지만, 차이를 주면, 별다른 설정없이도 알아서 해당함수를 찾아줍니다. 즉 31행을 보면 3과 4의 최대값을 물었고, 당연히 3,4는 정수형이니까


 첫번째 max를 실행한것입니다. 

아 그리고 마지막으로 함수를 main문 밑에 선언하는 경우도 있습니다. 이럴때는 그 prototype을 main위에 선언해 주어야만 합니다.


예제코드 3번에서 함수를 main문 밑에 선언해본것입니다.


참고자료

[2009] 05.pdf



반응형