관리 메뉴

SImpAS

C++ 기초 :: 프로그램의 시작 본문

IT - Programming(시작)/C++

C++ 기초 :: 프로그램의 시작

SIAS simpas 2018.03.07 13:44

프로그래밍 언어를 배우는 최고의 방법은 역시 직접 프로그램을 작성하는게 아닌가 싶다. 일반적으로, 초심자가 프로그램을 작성하기 시작할때, 작성하는 프로그램으로, 간단하게 컴퓨터 화면으로 "Hello World"를 띄워주는 프로그램이 있는데, 그것을 "Hello World" 프로그램이라고 부른다. "Hello World"는 매우 간단하지만, C++ 프로그램의 기본적인 요소들을 모두 포함하고 있다:


1
2
3
4
5
6
// my first program in C++
#include <iostream>
 
int main(){
    std::cout << "Hello World!";
}

cs


Hello world!

cs


첫번째 박스의 텍스트들은 C++ 프로그램을 코드이며, 바로 다음 나오는 박스는 첫번째 박스 코드가 컴퓨터에 실행된 결과를 보여준다.
프로그램에 에러가 발생했을 때, 코드의 왼쪽 숫자를 참고해서 쉽게 에러를 고칠 수 있게 해준다(프로그램의 일부가 아니다).

위 프로그램을 한줄 한줄 분석해보자:

1번째 줄 : // my first program in C++

// - '슬래시' 기호 두개는 프로그래머에 의해서 삽입된 주석임을 나타내고, 프로그램에 어떠한 영향도 끼치지 않는다. 그럼 왜 사용하지
프로그램에 아무 영향을 끼치지 않는다고 해서, 중요하지 않은게 아니다. 오히려, 프로그래머는 짧은 설명이나 프로그램 혹은 코드에 관한 걱정이나 관찰 같은 것을 적는데, 이 글이 프로그램의 규모가 커졌을 때, 프로그램이 어떠한 프로그램인지 설명하고, 코드가 어떤 역할을 하는지 설명하기 때문에 매우 중요한 역할을 한다고 볼 수 있다.

위의 프로그램의 경우에는, 프로그램을 간단하게 소개하는 글이다.

2번째 줄 : #include <iostream>


# - '해쉬' 기호로 시작하는 줄은 '전처리기'에 의해서 해석되는 지시적인 글이다. 이러한 줄은 프로그램이 컴파일을 시작하기 전에 우선적으로 해석되는 특별한 줄이다.

위 코드의 경우에, #include <iostream>이라는 지시는, 전처리기가, C++코드의 한 부분이며, 'Hello World!'와 같이 표준 입력과 표준 출력에 관해서 작동하도록 하는 iostream 이라고 알려진 header를 포함하도록 한다.

3번째 줄 : 빈 줄


프로그램에 아무런 영향을 끼치지 않는다. 프로그램의 가독성을 올리는 역할을 한다.

4번째 줄 : int main ()


이 줄은 함수의 선언을 시작한다. 본래, 함수는 이름이 주어진 코드들의 집합이다 : 위 코드의 경우에는 "main"이라는 이름을 가지고 있다.


함수에 대해서는 이후 강좌에서 더 자세히 배울 예정이지만, 함수를 정의할 땐, 필수적으로, 자료형(int), 이름(main), 괄호 한 쌍(()), 그리고 선택으로 매개변수를 나열한다.


main 이라는 이름을 가진 함수는 C++ 프로그램에서 특별한데 이는 프로그램이 실행 될때 호출되는 함수로, C++ 프로그램 이 실행 될땐, main함수가 코드의 어디에 위치해 있든, 항상 main 함수와 함께 시작한다.


5번째, 7번째 줄 : { 그리고 }


{ - '열리는 중괄호'기호는 main 함수의 시작을 정의하고, } - '닫히는 중괄호'는 main 함수의 끝을 정의한다. 이 중괄호 안에는 main 함수가 시작될 때, 어떤 일이 발생할지 정의 해주는 함수의 몸 부분이 들어잇다. 모든 함수는 시작과 끝을 정의하기 위해 중괄호를 사용한다.


