"컴파일된다"에서 "읽을 수 있다"로
이전 페이지에서는 소스 파일을 컴파일러로 실행 가능한 프로그램으로 바꿨습니다. 이제 속도를 늦추고 그 파일 안에 실제로 무엇이 있었는지를 살펴보겠습니다. 모든 C++ 프로그램은 같은 몇 가지 구조적 조각으로 이루어져 있으며, 그것들의 이름을 댈 수 있게 되면 낯선 .cpp 파일이 더 이상 잡음처럼 보이지 않습니다.
여기 완전하고 실행 가능한 프로그램이 있습니다. 한 번 읽은 다음, 한 줄씩 뜯어보겠습니다.
의미 있는 다섯 줄, 그리고 그 하나하나가 특정한 일을 하고 있습니다. 차례대로 살펴봅시다.
#include 줄
#include <iostream>
이 줄은 <iostream> 헤더를 가져와서 cout 같은 입출력 기능을 사용할 수 있게 해 줍니다. #include는 전처리기 지시문으로, 실제 컴파일 이전에 실행되어 본질적으로 그 헤더의 내용을 여러분의 파일에 붙여 넣습니다.
#include 줄을 특별하게 만드는 두 가지가 있습니다.
#로 시작하며, 이는 전처리기 지시문임을 나타냅니다.- 세미콜론으로 끝나지 않습니다. 이는 여러분이 이제 막 들이게 될 "모든 줄은
;로 끝난다"는 습관의 흔한 예외입니다.
cout을 사용하면서 #include <iostream>을 빠뜨리면, 컴파일러는 cout이 무엇인지 알지 못해 'cout' was not declared in this scope 같은 오류가 납니다. 해결책은 거의 언제나 빠진 include입니다.
main 함수
int main() {
// ...
return 0;
}
main은 여러분의 프로그램이 시작되는 곳입니다. 컴파일된 프로그램을 실행하면, 실행은 main 안의 첫 줄에서 시작되어 main이 값을 반환하면 멈춥니다. 모든 C++ 프로그램에는 정확히 하나의 main이 있습니다. 그보다 많지도, 적지도 않습니다.
각 부분은 다음과 같습니다.
int-main은 정수를 운영체제에 돌려줍니다. 관례적으로0은 "성공적으로 끝남"을 뜻합니다.main()- 이름과, 매개변수를 위한 괄호(여기서는 비어 있음)가 뒤따릅니다.{ ... }- 중괄호가 본문, 즉 실행되는 문장들을 감쌉니다.return 0;-main을 끝내고 성공을 알립니다. 생략하면 C++는main이 대신0을 반환한 것처럼 처리하지만, 직접 써 두면 의도가 분명해집니다.
문장과 세미콜론
문장은 하나의 완결된 명령입니다. C++에서는 모든 문장이 세미콜론으로 끝납니다.
C++는 줄바꿈과 여분의 공백을 완전히 무시합니다. 컴파일러는 문장을 한 줄에 쓰든 열 줄에 쓰든 신경 쓰지 않습니다. 각 문장이 어디서 끝나는지를 컴파일러에 알려 주는 것은 ;입니다. 다음 세 가지는 컴파일러에게 동일합니다.
int a = 1; int b = 2;
int a = 1;
int b = 2;
int
a
= 1;
이 자유로움에는 초보자가 가장 흔히 빠지는 함정이 따라옵니다. 바로 빠뜨린 세미콜론입니다. 여기서 무슨 일이 일어나는지 보세요.
int x = 5 // <-- 세미콜론 없음
int y = 10;
expected ';' before 'int' 같은 오류가 납니다. 함정에 주의하세요. 컴파일러는 다음 줄에 다다라서야 무언가 잘못됐음을 알아차리기 때문에, 보고되는 줄 번호는 실제 실수보다 한 줄 아래를 가리키는 경우가 많습니다. 오류가 ; 누락을 언급하면, 메시지에 있는 줄의 바로 위 줄을 확인하세요.
중괄호가 블록을 정의한다
어떤 언어는 코드를 묶기 위해 들여쓰기를 사용하지만, C++는 중괄호 { }를 사용합니다. 서로 짝이 맞는 한 쌍의 중괄호 사이에 있는 모든 것이 하나의 블록입니다. 함수 본문, 반복문, if 문 모두 이것을 사용합니다.
if의 중괄호 안에 있는 두 줄은 조건이 참일 때만 실행됩니다. 마지막 cout은 중괄호 밖에 있으므로 항상 실행됩니다.
구조를 정의하는 것은 들여쓰기가 아니라 중괄호이기 때문에, C++는 들여쓰기를 강제하지 않습니다. 그래도 들여쓰기는 해야 합니다. 들여쓰기는 사람이 중괄호가 정의하는 구조를 읽어 내는 방법이기 때문입니다. 흔한 버그는 짝이 맞지 않는 중괄호입니다. 모든 {에는 닫는 }가 필요합니다. 하나를 빠뜨리면 컴파일러는 대개 파일의 끝 근처에서 오류를 보고하는데(expected '}' at end of input), 이는 실제로 실수한 곳과는 멀리 떨어져 있습니다. 중괄호를 세거나 에디터가 대신 짝을 맞추게 하면 많은 혼란을 덜 수 있습니다.
cout과 <<로 출력하기
cout은 이제 몇 번 봤습니다. 이것은 표준 출력 스트림이며, << 연산자로 값을 보냅니다("이것을 출력에 넣는다"라고 읽으세요).
<<를 이어 붙여서 여러 가지를 연달아 출력할 수 있습니다. endl은 줄을 끝냅니다(버퍼도 비웁니다). 이스케이프 시퀀스 "\n"은 줄바꿈을 출력하는 더 가벼운 방법입니다. 간단한 프로그램에서는 어느 쪽이든 괜찮습니다.
맨 위에 있는 그 using namespace std;에 대해서: 표준 라이브러리의 이름들은 std 네임스페이스 안에 있으므로 전체 이름은 std::cout입니다. using namespace std;를 한 번 쓰면 std:: 접두사를 생략하고 그냥 cout이라고 쓸 수 있습니다. 짧은 예제에서는 편리하지만, 큰 프로젝트에서는 이름 충돌을 피하려고 많은 팀이 명시적인 std::cout을 선호하므로, 어느 쪽으로 쓰여 있어도 놀라지 마세요.
이제 어떤 프로그램의 뼈대든 읽을 수 있습니다
맨 위의 include, 진입점이 되는 main 함수, 세미콜론으로 끝나는 문장, 코드를 블록으로 묶는 중괄호, 그리고 출력을 위한 cout << - 이 뼈대는 여러분이 앞으로 열게 될 거의 모든 C++ 파일에 들어 있습니다. 언어의 나머지는 이 몇 가지 형태 위에 쌓아 올린 세부 사항일 뿐입니다. 프로그램이 위압적으로 보일 때는 먼저 main을 찾고, 그다음 문장을 순서대로 읽으세요. 구조가 여러분을 안내해 줄 것입니다.
다음: 주석
지금은 프로그램의 모든 줄이 컴파일러가 읽는 코드입니다. 다음에는 컴파일러가 일부러 무시하는 줄 - 주석 - 을 추가해서, 자신과 다른 독자를 위한 메모를 남길 수 있게 하겠습니다. 한 줄짜리 // 형식과 블록 형식 /* ... */, 그리고 각각이 언제 올바른 선택인지를 살펴보겠습니다.
자주 묻는 질문
C++의 모든 문장에는 왜 세미콜론이 필요한가요?
C++는 줄바꿈과 공백을 무시하기 때문에, 한 문장이 어디서 끝나고 다음 문장이 어디서 시작하는지를 알려 주는 명시적인 표시가 필요합니다. 그 표시가 바로 세미콜론 ;입니다. 세미콜론 누락은 초보자가 가장 흔히 겪는 컴파일 오류이며, 보고되는 줄 번호는 흔히 세미콜론을 빠뜨린 줄의 다음 줄을 가리킵니다.
C++에서 int main()은 무엇을 하나요?
main은 프로그램이 실행을 시작하는 함수로, 그 첫 줄에서 실행이 시작되어 값을 반환하면 끝납니다. 모든 C++ 프로그램에는 정확히 하나의 main이 필요합니다. int는 운영체제에 정수 상태 코드를 돌려준다는 뜻이며, 관례적으로 0은 성공을 나타냅니다.
cout 앞에 std::를 꼭 써야 하나요?
std::cout(완전한 이름)으로 쓰거나, 맨 위에 using namespace std;를 한 번 추가한 뒤 그냥 cout이라고 쓰면 됩니다. 완전한 형태는 큰 파일에서 더 안전하고, using namespace std;는 작은 예제나 튜토리얼에서 흔히 쓰는 단축 방법입니다.