기타/C++

[C++] 함수 쓸 때 참고하기

푸쿠이 2020. 6. 6. 14:28
기본 문법

[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;
}