6번째 줄: std::cout << "Hello World!";


이 라인은 C++의 명령문이다. 명령문은 말 그대로, 어떠한 효과를 생산할 수 있는 표현이다. 즉, 프로그램의 실제 행동을 구체화하는 부분이다. 명령문은 함수의 몸부분이 나타나는 동시에 실행된다.


이 명령문은 세개의 부분으로 나눠진다: 첫번째로, std:cout, std:cout은 standard character output device를 나타내고, 일반적으로 컴퓨터 화면을 지칭한다. 

두번째로<<, 이 기호 뒤에 따라 오는 문자들을 std:cout 으로 삽입한다.

마지막으로, "Hello World!", 이 문장은 표준 출력으로 들어가는 문장이다.


모든 명령문들이 세미콜론 (;)으로 끝나는걸 알아차리도록 하자. 이 문자는, 문장의 끝에 오는 마침표 (.)처럼 명령문의 끝에 표시된다. 모든 C++ 명령문은 세미콜론 문자를 끝에 붙여야한다. 세미콜론을 잊어버려서 생기는 에러가 C++에서 가장 흔히 발생하는 구문에러이다. 항상 세미콜론을 끝에 붙이는걸 기억하자.


위의 모든 코드가 실행될때, 눈에 띄는 결과로 보여지는건 아니라는걸 알게 됐을 것이다. 주석을 포함한 문장도 있고(//로 시작), 전처리기로 인해 먼저 실행되는 코드도 있으며(#으로 시작), 함수가 정의 되는 줄과(위와 같은 경우에는 main함수), 함수의 기능을 나타내는 함수의 몸 부분과( '{' 와 '}' 사이 ), 함수의 역할을 직접적으로 나타내는 명령문들이 있고(std:cout), 그 명령의 끝마침을 알리는 문자도 있다(;).


프로그램은 다른사람들이 코드를 읽을때, 이해하기 쉽게 하기위해 다른 의미를 가진 코드는 다른 줄에 작성하며, 적절하게 들여쓰도록 작성되어 왔다. 하지만 C++은 들여쓰는거나 명령문을 어떻게 나눠서 써야하는지에 대해 엄격한 규칙은 없다. 예를들어, 


1
2
3

int main (){
    std::cout << "Hello World!";
}


cs

위 코드 대신에 다음 코드를 써도 무관하다 :


int main () { std::cout << "Hello World!"; }
cs

위의 한줄에 있는 모든 내용이, 정확히 그 전의 코드와 같다.

C++에서, 명령문 사이의 구분은 세미콜론으로 이루어지기때문에, 개행을 하던지 말던지, 세미콜론만 붙이면, 코드의 목적에 전혀 문제가 생기지 않는다. 그렇기 때문에, 많은 명령문을 한줄로 작성 할 수 있다. 코드를 다른 줄로 나누는건, 그 코드를 읽을지도 모르는 사람들을 위해 읽기 좋도록 만들 뿐이다. 실제 프로그램의 기능에는 아무런 영향을 끼치지 않는다.


그럼 이제, 우리의 첫번째 프로그램에 부가적인 명령문을 추가해보자 : 


1
2
3
4
5
6
7
// my second program in C++
#include <iostream>
 
int main(){
    std::cout << "Hello World! ";
    std::cout << "I'm a C++ program";
}
cs

Hello World! I'm a C++ program
cs

이 경우에는, 프로그램은 std::cout에 두개의 문장을 삽입하여, 두가지 다른 명령문을 실행했다. 다시한번 말하지만, 줄을 분리하는건 가독성을 높이기 위함이기때문에, 다음 main 함수도 완벽하게 똑같이 작동한다:


int main() { std::cout << "Hello World! "std::cout << "I'm a C++ program"; }
cs


또한, 이 소스코드는 더 많은 줄로 나뉘어져도 상관 없다: 


1
2
3
4
5
6
int main(){ 
    std::cout << 
        "Hello World! "
    std::cout << 
        "I'm a C++ program"
}
cs


그리고 결과 역시 그 이전 예제와 똑같이 나온다.


전처리기의(#으로 시작) 문장은 명령문이 아니기 때문에, 일반적인 규칙에서 벗어나있다. 이 문장들은 컴파일이 시작하기전에 읽혀지고 처리된다. 전처리기의 문장은 반드시 하나의 줄에 작성되어야 하고, 명령문이 아니기 때문에, 세미콜론(;)으로 끝맺으면 안된다.



주석

위에 명시되어 있듯이, 주석은 프로그램에 아무런 영향을 끼치지 않는다. 하지만, 어떠한 코드인지, 어떤 작동을 하는지에 대한 문서형식의 중요한 도구로써 제공되고 있다. 


C++은 두가지의 주석 방법을 지원한다:


1
2
// line comment
/* block comment */
cs


한줄주석이라 알려진 첫번째 주석은, '//' 기호 바로 뒤부터 '//' 와 같은 줄의 끝 사이의 내용은 전부 무시해버린다.

블록주석이라 알려진 두번째 주석은, '/*' 와 '*/'사이에 오는 모든 내용을 무시하며, 여러줄을 한번에 무시할 수 있다.


우리의 두번째 프로그램에 주석을 추가해보자:


1
2
3
4
5
6
7
8
9
/* my second program in C++
   with more comments */
 
#include <iostream>
 
int main(){
    std::cout << "Hello World! ";        // prints Hello World!
    std::cout << "I'm a C++ program";   // prints I'm a C++ program
}
cs

Hello World! I'm a C++ program
cs


만약 주석을 '//' 나 '/**/' 기호와 함께 쓰지 않는다면, 컴파일러는 주석 내용을 C++ 코드로 인식해서, 몇몇 에러 메시지와 함께, 컴파일에 실패한다.


Using namespace std

만약 C++ 코드를 이전에 본적 있다면, 아마 std::cout 대신에, cout만을 쓰는 코드를 봤을지도 모른다. 이들은 이름이 같은 개체로: 첫번째는 즉석에서 namespace std의 권한을 얻었고(std::cout), 두번째는 namespace std의 권한을 즉석에서 얻지 않은 것이다.


cout은 standard library, 표준 라이브러리의 한 부분이고, C++ 라이브러리의 모든 요소들은 모두 namespace라는것에 의해 선언된다. cout은 namespace std로 선언된다. 


std 라는 네임스페이스 안의 요소들을 사용하기 위해서는 프로그램의 쉘 또한 각각의 요소들에 권한을 부여하고 그 요소들을 사용하기 위해서는 요소의 접두사로서 'std::'를 적어주거나, 그것의 구성을 가시적으로 소개하는 방법이 있는데, 가장 전형적인 방법이 using으로 선언하는 방법이다:


using namespace std;
cs


위의 선언은 std:: 접두사 없이 std namespace의 모든 요소에 접근 가능하도록 한다.


이러한 방법으로, 위의 예제는 다음과 같이 다시 작성될 수 있다:


1
2
3
4
5
6
7
8
// my second program in C++
#include <iostream>
using namespace std;
 
int main(){
    cout << "Hello World! ";
    cout << "I'm a C++ program";
}
cs

 

Hello World! I'm a C++ program
cs


std namespace에 접근하는 2가지 방법은 모두 C++에서 사용가능하며 완벽하게 같은 기능을 한다. 비록 접두사로 namespace 권한을 얻는 방법은 namespace 충돌이 절대 일어나지 않지만, 가독성을 위해서 이 강좌에서는 using으로 선언을 하는 방법을 더 자주 사용할 것이다.


namespace에 대해서는 추후의 강좌에서 더 세부적으로 설명한다.


이상.

'IT - Programming(시작) > C++' 카테고리의 다른 글

C++ 기초 :: 변수와 자료형  (0) 2018.03.11
C++ 기초 :: 프로그램의 시작  (0) 2018.03.07
Intro :: 컴파일러  (2) 2018.03.02
0 Comments
댓글쓰기 폼