기본 문법
[return 자료형] [함수명] (함수 인자)
void func(int a, int b)
{
// 구현
}
동작 원리
#include <iostream>
int func(); // 함수 프로토타입
int main()
{
int nData{};
nData = func(); // 1. func 자리에 int 임시 변수가 생김
printf("%d\n", nData);
}
int func()
{
return 100; // 2. return 값을 복사해서 임시 변수에 저장
}
예시
2개의 수를 입력받아서 더하는 함수를 만들어보자.
여러가지 방법으로 함수 모양을 만들 수 있다.
1. return을 이용해서 결과값을 받는 방법
#include <iostream>
int add(int nData1, int nData2);
int main()
{
printf("%d\n", add(10, 20));
}
int add(int nData1, int nData2)
{
return nData1 + nData2;
}
2. 결과값을 저장할 포인터를 이용하는 방법
#include <iostream>
void add(int nData1, int nData2, int *pResult);
int main()
{
int nResult{};
add(10, 20, &nResult);
printf("%d\n", nResult);
}
void add(int nData1, int nData2, int * pResult)
{
*pResult = nData1 + nData2;
}
각각의 장단점
1번의 경우처럼 return을 이용할 경우에는 조립처럼 사용할 수 있다.
printf("%d\n", add(10, 20));
2번의 경우처럼 포인터를 이용할 경우에는 메모리를 잡아서 주소값을 넘겨줘야 하기 때문에 번거로울 수 있다.
int nResult{};
add(10, 20, &nResult);
printf("%d\n", nResult);
그렇지만, 1번의 경우라도 변수를 선언해놓고 사용하는 것이 좋다. 필요하게 될 때 함수를 한번 더 부르면 손해니까.
int nResult{};
nResult = add(10, 20);
printf("%d\n", nResult);
성공 실패를 반환하기
2번의 경우에는 return 값을 사용하지 않았으므로 return 값을 의미있게 사용할 수 있다.
성공 실패 여부가 필요한 함수는 bool 자료형을 반환해서 함수를 사용하는 사용자들에게 편의를 제공할 수 있다.
#include <iostream>
bool divide(int nDest, int nSrc, int *pShare);
int main()
{
int nShare{};
if(divide(10, 5, &nShare)) // 성공 실패 여부 확인하기 (if문을 사용하면 된다.)
printf("%d\n", nShare);
}
// 결과값은 포인터를 이용해서 받고, 성공 실패 여부를 반환한다.
bool divide(int nDest, int nSrc, int * pShare)
{
if (nSrc == 0)
return false;
*pShare = nDest / nSrc;
return true;
}
함수를 사용할 때 중요한 것
if로 감싸서 코딩하지말고, 안되는 조건만 걸러서 return 하는 식으로 만들자.
최소한 return 은 무조건 하는 것으로 만들자.
// 이렇게 안되는 조건부터 거르자.
if (안되는 조건 1)
return false;
if (안되는 조건 2)
return false;
// 구현
return true;
// 이렇게는 하지 말자.. 알아보기 힘들어진다.
if(되는 조건 1)
{
if(되는 조건 2)
{
// 구현
return true;
}
}
return false;
오버로딩
함수명이 같지만, 함수 인자를 다르게 해서 사용하는 것이다.
#include <iostream>
int add(int nData1, int nData2); // 함수명과 자료형으로 함수를 구분한다.
int add(int nData1, int nData2, int nData3);
float add(float fData1, float fData2);
int main()
{
int nAdd{};
nAdd = add(10, 20);
printf("%d\n", nAdd);
}
int add(int nData1, int nData2)
{
return nData1 + nData2;
}
int add(int nData1, int nData2, int nData3)
{
return nData1 + nData2 + nData3;
}
float add(float fData1, float fData2)
{
return fData1 + fData2;
}
오버로딩을 할 수 없는 상황?
오버로딩이 안될 때는 리턴 타입이 다른 건 안되고 뭐 그런 것들이 있지만, 외우지는 말자.
add(10, 20);
함수를 사용하는 모습만 보고 이게 무슨 함수인지 정확히 모르면 그거는 오버로딩을 할 수 없다는 것이다.
가장 대표적인게 리턴 타입이 다르면 안되는 것. (사용할 때는 리턴 타입을 모르니까.)
요즘은 오버로딩을 사용하지 않는다.
오버로딩을 쓸 시절에는 함수명을 외워서 사용하던 때라고 한다.
add 함수명 하나만 외우면 int float 다 때려박아서 사용하니까.
요즘은 addInt, addFloat 처럼 함수명을 구분해서 사용한다.
add까지만 타이핑하고 단축키누르면 쫙 뜨니까 굳이 오버로딩을 사용할 필요가 없다.
#include <iostream>
int addInt(int nData1, int nData2);
float addFloat(float fData1, float fData2);
int main()
{
addInt(10, 20);
addFloat(10.0f, 20.0f);
}
int addInt(int nData1, int nData2)
{
return nData1 + nData2;
}
float addFloat(float fData1, float fData2)
{
return fData1, fData2;
}
'기타 > C++' 카테고리의 다른 글
[C++] 네임스페이스 (0) | 2020.06.06 |
---|---|
[C++] 구조체 (0) | 2020.06.06 |
[C++] 함수와 배열 쓸 때 참고하기 (0) | 2020.06.06 |
[C++] 포인터 쓸 때 참고하기 (0) | 2020.05.20 |
[C++] 배열 쓸 때 참고하기 (0) | 2020.05.08 |