본문 바로가기
C++ 독학/[C++ 독학] C++ 배우기

[C++ 독학] Hello world! <C++의 기초> 01

by NpsCause 2022. 3. 5.

Visual Studio가 설치돼있지 않으신 분들은 이전 글을 먼저 보고 오시는 것을 추천드립니다.

이전 글 : 2022.03.04 - [C++ 독학] - [C++ 독학] 기본 환경 세팅

 

Hello world!!

우리가 이전 시간에 설치했던 개발환경에 다음과 같이 입력해 봅시다.

// Hello world!!

#include<iostream>

using namespace std;

int main() {
	cout << "Hello world!!" << endl;
	return 0;
}

다 입력을 하셨으면 [Ctrl+F5]를 누르거나 맨 위 메뉴바 중에 [디버그 -> 디버그 하지않고 시작]을 눌러 실행시켜 줍시다.

ex 01

그러면 다음과 같은 결과를 보실 수 있습니다. 

 

축하드립니다! 여러분의 첫 C++프로그램을 실행시켰습니다. 

 

그럼 코드를 하나하나 분석해 볼까요?

 

 

; 세미콜론

 

; (세미콜론)은 프로그램을 작성할 때 각 구문과 구문을 구별해 주는 역할을 합니다.

 

만약 우리가 작성한 코드에서 세미콜론을 뺀다면 다음과 같은 에러를 보여줍니다.

우리 눈에는 세미콜론 하나 빠지는게 큰 차이가 없어 보이지만 컴퓨터는 다음과 같이 이해하게 됩니다.

#include<iostream>

using namespace stdint main() {
	cout << "Hello world!!" << endlreturn 0
}​

때문에 C++프로그래밍을 하실 때 뒤에 붙여야 합니다.

 

 

전처리 지시자

우리가 첫 줄에 작성했던 #include<iostream>은 과연 무슨 뜻일까요?

 

우선 이를 이해하기 위해선 C++가 어떻게 프로그램으로 빌드(build) 되는지 알아야 합니다.

 

소스코드의 빌드 과정은 다음과 같이 [전처리 -> 컴파일 -> 링크] 순서로 총 세 단계를 거치게 됩니다.

소스코드 빌드(build)과정

preprocessing(전처리) 소스코드에 담긴 메타정보(metadata)를 처리한다.
compile(컴파일) 소스코드를 컴퓨터가 읽을 수 있도록 오브젝트(object)파일로 변환한다.
link(링크) 오브젝트(object) 파일들을 애플리케이션으로 묶는다.

각 작업을 처리하는 프로그램을 전처리기(preprocessor), 컴파일러(compiler), 링커(linker)라고 부른다.

 

전처리에 대해 쉽게 설명하자면 소스코드를 컴파일 하기 '전'에 미리 실행해야 할 부분을 '처리'한다고 생각하시면 됩니다.

 

다음으로 지시자(directive)란 전처리기에 전달할 사항을 표현하고 주로 #으로 시작합니다.

 

전처리 지시자는 우리가 사용했던 #include 외에도 다양한데 자주 쓰는 전처리 지시자로는

#define, #ifdef - #endif, #ifndef - #endif, #pragma 등 이 있습니다.

 

더 많은 전처리 지시자는 아래 링크를 타고 보시면 좋을 것 같습니다. (추후 부록에도 정리해 놓겠습니다)

전처리 지시자 : https://docs.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170

 

전처리기 지시문

자세한 정보: 전처리기 지시문

docs.microsoft.com

이 중 우리가 사용했던 #include는 우리가 소스코드를 작성하며 필요한 헤더 파일(함수, 클래스 등)을 불러오는 것입니다.

즉, #include <iostream>이란 뜻은 'iostream'이라는 헤더 파일을 불러오겠다'라는 뜻으로 해석하면 됩니다.

 

여기서 헤더 파일이란? 

가볍게 설명하자면 우리가 사용할 기능들을 가지고 있는(미리 정의해 놓은) 파일입니다.

 

 

main() 함수

모든 로직의 시작과 끝 main() 함수

 

우리가 짠 코드의 모든 시작과 끝은 main() 함수에서 이루어집니다. 때문에 우리의 코드 내에서 유일한 존재이고 

만약 main함수를 두 개 사용한다면..

main함수를 2개 사용했을때

다음과 같은 에러를 만나게 되실 겁니다.

 

그리고 함수와 return 0; 에 대해서는 뒤에 따로 정리해 놓겠습니다.

 

I/O 스트림

데이터를 나르는 컨베이어 벨트

 

I/O스트림은 Input/Output stream 즉, 입출력 스트림은 프로그램의 입력과 출력을 담당합니다. 

 C++에서의 원리는 굉장히 간단한데

 

