C++ 튜토리얼 - 2.프로그램의 구조
프로그램의 구조프로그래밍을 익히는 가장 줗은 방법은 프로그램들을 직접 써보는 겁니다. 일반적으로, 처음 시작하는 사람들은 "Hello World!"를 불러내는 프로그램을 써보는데요. 아주 심플하게 "Hello World"라는 문장을 컴퓨터 스크린에 띄워두는 겁니다. 매우 간단하긴 하지만 C++프로그래밍의 가장 핵심적인 요소들을 포함하고 있습니다.
| 1234567 | // my first program in C++
#include
int main() { std::cout << "Hello World!"; } | Hello World! | Edit & Run |
왼쪽 판때기는 이 프로그램을 C++로 짠 코드를 보여주고요. 오른쪽 판때기는 그 프로그램을 컴퓨터로 실행시킨 결과를 보여줍니다.
그리고 판때기 왼쪽에 있는 회색 숫자들은 프로그램에 대해 따져보거나 오류를 찾기 쉽게 만들어줍니다. 이건 프로그램의 일부는 아니에요.
그럼 이제 프로그램의 각 라인에 대해서 살펴봅시다!
Line 1: // my first program in C++슬래시('/') 두개는 프로그래머가 넣어놓은 말이지만 프로그램에 어떤 영향도 주지는 않습니다. 프로그래머들은 이걸 사용해서 코드나 프로그램에 대한 짧은 설명 등을 집어넣곤 합니다. 이 경우에는 프로그램의 간단한 서두를 써놓은 것 뿐입니다.
Line 2: #include
Line 3: 빈 라인빈 라인들은 프로그램에 아무 영향도 주지 않습니다. 그냥 코드의 가독성을 위한 거에요.
Line 4: int main ()이 행은 함수의 범위를 생성합니다. 기본적으로 하나의 함수는 코드들의 집합이고, 하나의 이름을 갖는데요. 이 경우에는 main이라는 이름을 받았습니다. 함수들에 관해서는 다음 챕터에서 자세하게 논의하게 될 겁니다. 하지만 필수적으로 함수의 정의는 타입(int)이나 이름(main), 그리고 괄호쌍()들로 이루어진다는 사실만큼은 알아둬야 합니다. 아 그리고 괄호쌍에는 선택적으로 무언가를 더 넣을 수가 있어요.
main이라 명명된 함수는 모든 C++ 프로그램에서 가장 특별한 함수입니다. 이 특수한 함수는 프로그램이 실행될 때 호출되는데요. 모든 C++프로그램의 실행은 main함수로부터 시작이 됩니다. 코드의 어느 부분에 위치하든간에 말이에요.
Lines 5&7: { }5라인에 있는 여는 중괄호는 main 함수 정의의 시작을 나타내고, 7라인에 있는 닫는 중괄호는 함수의 끝을 나타냅니다. 이 중괄호 사이에 있는 모든 것들은 main이 호출될 때 수행될 행동들을 정의하는 함수 몸체(body)입니다. 모든 함수는 중괄호로 시작과 끝을 나타냅니다.
Line 6: std::cout << "Hello World!";이 라인은 하나의 문장(statement)을 보여주는데요. 하나의 문장은 실제로 영향을 주는 하나의 표현식(expression)입니다. 그리고 이건 마치 프로그램의 살점과도 같아서 실제로 나타나는 행동들을 나타냅니다. 문장들은 함수의 몸체 안에서 나타나는 것과 같은 순서대로 실행이 됩니다. 이 문장은 세가지의 요소를 포함하는데요. 첫번째로, std::cout는 표준 문자 출력 도구(standard****character output device)를 뜻합니다. 그런데 보통은 그냥 컴퓨터 스크린에 써요.두번째로, 삽입 연산자(<<)는 뒤에 따라오는 것이 std::cout에 삽입되는 것을 나타냅니다.마지막으로, 따옴표 안에 있는 문장("Hello world!")은 표준 출력에 들어갈 내용물을 보여줍니다.
문장이 세미콜론(;)으로 끝났는데요. 이 문자는 문장의 끝을 표시합니다. 영어에서 구문의 끝을 표시하듯이 말이죠. 그리고 C++의 모든 문장들은 세미콜론으로 끝을 내야 합니다. 그리고 대부분의 문법 오류 중 하나가 세미콜론을 빼먹는 것이기도 하죠.
그리고 프로그램 모든 라인이 실제로 실행된다는 보장은 없습니다. 한 라인은 주석을 포함하고(//로 시작되는 거요). 한 라인은 전처리기 지시자입니다(#으로 시작하는 거요). 또 한 라인은 함수를 정의합니다. 이 경우에는 main 함수죠. 그리고 마지막 한 라인은 세미콜론으로 표현식의 끝을 장식하는데요(cout에 삽입되는 거요.), 이건 main 함수의 중괄호 블럭 안에 있었습니다.
이 프로그램은 사람이 더 쉽게 읽고 이해할 수 있도록 여러 줄로 구성되고 적절하게 들여쓰기되어 있습니다. 그러나 C++은 들여 쓰기에 대한 엄격한 규칙이나 개행으로 문장을 분리하는 것에 대한 엄격한 규칙을 가지고 있지 않습니다.
예를 들어, 이것 대신에
| 1234 | int main () { std::cout << " Hello World!"; } | Edit & Run |
이렇게 쓸수도 있습니다. :
| | int main () { std::cout << "Hello World!"; } | Edit & Run |
한 줄에 전부 다 들어가 있지만, 이전의 코드와 완전히 같은 의미를 가집니다.
C++에서, 표현식들 사이의 구분은 세미콜론으로 끝을 찍는 것으로 명시됩니다. 행을 나눈다고 구분이 되지는 않아요. 많은 표현식들을 한 라인에 쓸 수도 있지만, 각자 다른 라인에 써줄 수도 있습니다. 코드를 다른 라인들로 구분해놓는 것은 그저 사람이 읽기에 더 나은 가독성을 위한 겁니다. 하지만 프로그램의 실제 행동에는 어떤 영향도 주지 않습니다.
이제 우리의 첫번째 프로그램에 표현식을 더 추가해보죠!
| 12345678 | // my second program in C++
#include
int main () { std::cout << "Hello World! "; std::cout << "I'm a C++ program"; } | Hello World! I'm a C++ program | Edit & Run |
이 경우에는 두개의 표현식에 std::cout에 각각 두개의 삽입을 수행했습니다. 다시 한번 말하지만 코드를 여러 라인으로 구분해놓는 것은 간단하게 프로그램의 가독성을 높이기 위한 겁니다. 때문에 main을 이렇게 하는 것도 완전히 유효합니다.
| | int main () { std::cout << " Hello World! "; std::cout << " I'm a C++ program "; } | Edit & Run |
그리고 더 많은 라인으로 나눌 수도 있습니다.
| 1234567 | int main () { std::cout << "Hello World!"; std::cout << "I'm a C++ program"; } | Edit & Run |
그리고 그 결과는 이전과 완벽하게 같을 겁니다.
#으로 표시되는 전처리 지시자는 일반적인 규칙과는 달라서, 표현식이 되지 못합니다. 컴파일이 시작되기 전에 전처리기에 의해서 읽히고 수행되기 때문이죠. 전처리 지시자들은 특정한 하나의 줄에만 있어야 하는데요. 표현식이 아니기 때문이기도 하고요. 세미콜론으로 끝낼 수도 없습니다. 주석
위에서 적어놓은 것처럼, 주석은 프로그램의 작동에 아무런 영향도 주지 않습니다. 그렇지만 프로그램이 무얼 하고 어떻게 동작하는지를 코드 내에 바로 넣어줄 수 있는 중요한 도구이기도 합니다.
C++은 두가지의 주석을 제공합니다.
| 12 | // line comment /* block comment */ | |
첫번째 주석은 라인(행) 단위 주석인데요. 슬래스 기호 한쌍으로 그 라인의 끝까지를 전부 실제 실행코드에서 빼버립니다.
두번째는 블럭 단위 주석이라고 하는데요, /* 문자로부터 */ 문자가 처음 다타나는 지점까지 전부 빼버립니다. 여러개의 라인도 포함할 수가 있죠.
우리의 두번째 프로그램에 주석을 추가해봅시다!
| 12345678910 | /* my second program in C++ with more comments */
#include
int main () { std::cout << "Hello World! "; // Hello World! 출력 std::cout << "I'm a C++ program"; // I'm a C++ program 출력 } | Hello World! I'm a C++ program | Edit & Run |
만약 주석들이 이 주석 문자들의 조합 없이 프로그램의 소스코드 내에 포함이 된다면, 컴파일러는 그것이 진짜 C++의 표현이라고 인식을 하고 에러 메세지를 무더기로 뱉어낼 겁니다.
Using namespace std
이전에 C ++ 코드를 본 적이 있다면 std::cout대신에 cout를 사용한 것으로 보았을 수 있습니다.
이것들은 둘 다 같은 객체의 이름을 지정합니다. 첫 번째 객체는 특정되지 않은(unqualified)* *이름인 cout을 사용하고 두 번째 객체는 네임스페이스 std 내부에서 직접 특정한 std::cout를 사용합니다.
cout는 표준 라이브러리의 일부분이고, 표준 C++라이브러리에 담여있는 요소들은 전부 이름공간(namespace)이라고 불리는 공간 std에 선언이 되어있습니다.
std 네임스페이스 내부의 요소를 참조하기 위해서는 각각 전부 네임스페이스를 특정해줘서 사용하는 겁니다. 전에 cout 앞에 std::를 붙였던 것처럼 말이죠. 아니면 네임스페이스 요소들에게 가시성을 부여해주든지요.
가장 일반적인 방법은 using 선언으로 이 네임스페이스 요소들에게 가시성을 부여해주는 것입니다.
| | using namespace std; | |
위의 선언은 std 네임스페이스의 모든 요소들을 특정하지 않은 방식으로 접근할 수 있도록 허용해줍니다. 앞에 std::를 붙이지 않아도요!
이것을 염두에 두면, 마지막 예제는 아래와 같이 특정되지 않은 cout로 쓰일 수 있겠습니다.
| 123456789 | // my second program in C++
#include
int main () { cout << "Hello World! "; cout << "I'm a C++ program"; } | Hello World! I'm a C++ program | Edit & Run |
std 네임스페이스에 접근하는 방법 두가지는 전부 C++에서 유효하고 완벽하게 같은 동작을 수행합니다만. 심플과 가독성을 위해서 이 튜토리얼의 예제에서는 using 선언을 사용합니다. 하지만 되도록이면 명시적으로 지정을 해서 이름 충돌을 막는 것이 좋습니다.
네임 스페이스에 대해서는 나중에 더 자세히 설명합니다.