달나라 노트

C++ : 함수 (function, function overloading) 본문

C++

C++ : 함수 (function, function overloading)

CosmosProject 2022. 3. 23. 02:23
728x90
반응형

 

 

 

C++에서도 내가 원하는 기능을 담은 함수를 만들고 호출할 수 있습니다.

 

void function_name() {
    function contents ~~
}

함수의 선언은 기본적으로 위처럼 가능합니다.

 

 

 

 

#include <iostream>
using namespace std;

void show_text() {
    cout << "test text";
}

int main() {
    show_text();

    return 0;
}


-- Result
test text

show_text() 라는 함수를 만들고 main 함수에서 show_text() 함수를 호출한 예시입니다.

 

 

 

#include <iostream>
using namespace std;

void sum(int a, int b) {
    int result = a + b;

    cout << "result = " << result;
}

int main() {
    sum(2, 5);

    return 0;
}


-- Result
result = 7

위 예시는 정수 2개를 인자로 받아서 그 합을 return해주는 함수인 sum 함수를 선언한 예시입니다.

 

void sum(int a, int b)

함수의 이름은 sum이며, sum 함수가 int a, int b 2개의 정수 인자를 받도록 설정했습니다.

 

여기서 void는 뭘 의미할까요?

바로 sum 함수가 return하는 값의 자료형입니다.

 

sum함수는 cout으로 어떤 값을 화면에 출력해줄 뿐이지 어떤 값을 return하진 않습니다.

따라서 return 값이 없으므로 void 라고 지정해준 것입니다.

 

 

 

 

#include <iostream>
using namespace std;

int sum(int a, int b) {
    int result = a + b;

    return result;
}

int main() {
    int r = sum(2, 5);
    cout << r;

    return 0;
}


-- Result
7

위 코드를 봅시다.

동일하게 2개의 정수를 받아 그 정수들의 합을 계산해주는 sum 함수의 예시입니다.

 

근데 이번엔 좀 다릅니다.

 

 

 

 

 

int sum(int a, int b) {
    int result = a + b;

    return result;
}

보면 sum 함수에 붙은 수식어가 void에서 int로 변경되었습니다.

그 이유는 return result; 라는 부분을 보면 sum 함수가 result에 저장된 값을 return한다는 것을 알 수 있습니다.

또한 result에 저장된 값은 정수(int)이므로 sum 함수가 정수(int)를 return한다는 의미로 sum 함수 왼쪽에 int라는 키워드를 적어준겁니다.

 

 

 

 

 

 

#include <iostream>
using namespace std;

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

int main() {
    int r = sum();
    cout << r;

    return 0;
}


-- Result
2

 

int r = sum();

이 부분을 보면 sum 함수는 int a, int b를 인자로 받는데 위 예시에서 sum 함수를 호출할 때에는 아무 인자를 전달하지 않았습니다.

 

그 이유는 sum 함수를 선언할 때 인자의 기본값을 지정했기 때문입니다.

 

int sum(int a=1, int b=1)

바로 이 부분이죠.

sum 함수 선언 시 a와 b의 기본값을 각각 1로 지정한겁니다.

그래서 sum 함수 호출 시 a와 b값이 주어지지 않으면 각각 1을 기본값으로 사용하라는 의미입니다.

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

#include <iostream>
using namespace std;

inline int max(int a, int b) { if (a >= b) return a; else return b; }

int main() {
    int r = max(2, 5);
    cout << r;

    return 0;
}


-- Result
5

위 예시는 inline 함수입니다.

 

한줄 if문처럼 한줄에 함수의 선언과 함수의 기능까지 지정해줄 수 있는 방법입니다.

 

inline 함수는 아래와 같은 형태로 사용할 수 있습니다.

inline 자료형 함수이름(인자들) {함수의 기능}

 

 

inline 함수를 사용하는 것은 사실 일반 함수 선언과 결과적으론 큰 차이가 없습니다.

 

