[1-6] return이란?

return는 값이나 주소를 부모 프로세스로 전달하는 예약된 지시어입니다.

지금까지 우리는 printf() 함수와 main() 함수를 썼습니다. main() 함수에서 return은 상대적으로 더 깊은 이야기가 필요하므로 printf() 함수를 사용해 어떻게 동작하는지 알아보겠습니다.

“hello world”를 출력하는 처음 본 코드를 살펴봅니다.

#include <stdio.h>

int main(void) {
	printf(hello world\n);
	return 0;
}

printf() 함수에서 반환되는 값을 활용하고 있지 않네요.

printf() 함수의 원형은 다음과 같습니다.

int printf(const char *format, ...)

뭔가 실행한 후에 int형 값을 반환하는구요!

그럼 int형 변수 하나를 선언해서 “hello world”를 출력한 뒤 무엇을 반환하나 인해보겠습니다.

#include <stdio.h>

int main(void) {
	int a;
	a = printf("hello world\n");
	printf("%d\n",a);
	return 0;
}

[결과]

hello world
12

printf()가 12를 반환했군요? 이 함수는 출력한 문자 수를 반환합니다. 13이 아니냐구요? \n은 형식지정자로서 둘이 하나의 약속된 행동을 합니다. 그래서 한 단어입니다.

printf()는 int형을 반환하지만 모든 함수가 그런 것은 아닙니다. char형, 포인터형, floate형 등 모든 기본 자료형을 반환할 수 있습니다.

더 다양한 사용법은 함수에 대해 조금 더 배워야 설명이 가능한데요, 아마 그쯤되면 별다른 설명이 없더라도 이 글이 모두 이해 될 겁니다. 관우는 여러분의 머리가 아프기 직전까지만 설명하는 착한 무장입니다!

더 깊은 이야기가 궁금하다면 제 친구 제갈량에게 문의해보세요!

제갈량의 동남풍

main() 함수와 return문

우리가 PC에서 애플리케이션을 더블클릭 등으로 실행하면 운영체제가 해당 애플리케이션의 main() 함수를 호출합니다. return문은 호출한 부모 함수에 값이나 주소를 반환합니다. 그러므로 실행시킨 애플리케이션이 종료되면 mail() 함수의 반환값이 OS에 전달됩니다(1-3 ‘함수와 엔트리 포인트’의[동남풍] main() 함수는 어디에?’ 참조).

운영체제는 반환값이 0이면 정상, 그외 값은 비정상으로 판단합니다.

그런데 main() 함수가 void를 반환하는 경우도 있습니다. 이때도 다음과 같이 return문을 사용할 수 있습니다.

#include <stdio.h>

void main(void) {
  printf(return nothing);
  return;
}

[결과]

Runtime error	#stdin #stdout 0s 4264KB
return nothing

정상적으로 “return nothing”을 출력했지만 0을 리턴하지 않아 런타임 에러가 발생했습니다. 그러니 의도한 바가 아니라면 main() 함수에서는 항상 0값을 반환합시다.

그렇다면 0이 아닌 값을 반환해야 하는 경우도 있을까요? 프로세스끼리 실행 결과를 반환값으로 판단할 때 사용할 수 있습니다. 프로세스를 종료하면서 부모 프로세스에 상태를 알려주는 exit() 함수는 EXIT_SUCCESS, EXIT_FAILURE 두 값을 인수로 받습니다.

코드를 한 번 살펴보시죠.

#include <stdio.h>
#include <stdlib.h>     // EXIT_SUCCESS, EXIT_FAILURE

int main(void) {
	printf("EXIT_SUCCESS = %d\n",EXIT_SUCCESS);
	printf("EXIT_FAILURE = %d\n",EXIT_FAILURE);
  return EXIT_FAILURE;
}

[결과]

Runtime error	#stdin #stdout 0s 4216KB
EXIT_SUCCESS = 0
EXIT_FAILURE = 1

0이 아닌 EXIT_FAILURE을 반환해서 런타임 에러가 발생했습니다. EXIT_SUCCESS을 사용하면 정상 종료할 겁니다.

그렇다고 꼭 저 두 값만 사용할 필요는 없습니다. 예를 들어 A와 B 프로세스 둘 다 우리가 만들었다고 합시다. A에서 B를 호출하여 B를 실행하는데 B가 종료하면서 반환한 값마다 다른 대응을 하고 싶으면 어떻게 해야 할까요? 다음과 같이 두 프로세스 간에 약속을 해두면 프로세스가 종료하면서 반환한 값으로 A는 더 자세히 상황을 알 수 있고 적절한 대응을 할 수 있을 겁니다.

  • 0 : 정상 종료
  • 1 : 네트워크 이상으로 종료
  • 2 : 메모리 부족으로 종료

값과 의미는 정하기 나름입니다.

더 자세한 내용은 추후에 기회가 되면 다시 다루죠! 이상 제갈량이었습니다!