C++의 함수 활용

개요


인라인함수, 참조 변수, 오버로딩, 디폴트 매개변수, 함수 템플릿에 대해 알아보겠다.




인라인함수


인라인 함수는 프로그램의 실행 속도를 높이기 위해 사용한다.

보통 함수를 실행하면 새로운 스택안에서 처리를 하고 기존의 주소로 돌아온다.

이렇게하면 실행제어를 넘기는 사이사이에 지연이 발생하고 사용 함수가 많다면 속도는 낮아진다.

인라인함수로 선언하면 컴파일러는 그에 대응하는 함수 코드로 대체한다.

그만큼 메모리를 많이 차지하므로 신중하게 사용해야한다.

보통 함수 코드가 적으며 실행 횟수가 많다면 사용한다.

일반적인 관행은 원형을 아예 생략하고, 원형이 놓일 자리에 함수 코드 전체를 놓는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

inline double square(double x) { return x * x; }
using namesapce std;

int main()
{
  double a, b;
  double c= 13.0;
  a = square(5.0);
  b = square(4.5 + 7.5);
  cout << a << b << endl;
}

c에서 사용하는 매크로랑 비슷한 기능이나 더 강력한 기능이므로 매크로보다 인라인함수 사용을 권장




참조


참조(reference)는 미리 정의된 어떤 변수의 별명이다.

참조의 주된 용도는 함수의 매개변수에 사용하는 것이다.

참조를 매개변수로 사용하면, 그 함수는 복사본 대신 원본 데이터를 가지고 작업한다.

참조는 선언과 동시에 초기화해야한다.

참조는 const 포인터와 상당히 비슷하다.



참조 매개변수 사용하는 이유


호출 함수에 있는 데이터 객체의 변경을 허용하기 위해

전체 데이터 객체 대신에 참조를 전달하여 프로그램의 속도를 높이기 위해

포인터를 사용하는 이유와 같다.



참조 VS 포인터




값만 사용하는 경우


  • 데이터 객체가 기본 데이터형이나 작은 구조체라면 값으로 전달
  • 데이터 객체가 배열이라면 포인터, const를 지시하는 포인터
  • 데이터 객체가 덩치 큰 구조체라면 const 포인터나 const 참조
  • 데이터 객체가 클래스 객체라면 const 참조



기존값을 변경하는 경우


  • 데이터 객체가 기본 데이터형이면 포인터
  • 데이터 객체가 배열이면 포인터
  • 데이터 객체가 구조체이면 참조나 포인터
  • 데이터 객체가 클래스 객체이면 참조




디폴트 매개변수


함수 매개변수의 디폴트 값을 설정할 수 있다.

함수 원형에 작성해야한다.

중간에 있는 매개변수를 디폴트 매개변수로 만들 수 없다. 무조건 맨 오른쪽에 있어야한다.




함수 오버로딩


디폴트 매개변수를 이용해서 오버로딩을 최대한 줄여보자




함수 템플릿


함수 템플릿은 구체적인 자료형을 포괄할 수 있는 제네릭 타입으로 함수를 정의한다.

어떤 자료형을 템플릿에 매개변수로 전달하면, 컴파일러가 그 자료형에 맞는 함수를 생성한다.

템플릿을 사용함으로써 자료형을 상황에 맞게 바꾸는 것을 자동화하여 시간을 절약하고 코드의 신뢰성을 높여준다.

1
2
3
4
5
6
7
8
template <class T>
void swap(T &a, T &b)
{
  T tmp;
  tmp = a;
  a = b;
  b = tmp;
}

위와같이 사용할 수 있고 T로 int double 등 상황에 맞는 자료형으로 변환 시켜서 함수를 작동한다.