다만 inline 함수 선언 방식은 일반 함수 선언 방식보다 빠르기 때문에 코드가 매우 복잡해졌을 때 프로그램의 성능을 높이기 위해 inline 함수를 사용할 수 있습니다.

 

 

 

 

 

 


 

 

 

 

#include <iostream>
using namespace std;

int sum(int a, int b);

int main() {
    int r = sum(2, 5);
    cout << r;

    return 0;
}

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


-- Result
7

위 예시를 보면

 

main 함수에서 sum함수를 호출한 다음에 sum 함수가 정의됩니다.

 

sum 함수를 정의하는 부분이 가장 마지막에 존재해서 main함수보다 나중에 나오죠.

 

근데 어떻게 main 함수에서는 sum 함수가 정의되기도 전에 sum 함수를 참조한걸까요?

 

그것은 바로 main 함수 위쪽에 적힌 sum 함수 때문입니다.

 

이렇게 sum 함수가 정의되기 전에 호출부터 해야할 경우 가장 위에 sum 함수가 있다는 정보를 줘야합니다.

이것을 함수의 프로토타입 선언이라고 합니다.

 

int sum(int a, int b);

sum함수의 내용이 뭔지는 모르겠는데 일단 sum함수란게 있고, sum 함수는 int a, int b를 인자로 받아 라는 의미이죠.

이러한 과정을 우리는 함수의 프로토타입을 선언한다 라고 합니다.

 

그래서 이 정보를 토대로 main 함수에서 sum함수를 호출합니다.

 

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

그리고 나서 sum 함수의 자세한 내용이 정의되는것이죠.

 

 

 

 

 

 

 


 

 

 

 

 

 

 

#include <iostream>
using namespace std;

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


void main() {
    double r = sum(1.5, 2.8);
    cout << r;
}


-- Result
3

위 코드를 실행시키면 3이 결과로 출력됩니다.

1.5 + 2.8 = 4.3이 답일거같은데 왜 3이 나올까요?

 

그 이유는 선언한 sum 함수가 받는 인자의 자료형에 있습니다.

 

int sum(int a, int b)

sum 함수의 선언 부분을 보면 sum함수는 int a, int b를 인자로 받습니다.

 

따라서 sum(1.5, 2.8) 처럼 소수점을 가진 숫자를 전달해도 a와 b는 각각 정수만 받으므로 소수점은 모두 삭제한 후 정수 부분만 받게 됩니다.

따라서 a = 1, b = 2로 할당되어 1+ 2의 연산을 하는 것이지요.

 

이런 경우 a와 b를 각각 double로 바꿔주면 되지만 이번에는 함수의 overload 기능을 사용해보겠습니다.

 

아래 코드를 봅시다.

 

 

 

#include <iostream>
using namespace std;

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

double sum(double a, double b) {
    return a + b;
}


void main() {
    double r = sum(1.5, 2.8);
    cout << r;
}


-- Result
4.3

위 예시를 보면 sum이라는 똑같은 이름의 함수를 두 번 선언했습니다.

 

하나는 int a, int b의 정수 인자들을 받아 정수를 return하는 sum 함수이고

다른 하나는 double a, double b의 실수 인자들을 받아 실수를 return하는 함수입니다.

 

이렇게 인수의 자료형만 다르고 전달받는 인수의 개수가 동일하며 이름이 동일한 함수를 여러 개 선언하면

이 함수는 다양한 자료형을 받을 수 있는 하나의 함수처럼 작동하게 됩니다.

 

이것을 함수의 오버로드(overload)라고 합니다.

 

 

 

 

 

 

728x90
반응형

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

C++ : break, continue  (0) 2022.03.23
C++ : while loop (반복문)  (0) 2022.03.23
C++ : for loop (반복문)  (0) 2022.03.23
C++ : &&, ||, ! (논리 연산자, and, or, not)  (0) 2022.03.23
C++ : switch ~ case (조건문)  (0) 2022.03.23
Comments