Post

C++ - 함수

C++ 함수

1. 선언

1) 기본형

기본적으로 c++에서 함수의 선언 형태는 아래와 같다.

1
{반환 자료형} {함수이름} ( {매개변수들});

기본적인 선언은 위와 같고 이후 별도로 함수 내용을 정의하거나, 끝에 세미콜론 대신 아래와 같이 정의할 수 있다.

1
2
3
int sum (int a, int b) {
  return a+b;
}

반환형이 void일 경우 반환은 하지 않아도 되고, 함수 앞에 static이 붙는다면 해당 함수는 프로그래밍 종료될때까지 유효해진다.

2) 인라인 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# include<iostream>
using namespace std;

inline int sum(int a, int b) {
  return a+b;
}

int main() {
  cout << sum(1,2) << endl;
  return 0;
}

// 아래 같이 컴파일시 변경됨
//int main() {
//  cout << (1+2) << endl;
//  return 0;
//}

위와 같이 선언할 시에 런타임에 함수 내용을 참조하는 대신에 컴파일시간에 함수내용을 대체한다.
물론 실제로 대체할지는 컴파일러의 판단에 맡기며 코드가 길어지면 되려 좋지 않다.

사실 요즘엔 워낙에 컴파일러가 좋아져서 컴파일러에서 자체적으로 인라인 함수로 변경하기도 하기 때문에 inline 함수의 의미가 좀 퇴색되긴했다.

MACRO 함수와 뭐가 다르냐고 할 수 있는데 단순 문자열 치환인 MACRO는 디버깅시에 매우 불편하다.

3) 포인터 함수

어떤 함수의 인자로 함수를 넣을 때 유용한 기능이다.
대체 함수의 인자로 함수를 넣을 일이 얼마나 되냐고 물을 수 있지만, 만약 sort간 내부 비교함수를 새롭게 정의하고 싶을때 비교 함수를 새롭게 짜서 인자로 넣어주는 식으로 사용할 수 있다.

실질적으로 함수를 포인터 변수에 담게 되는데 아래와 같이 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int sum(int a, int b)
{
    return a+b;
}

int sub(int a, int b)
{
    return a-b;
}

int main()
{
    int (*fcnPtr)(int,int) = sum; 
    cout << (*fcnPtr)(5,4) << endl;
    fcnPtr = sub; 
    cout << (*fcnPtr)(5,4) << endl;
    return 0;
}

// 출력
//9
//1

fcnPtr가 처음에는 sum 함수를 가르켜서 5+4가 반환되고 이후 sub 함수를 가르키기 때문에 5-4가 반환되어 각각 5와 4가 출력된다.

2. 오버로딩(overloading)

C에서는 같은 이름의 함수는 선언할 수 없다. 하지만 C++에서는 가능하다. 단, 매개변수의 자료형과 갯수가 달라야한다.
다른 반환형은 안된다. 매개변수가 달라야한다. 아래와 같이 같은 이름으로 여러개의 함수를 선언할 수 있다,

1
2
int sum(int a, int b);
double sum(double a, double b);

위와 같이 선언하면 int 값이 인자로 들어오면 int로 계산해서 반환하고, double 형이 인자로 들어오면 double 형으로 게산해서 반환한다.

참고자료

This post is licensed under CC BY 4.0 by the author.