C++

3. Structure of a C++ Program

Kelvin의 게임개발 2023. 11. 22. 00:44
728x90
반응형

1. 전처리 장치 / 지시문 (Preprocessor)

 
C++의 전처리 장치 (Preprocessor)는 컴파일러가 보기전에 모든 주석을 제거하고 소스코드를 준비 하는 장치이다
 
전처리 지시문은 #으로 시작하며 해당 명령을 실행한다
 
전처리 장치는 C++을 이해하지 못한다 단지 지시사항을 실행하고 컴파일러에 맞는 소스코드를 준비시킨다 (컴파일러는 C++을 이해하는 장치)

#include <iostream> //가장 흔하게 사용되는 #include 전처리 지시문 (iostream파일을 include하라는 명령)
#include "CPPStudy.h"

#if
#elif
#else
#endif

#ifdef
#ifndef
#define
#undef

#line
#error
#pragma

이처럼 많은 전처리 지시문들이 존재한다
 
 

2. 주석 (Comment)

 
주석 (Comment)은 거의 모든 프로그래밍 언어에 존재한다
주석은 소스코드에서 읽을 수 있는 프로그래머의 설명이다
주석은 컴파일러에 들어가지 않는다 (전처리 장치가 컴퍼일러에 맞는 소스코드를 준비할 때 제거하기 때문)
 
무엇을 했고 왜 했는지 등을 작성한다 (당연하거나 매우 직관적인 코드에는 작성하지 않고 알기 어려운 로직을 설명할 때 작성한다 혹은 알고리즘이 변경되거나 할 때 작성하는것이 좋다)

좋은 주석이 나쁜 코드를 좋게 만들지 않는다
 
주석으로 Version Control을 하는건 좋지 않다 ex) 11/11/2017 @Kelvin Fix
주석이 아닌 소스컨트롤로 버전 컨트롤을 하자 (git, perforce, svn...)
 
코드를 수정했다면 주석도 당연히 수정되어야 한다

//This is Comment -> //로 한줄짜리 주석을 만들 수 있다 (SingleLine Comment)

/*This is
Comment*/ -> /**/로 여러줄 주석도 만들 수 있다 (MultipleLine Comment)

 
 

3. main()

 
모든 C++ 프로그램에서는 main함수가 1개는 반드시 있어야 한다 (수백개의 파일이 존재하고 주요기능이 main에 담겨있어야 한다)
 
main함수가 return을 만나고 0을 반환하면 운영체제는 정상적으로 종료되었다 인식하고 0이 아닌 다른수가 반환되면 운영체제는 잘못된 함수의 종료로 인식하고 판단한다 (무조건 정수를 반환해야 함)
 

int main()
{
		

	return 0;
}

int main(int argc, char* argv[])
{

	return 0;
}

main함수는 이와 같이 2개 종류가 있다 매개변수가 없는 main함수는 운영체제로부터의 정보가 실행되지 않는다
 
매개변수가 있는 main함수는 운영체제로부터 정보를 받는다 이 매개변수들은 컴파일러에게 두 가지 정보가 필요하다고 전달한다는 의미이다 argc는 전달될 정보의 개수, argv[]는 실질적으로 넘긴 정보이다
 
 

4. namespace

 
프로젝트가 복잡해지며 본인이 만든 C++ 코드, 표준 라이브러리, 서드파티 개발자들의 코드가 합쳐지게 된다 이때 같은 네이밍을 사용하게 될 수 있다
 
동일한 네이밍을 사용하게 되면 컴파일러는 어떤 이름을 사용해야 할 지 모른다 따라서 Naming Conflict가 발생하게 된다
ex) 사용하는 외부 라이브러리에서 cout이라는 네이밍을 사용했다면 컴파일러는 std::cout과 외부 라이브러리에서 네이밍한 cout중 어떤걸 사용할 지 모르게 된다 (Naming Conflict)
 
