본문 바로가기
C

[C/C++][함수]반환형

by Junk_Seo 2018. 1. 8.
반응형

함수

함수의 반환형이 void를 제외한 다른 자료형 type의 경우 함수를 호출하면 반환형 type의 임시 변수를 생성하고, 함수의 return 값을 그 임시 변수에 복사해서 저장한다. 그리고 이를 사용하기 위해서 다시 함수를 호출한 영역에서 반환형 type의 변수를 생성하여 그 임시변수저에 저장된 값을 다시 복사해서 저장하다.

따라서 값의 복사가 두 번 일어난다.

위의 그림과 같이 복사가 일어나고 값의 복사가 많이 일어날수록 리소스를 많이 사용하기 때문에 call by value 형태의 함수를 잘못 사용하면 프로그램이 느려진다.

 

그래서 함수의 형태를

 int sum(int nData1, int nData2);

이런 반환형이 있는 함수보다는 다음과 같이 반환형을 제거하고 결과 값을 받아올 변수의 주소 값을 인자로 전달하는 형태를 많이 사용하다.

 void sum(int nData1, int nData2, int *pOut);

결과 값을 받아올 변수의 주소 값을 인자로 전달하는 방식은 2개 이상의 결과 값을 얻어 올 수 있기 때문에 그냥 반환형을 가진 함수보다 유용하다.

 

그러나 문제점이 있는데, 데이터 전달용 인자(in 파라미터)와 데이터를 받아올 인자(out 파라미터)의 구분이 되지 않는다는 것이다. 

위의 함수에서는 in 파라미터를 값을 복사해서 전달하는 방식으로 하고, out 파라미터를 데이터의 주소값을 전달하는 방식으로 했기 때문에 구분이 가지만 만약

 void sum(int *pData1, int *pData2, int *pout); 

위의 함수처럼 in 파라미터와 out 파라미터 모두를 주소값의 전달 형태를 취하면 문제가 생기게 된다.

in 파라미터와 out 파라미터의 구분이 가지 않게 되고 또 사용자의 의도와는 다르게 in 파라미터의 값을 변경하게 되는 문제가 생기게 된다.

따라서 이 경우에는 in 파라미터에 const를 붙여서 구분이 가게 한다.

 void sum(const int *pData1, const int *pData2, int *pout); 

이렇게 in 파라미터에 const를 붙여서 in 파라미터와 out 파라미터를 구분하고 또 사용자가 의도치 않게 in 파라미터의 값을 변경하는 것을 막아주게 된다.

(인자에 const를 붙이면 함수 안에서 데이터의 변경이 불가능해진다.)

 

함수의 결과 값을 out 파라미터를 통해서 받아오는 형태를 취한다면 in 파라미터에 const를 붙여서 사용해야 한다.

 

****

<in 파라미터, out 파라미터 사용 목적에 따라 나누어진다.>

in 파라미터는 함수에 데이터를 전달할 목적으로 사용

out 파라미터는 함수에서 데이터를 받아올 목적으로 사용

 

 

 

반응형