출력을 하기 위해 std::cout을 작성해 주고 << 연산자로 각 구문을 이어줍니다. 

마치 컨베이어 벨트처럼 말이죠

ex)

cout << "Hello" << "world" << "!!" << endl;​

이런 식으로 활용하셔도 됩니다. ㅎㅎ

cout << "H" << "e" << "l' << "l" << o" << "w" << "o" << "r" << "l" << "d" << "!!" << endl;

맨 뒤에 나오는 'endl'은 줄을 바꿔주는 코드입니다. 

이와 같은 문자를 이스케이프 시퀀스(excape sequence)라 부르고 '\n'로 대체 가능합니다. (endl = '\n')

더 많은 이스케이프 시퀀스는 부록에 따로 정리해 놓겠습니다.

 

 

 

네임스페이스

코드에서 이름 중복 문제의 해결

 

조금 어려운 개념일 수 있습니다. 코딩을 처음 해보시는 분들은 넘어가셔도 좋습니다. 뒤에서 더 자세히 설명하겠습니다.

 

만약 여러분이 코드를 작성하다가 'value'라는 중복된 이름의 코드를 작성했다고 생각해 봅시다.

코드가 10줄이면 하나하나 바꿔주면 되겠지만 1000줄 10000줄이 넘어간다면.. 상상하기도 싫은 작업을 밤새 해야 할 수도 있습니다.

 

이런 문제를 해결해주기 위해 namespace가 존재합니다. 뒤에서 자세히 설명하겠지만 간단히 짚고 넘어가자면 

'value'라는 이름을 각각 다른 공간에 선언하는 것입니다.

ex)

namespace space1 {
	int value;
}

namespace space2 {
	int value;
}

이렇게 되면 같은 value지만 각각 다른 공간에 정의 되게 됩니다. 

 

그리고 value값을 사용하려면 space1::value, space2::value와 같이 :: 스코프 지정 연산자(scope resolution operator)를 사용합니다. 하지만 이렇게 되면 value를 사용할 때마다 귀찮음을 감수해야 합니다.

 

하지만 using namespace를 사용한다면 space1:: , space2:: 를 붙이지 않고도 value를 사용할 수 있습니다.

 

만약 space1을 기본으로 사용하려면 using namespace space1을

space2를 기본으로 사용하려면 using namespace space2를 추가하면 됩니다.

 

때문에 우리가 using namespace std; 를 추가한 이유는 std:: 를 쓰고 싶지 않아서입니다.

using namespace std; 를 뺀다면 

#include<iostream>

int main() {
	std::cout << "Hello world!!" << std::endl;
	return 0;
}

 이런 식으로 cout과 endl 앞에 std::를 추가해 줘야겠죠?

 

 

주석

 

주석은 프로그램이 실행될 때 컴퓨터가 읽지 못하도록 블라인드 처리 해 놓은 것입니다.

 

왜 주석을 사용할까요?

대체로 자신의 코드에 설명이 필요할 때 사용합니다. 다른 개발자와 협업을 하거나 자신의 코드를 공개할 때 그 코드의 세세한 부분에서 어떤 방식으로 작동하는지, 만든 날짜, 만든 이, 최근 업데이트 날짜 등을 상세히 적어 놓을 수 있습니다.

 

주석은 // 를 사용하고 뒤에 올 설명(comment)를 적으면 해당 행(row) 뒤에 오는 문자는 컴파일되지 않습니다(컴퓨터가 실행시키지 않습니다). 

cout << "hello world!!" << endl; // cout << "comment"; <- 이 부분은 실행하지 않습니다.

 

// 를 사용한 주석은 한 행(row)에 대한 주석이고 여러 열(column)에 대한 주석은 /* */ 를 사용합니다.

cout << "H" << endl;
cout << "e" << endl;
/* cout << "l" << endl;		<-
cout << "l" << endl;		<- 실행되지 않음	
cout << "0" << endl; */ 	<- 
cout << "!" << endl;
cout << "!" << endl;

 

 

마치며

 

어렵고 지루하셨을 텐데 끝까지 따라오신 분들 수고 많으셨습니다.

마무리로 "C++ 프로젝트" 에서 연습문제들을 풀어보시면 많은 도움 되실 거라 믿습니다.

2022.03.06 - [C++ 독학/[C++독학] 프로젝트] - [C++ 독학] 정보를 출력해보자! <프로젝트 01>

 

[C++ 독학] 정보를 출력해보자! <프로젝트 01>

정보를 출력해보자 자신의 정보를 출력하는 프로그램을 만들어 봅시다. 출력결과. 다음과 같이 출력하는 프로그램을 작성해 주세요! 만약 어렵다면 이전 글을 보고 오시길 바랍니다. 2022.03.05 - [

npscause.tistory.com

 

댓글