본문 바로가기

Library/C/C++

함수의 리턴값과 인터페이스

함수의 리턴값을 결정하는 것은 미묘한 문제이다. 예를 들어 void 리턴값을 가지는 함수를 정의하고 사용한다고 했을 때, 이것은 '이 함수는 리턴값이 없음'이라는 것을 의미할 수도 있지만, 이런 의미로 void 타입을 리턴값으로 선택하는 것은 옳지 않을 때가 있다. void 타입은, 이 함수는 절대로 실패할 수 없다는 의미도 될 수 있기 때문이다. 전통적인 C 스타일의 함수들은 int 형의 리턴값을 주면서 에러 코드를 확인할 수 있도록 되어 있는데, C++ 스타일의 함수를 설계하면 이런 근본적인 문제와 마주치게 된다. 즉, 리턴값은 필요없지만 어떤 에러를 던질 필요가 있을 때 예외를 던지는 것을 선택할 수도 있는데, 예외는 그야말로 예외일 뿐, 이 함수가 성공했는지 실패했는지 결과를 알려주는 방법으로는 적당하지 않다.

다른 예로, 함수가 단순히 true / false만 필요하다고 해서 정말로 bool 타입으로만 리턴값을 결정하는 것이 옳은 선택인가? 함수를 실행할 때 정말로 true / false만 필요해서 bool로 리턴값을 결정한 것인지, 아니면 함수의 결과로 가지는 여러 값 중에서 단순히 성공. 실패만 취하려고 bool을 쓴게 아닌지 다시 검토해보라. 이런 경우라면, 함수의 리턴값으로 int를 선택하고 성공, 실패는 리턴되는 int 값 중 하나로 표시하는게 훨씬 낫다. 또, 함수가 실패했을 때 에러 처리 후에 계속 수행해도 되는 문제인지, 그렇지 않은 문제인지도 함수의 인터페이스 결정에 중요한 문제이다.


즉, 어떤 함수의 인터페이스를 결정하는 것은 신중을 기해야 하는 문제이다. 면밀한 검토 없이 즉흥적으로 결정된 불명확한 인터페이스는 반드시 디자인적으로 혼란을 가져온다. 이 문제는 코드를 작성 그 자체로는 사소해보이지만, 이런 모호한 부분이 모이면 가장 심각한 문제가 된다.