이 글에서는 함수에 대한 기본적인 이해와 더불어 main 함수의 역할을 알아봅니다.
일단 이 글에서는 함수에 관한 문법적인 요소는 다 빼고, 개념부터 잡겠습니다.
TL;DR
- 함수(function)란, 일련의 작업과정을 하나로 묶은 것
- 프로그램(program)이라는 것도 결국에는 그 프로그램이 수행하고자 하는 일련의 작업과정을 하나로 묶은 것이므로, 함수라고 볼 수 있음
- C++에서는 하나의 프로그램에 해당하는 작업과정을 하나로 묶어 "main"이라는 이름의 함수로 부르자고 정해져 있음. 따라서 모든 C++ 프로그램은 하나의 main 함수를 무조건 가지며, 컴퓨터가 어떤 프로그램을 실행한다는 것은 그 프로그램의 main 함수를 실행하는 것과 동일한 의미임
함수(function)
기본이론
함수란 일련의 작업과정을 하나로 묶어서 부르는 것을 말합니다.
간단한 예시로, 볼펜의 무게를 재는 방법을 대학원생 A에게 설명한다고 생각해봅시다. 이 대학원생 A는 비록 아직 할 줄 아는 일은 없지만, 한 번 가르쳐주면 가르쳐준대로 완벽하게 따르는 훌륭한(?) 친구입니다.
이 친구에게 볼펜의 무게를 재는 방법을 알려주기 위해 다음과 같이 말을 해주면 되겠군요.
- 저울을 꺼낸다.
- 저울의 영점을 맞춘다.
- 저울 위에 볼펜을 올린다.
- 저울이 가리키는 값을 읽는다.
그런데, 볼펜의 무게를 재야 할 때마다 위와 같은 네 단계를 매 번 말해주는 것이 여간 귀찮은 일이 아닙니다. 그래서 이 네 단계의 과정을 "볼펜의 무게 재기"라는 하나의 이름으로 묶어서 말하기로 약속해 보았습니다.
볼펜의 무게 재기
- 저울을 꺼낸다.
- 저울의 영점을 맞춘다.
- 저울 위에 볼펜을 올린다.
- 저울이 가리키는 값을 읽는다.
이제는 A에게 "볼펜의 무게를 재라"라고만 말하면, A는 위의 네 단계를 수행할 것입니다.
이것이 함수입니다. 우리는 방금 "볼펜의 무게 재기"라는 함수를 만들었습니다.
함수의 입력인자
볼펜 말고도, 연필의 무게도 재볼 수 있겠군요. "연필의 무게 재기" 함수를 다음과 같이 만들면 될 것 같습니다.
연필의 무게 재기
- 저울을 꺼낸다.
- 저울의 영점을 맞춘다.
- 저울 위에 연필을 올린다.
- 저울이 가리키는 값을 읽는다.
그런데 이 함수를 만들고나서 살펴보니, "볼펜의 무게 재기"랑 거의 비슷하군요. 사실상 볼펜을 연필로만 바꾸었을 뿐, 다른 부분은 똑같이 반복되고 있습니다. 게다가 좀 더 생각해보면, 볼펜이나 연필 말고도 임의의 물건에 대해 무게를 잴 때 위와 같은 과정을 그대로 사용할 수 있을 것 같습니다.
그래서 이렇게 바꿔보았습니다.
(물건)의 무게 재기
- 저울을 꺼낸다.
- 저울의 영점을 맞춘다.
- 저울 위에 (물건)을 올린다.
- 저울이 가리키는 값을 읽는다.
이렇게 좀 더 일반화된 무게 재기 함수인 "(물건)의 무게 재기"를 만들었습니다. 함수를 여러 개 만들다보면, 지금 보신 것처럼 같은 기능을 하는데 어떤 대상에 대해 수행할 지만 다른 경우가 생깁니다. 이럴 때는 그 대상을 일반화해서 그 대상에 해당하는 부분만 바꿔 쓸 수 있도록 만들어 준 뒤, 함수를 사용할 때 "~~의 무게를 재라"와 같은 방식으로 그 대상을 집어넣어서 사용하면 됩니다.
이처럼 함수를 사용할 때 집어넣는 대상을 함수의 입력인자라고 합니다.
함수의 출력인자
앞서 만들어 본 "(물건)의 무게 재기"함수를 사용하여 대학원생 A에게 일을 시킵니다.
나: 이 지우개의 무게를 재오세요.
대학원생 A: 네.
(잠시 후)
나: 무게 재오라니까 왜 안 재오세요…?
대학원생 A: …? 쟀는데요?
대학원생 A는 분명 지우개의 무게를 쟀습니다. 그럼에도 "나"의 요구사항은 딱히 충족된 것 같지 않군요. 그 이유는 무엇일까요? 지우개의 무게를 재고서 그 값을 대학원생 A가 읽기만하고, "나"에게는 그 결과를 알려주지 않았기 때문입니다.
생각해보면 앞서 만든 "(물건)의 무게 재기"라는 함수는 무게를 재는 행위만 하고 끝날 것이 아니라, 측정 결과인 무게가 얼마인지 알려줘야 할 것 같습니다.
그래서 함수를 다음과 같이 바꿔보았습니다.
(물건)의 무게 재기
- 저울을 꺼낸다.
- 저울의 영점을 맞춘다.
- 저울 위에 (물건)을 올린다.
- 저울이 가리키는 값을 읽는다.
- 무게를 재달라고 한 요청자에게 저울에서 읽은 값을 알려준다.
이처럼 어떤 함수들은, 일련의 과정을 수행하고 나서 그 결과로 무언가를 되돌려 줄 수 있습니다. 이렇게 함수가 요청자에게 되돌려주는 결과를 함수의 출력인자라고 합니다.
main 함수
컴퓨터 프로그램이란 "어떤 문제를 해결하기 위한 일련의 작업과정을 기술한 명령문의 집합"입니다. 가만히 생각해보면, 앞서 대학원생 A에게 했던 것과 다를 바가 없습니다. 프로그램도 결국에는 함수로 생각할 수 있다는 것입니다.
C++ 언어에서는, 하나의 프로그램에 해당하는 작업과정을 묶어서 main이라는 이름의 함수로 부르자고 약속을 하였습니다. 즉, C++ 언어로 만들어진 프로그램이라면, 무조건 그 프로그램의 코드에는 main 함수가 한 개 존재할 것이며, 그 프로그램이 하는 일은 main 함수에 적혀있는 일이라는 뜻입니다.
main 함수의 입력인자와 출력인자
main 함수도 입력인자와 출력인자를 가지고 있습니다. 이를 임의로 바꿀 수는 없고, C++ 언어의 약속으로서 정해져 있습니다.
입력인자는 그 프로그램을 실행할 때의 실행 명령 문구에 관한 정보들입니다. 이에 관해서는 좀 더 나중에 자세히 살펴보겠습니다. 생략되는 경우도 있습니다.
출력인자는 그 프로그램이 맡은 일련의 작업을 다 수행한 뒤, 프로그램이 정상적으로 작동 후 종료되었는지의 여부를 알려주는 정보입니다. 생략되는 경우도 있습니다.
Helloworld 프로젝트의 main 함수
이 시리즈에서 앞서 만들었던 Helloworld 프로젝트도 하나의 C++ 프로그램입니다. 따라서, 여기에도 이 프로그램이 수행하는 내용이 담긴 main 함수가 한 개 존재합니다.
main 함수는 다음 그림과 같이 main이라는 이름으로 적혀있으며, main 함수가 수행할 내용은 중괄호({
, }
)로 감싸져 있습니다.
이 Helloworld 프로젝트의 main 함수에는 딱 한 줄만 적혀있네요.
std::cout << "Hello, world!\n";
우리는 이미 Helloworld 프로젝트를 실행해봤으므로, 문법을 모르더라도 이 줄이 하는 일이 무엇인지 예상할 수 있습니다. 이 줄이 하는 일은 "터미널 화면에 "Hello, world!"라는 문구를 출력하라"라는 내용이겠지요.
지금은 이정도만 이해하셔도 충분합니다. 좀 더 문법적인 내용은 뒤에서 자세히 살펴봅시다.
Changelog
- 2021-12-16: 최초 게시
- 2022-03-04: 제목 수정