이러한 Naming Conflict를 해결하기 위해 namespace를 컨테이너 처럼 사용한다
ex) std에 있는 cout, 외부 라이브러리 namespace에 있는 cout으로 구분하게 된다
 
namespace명::이름 으로 사용하면 된다
ex) std::cout, std::cin  std는 표준(standard)을 의미한다

int main()
{
	std::cout << "Hello" << std::endl; //std namespace에 있는 cout, endl을 사용한다는 의미

	return 0;
}

::연산자는 범위 연산자(Scope Resolution operator)이다
 
하지만 매번 namespace명::이름 이런 방식을 사용하기엔 불편하다 이를 해결하는 방법은 using namespace 이름; 을 사용하는 것이다 (혹은  using namespace이름::네이밍; 으로 개별 선언도 가능함)

using namespace std; //std namespace를 사용한다 선언

using std::cout;
using std::cin;
using std::endl;
//이런식으로 모든 namespace가 아닌 원하는것만 using으로 선언도 가능하다

int main()
{
	cout << "Hello" << endl; //std::가 없이 잘 돌아간다

	return 0;
}

 
 

5. Input / Output (I/O)

 
cout은 Output Stream에서 데이터를 출력 후 console에 출력한다
cin은 값 Input Stream에서 데이터 입력 (Enter키로 입력, 우선 buffer에 저장되고 우측의 변수의 타입 검사후 변수에 저장한다, 공백은 무시된다)
 
endl은 입/출력 종료 후 한줄 아래로 커서를 내린다
 
<<는 Insertion operator (삽입 연산자)이고 output Stream에서 데이터를 출력한다
>>는 Extraction operator (추출 연산자)이고 input Stream에서 데이터를 입력한다
 
현재는 단순한 데이터 출력/입력뿐이지만 추후에 FileStream 에서 데이터 삽입 / 추출도 가능하다
 
\n은 한 줄 아래로 내려준다
 

int main()
{
	int num1;
	int num2;

	cout << "Enter a First Integer";
	cin >> num1;

	cout << "Enter a Second Integer";
	cin >> num2;

	//이때 enter를 누르지않고 값을 공백을 사이에 두고 연속으로 입력하게 되면 두번째 입력이 바로 들어가게 된다 ex) 100 공백 200 바로 입력 시 num2에는 buffer에 남아있는 200이라는 값이 자동으로 들어가게 된다

	cout << "First Number is : " << num1 << "\n" << "Second Number is : " << num2;
}

 

int main()
{
	int num1;
	int num2;

	cout << "Enter Two Integer Separated with a Space:";
	cin >> num1 >> num2;
	cout << "Result : " << num1 << "and" << num2;
    
    //마찬가지로 값 두개를 공백을 가지고 연속으로 입력하면 buffer에 2개 값이 들어가게 되고 각각의 값이 num1, num2에 들어가게 된다
}

 

int main()
{
	int num1;
	double num2;

	cout << "Enter Integer : ";
	cin >> num1;

	cout << "Enter Double : ";
	cin >> num2;

	cout << "Integer is : " << num1 << endl;
	cout << "Double is : " << num2 << endl;
    
    //이때 10.5를 입력하게 된다면 결과는 10, 0.5가 나온다
    //.이라는 decimal point를 만나면 그 전의 10을 buffer에서 정수로 가져와 num1에 저장, 나머지 .뒤의 숫자인 0.5를 double로 인식하여 buffer에서 값을 가져와 num2에 저장하기 때문이다
	
    //타입을 잘 맞춰 사용해야 한다
}

 

728x90
반응형

'C++' 카테고리의 다른 글

6. Operators (연산자)  (131) 2023.12.12
5. Array And Vector  (202) 2023.12.09
4. Variables and Constants  (110) 2023.12.07
2. Getting Started C++(2)  (1) 2023.11.21
1. Getting Started C++(1)  (4) 2023.11.17