Programming/C C++
C++에서의 함수 작성은 C와 거의 비슷하지만 약간의 차이점을 가지고 있습니다.

C에서 함수를 정의할때는 안정성을 고려하여 되도록이면 함수원형을 선언하도록 하였습니다. 이 말을 뒤집어 보면 안정성을 포기한다면 함수원형을 굳이 선언할 필요가 없다는 뜻이기도 합니다.

#include <iostream.h>

main()
{
  cout << plus(10, 20);
 
  return 0;
}

int plus(int i, int j)
{
  return i + j;
}

▶함수원형을 선언하지 않은 Program

하지만 C++에서는 함수원형의 선언은 생략할 수 없으며 위와 같은 Program은 Compile시에 Error를 발생시킵니다.


#include <iostream.h>

int plus(int i, int j);

main()
{
  cout << plus(10, 20);
 
  return 0;
}

int plus(int i, int j)
{
  return i + j;
}



또한 C++에서는 함수의 원형을 선언할때 해당 함수의 인자에 기본값을 설정할 수 있도록 하였습니다.

#include <iostream.h>

int plus(int i = 10, int j = 20);

main()
{
  cout << plus() << endl;
  cout << plus(10) << endl;
  cout << plus(20, 30) << endl;
 
  return 0;
}

int plus(int i, int j)
{
  return i + j;
}


함수의 원형 선언부분에서 함수의 i와 j인수에 각각 10과 20이라는 기본값을 설정하였습니다.

함수의 기본값을 설정하면 plus()나 plus(10) 처럼 해당 인수로의 값 전달을 생략할 수 있으며 이런경우 기본값으로 설정한 값이 함수내부에서 사용되게 됩니다.


기본값을 설정한 함수를 호출할때 일부분만 값을 전달하도록 하려고 plus(10)처럼 하면 첫번째 인수부터 해당 값의 전달이 이루어집니다. 이는 첫번째 인수를 건너뛰고 두번째 인수부터 값을 전달하는 형태로는 함수를 호출할 수 없다라는 의미가 됩니다.

함수에 기본값을 설정하는 것과 다르게 함수에 전달하는 인수의 성격이 다르면 그 인수에 맞는 각각의 처리를 수행하도록 할 수 있습니다. 이는 함수에 전달하는(전달되오는)인수에 따라 다른 처리를 하고 싶지만 함수의 이름은 똑같이 하고자 하는 경우 유용하게 사용될 수 있습니다.(이런 형태의 구현을 함수의 Overloaded 라고 합니다.)

#include <iostream.h>

int pmls(int i, int j);
double pmls(double d, double b);

main()
{
  int r;
  double d;
 
  r = pmls(10, 20);
  d = pmls(10.5, 5.4);
 
  cout << "정수덧셈 r : " << r << endl;
  cout << "실수뺄셈 d : " << d << endl;
 
  return 0;
}

int pmls(int i, int j)
{
  return i + j;
}

double pmls(double d, double b)
{
  return d - b;
}


pmls라는 함수를 두개 선언하였습니다. 차이는 각 함수마다 전달되오는 인수의 성격에따라 각각 다르게 작동한다는 것입니다. 이렇게 선언하면 C++에서는 해당 함수를 Overloaded 처리하게 됩니다.

첫번째 pmls()함수를 호출할때는 정수값을 전달하였습니다. 따라서 첫번째 pmls()함수 즉, 덧셈을 수행하는 부분으로 처리를 수행하게 되고 두번째 pmls()함수를 호출할때는 실수를 건네줘서 뺄셈을 수행하는 함수로의 처리를 진행하도록 합니다.


여기서 주의해야할 점은 인수의 성격와 실제 그 함수가 반환하는 값의 성격이 같아야 한다는 것입니다. 또한 인수도 서로간의 다른 인수를 지정할 수는 없습니다.

double pmls(int i)
{
  return i;
}

int pmls(int i, double j)
{
  return i + j;
}


위와 같은 처리는 불가능합니다.

C나 C++이나 함수를 호출하면 그 함수부분으로 이동하여 처리를 진행하게 되는데 C++에서는 이 작동방식과는다른 Inline함수라는 것이 추가되었습니다.

Inline함수는 Program동작시 함수로 처리를 이동하는 것이 아니라 Compile시에 정의된 함수자체의 Code를 호출하는 부분에 완전히 끼워넣는 방식입니다.

#include <iostream.h>

inline int plus(int i = 10, int j = 20);

main()
{
  cout << plus() << endl;
  cout << plus(10) << endl;
  cout << plus(20, 30) << endl;
 
  return 0;
}

inline int plus(int i, int j)
{
  return i + j;
}


plus함수정의부분에서 앞에 Inline을 추가하여 plus함수를 Inline함수로 작성하였습니다.

위와같이 함수를 Inline으로 처리하게 되면 Compile시에 함수의 호출부분이 발견될때마다 해당 함수본체를 호출부분에 포함시키게 됩니다. 이렇게 되면 함수로의 처리이동을 할 필요가 없으므로 실행속도가 더 빨리지게 되며 Macro를 통한 함수사용을 보다 안전하게 할 수있다는 이점이 있습니다.

하지만 Inline을 너무 남발해서는 안됩니다. Inline함수의 덩치가 큰 경우 오히려 처리가 제대로 이루어 지지 않을 수 있으며 또한 Inline함수에 for나 while등의 반복문이 사용되었을 경우 Inline처리는 아예 이루어 지지 않을 수 있습니다.

'Programming > C C++' 카테고리의 다른 글

[C, C++] Memory동적 확보  (0) 2010.04.15
[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
[C, C++] 확장 문자열  (0) 2010.03.30
[C, C++] 표준 Library 함수 - 문자 변환 함수  (0) 2010.03.29
0 0