본문 바로가기
ZAION/C++

[C++]Lec01. Program Structure

by 우기37 2024. 4. 23.

## 목차

1. 빌드 프로세스

2. 오류의 종류

3. 기본 구조, 기능과 용어

 

 

 

#1 빌드 프로세스

1 - 1) 용어

- 프로그래밍 언어 : 고수준의 소스 코드 작성에 사용, Human-readable

- 오브젝트 코드 : Machine-readable, 컴퓨터가 실행할 수 있는 코드

- 컴파일러 : 소스코드를 오브텍트 코드로 변환하는 도구

- 링커 : 오브젝트 코드를 실행 파일(.exe)로 변환하는 도구

- 테스트 & 디버깅 : 프로그램에 존재하는 오류를 찾고, 수정하는 과정

- IDE(Integrated Development Environment) :

 - 텍스트 에디터 + 컴파일러 + 링커 + (디버거)

 - 텍스트 에디터 : .cpp 소스 코드 / .h 헤더 파일의 편집

 

 

1 - 2) Build Process

 

 

 

1 - 3) I/O

#include <iostream>

int main() {
	int favoriteNumber;
    
    std::cout << "Enter the number: ";
    std::cin >> favoriteNumber;
    std::cout << "You entered " << favoriteNumber << std::endl;
    
    return 0;
}

 

C Style

#include <stdio.h>

void main() {
	int favoriteNumber;
    printf("Enter the Number: ");
    scanf("%d", &favoriteNumber);
    printf("You entered %d", favoriteNumber);
}

 

 

1 - 4) (실행, 디버깅) F5

- 코드를 빌드(=컴파일=링크)하고 exe를 실행. 즉, F5만 누르면 컴파일 + 링크 과정이 통합적으로 실행된다.

- 출력을 보여주는 콘솔창이 나타난다. 프로그램이 종료된 후, 아무 키나 누르면 콘솔 창이 닫힌다. 창을 닫지 않고 다시 빌드하려고 하면 문제 발생하는 경우가 있어 주의해야 한다.

 

 

 

 

#2 오류의 종류

2 - 1) Compiler Error

프로그래밍 언어의 규칙을 위반하는 경우 발생한다.

 

문법적 오류(코드 자체의 오류)

ex. ';' 이 빠져 있음

std::cout << "Errors << std::endl;

return 0

 

의미 오류

ex. 문자와 숫자를 더하기 연산 할 수 없음

int a = 5;
string b = "Hello World!";

a + b;

 

 

2 - 2) Compile Warnings

코드에 잠재적인 문제가 있을 것으로 예상될 때

빌드는 가능하지만, 무시할 수 없음

 

int distanceDriven;
std::cout << distanceDriven;

*위 코드의 경우 VS 2022(MSVC컴파일러 기본 설정)에서는 오류(Error)로 처리

* 컴파일러마다 동작이 약간씩 다르 수 있다.

 

 

2 - 3) Linker Errors / Runtime Errors

링크 에러

- obj 파일의 링크 과정에서 오류가 있을 경우

- 주로 라이브러리 또는 obj 파일을 (어떤 이유에서) 찾을 수 없는 경우

 

런타임 에러

- 프로그램의 실행 도중 발생하는 오류

- ex) Divide by zero, file not found, out of memory, etc...

- 프로그램의 crash

- 예외 처리를 통해 문제 발생에 따르는 처리를 할 수 있다.

 

 

2 - 4) Logical Errors

- 프로그램의 동작에 관한 논리적 오류

- 프로그램 작성자의 실수가 원인

- 테스트 과정을 통해 찾아내고, 수정해야 한다.

 

if (age >= 19) {
	std::cout << "You can drink!";
}

 

 

 

#3 기본 구조, 기능과 용어

3 - 1) 구성요소 - keyword, identifier, operator

Keyword

- 약 90개의 키워드 (변수 타입, if, for 등)

- 언어 자체에서 예약된 단어들

 

Identifier

- 변수, 함수, 타입 등 개발자가 지정하는 부분

- 대소문자 구분

 

Operator

- +, -, *, /, >>, <<, ::, ...

 

이러한 구성요소들이 모여 "문법"을 이룬다.

 

더욱 많은 요소는 아해 cppreference를 참고해주세요.

https://en.cppreference.com/w/

 

 

3 - 2) 전처리기 지시문 - #include

전처리기(preprocessor)

- 컴파일 이전에 처리된다.

- '#'으로 시작한다.

// include
#include <iostream>
#include "myFile.h"

// define
#ifdef
#ifndef
#define
#undef

#pragma

 

 

#include

- 단순한 복사 붙여넣기이다.

- 프로젝트 속성 -> C/C++ -> 전처리기 -> 파일로 전처리를 통해 확인

#include <iostream>

int main() {
	int a = 0;
    
    return 0;
}

 

 

#define

- 단순한 복사 붙여넣기

- Platform independency 구현, 코드 단축, debug 못적 등으로 다양하게 활용 가능하다.

#include <iostream>

#define

#ifdef DEBUG
#define LOG(x) std::cout << x << std::endl;
#else
#define LOG(x)
#endif

int main() {
	Log("Hello");
}

 

 

3 - 3) main() 함수

모든 C++ 프로그램은 하나의 main() 함수를 가져야 한다.

main() 함수는 프로그램의 진입점(=프로그램이 실행되면 가장 먼저 실행되는 함수)

리턴값 0이 올바른 프로그램 실행을 의미한다.

 

두 가지 버전이 있다.

1.

int main() {

}

>> program.exe

 

2.

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

}

>> program.exe argument1 argument2

 

동일 프로젝트에 cpp파일을 계속 추가하여 작성하면 오류가 발생한다. 하나의 프로그램에 2개 이상의 main 함수가 존재하기 때문이다.

 

해결법1) 1. 솔루션을 우클릭하여 추가 -> 2. 새 프로젝트로 별도의 프로젝트를 만들어 사용 -> 3. 이때, 현재 빌드하고자 하는 프로젝트를 우클릭하여 "시작 프로젝트로 설정" 필요

해결법2) 현재 빌드하고자 하는 cpp 이외의 코드는 전체 주석처리하고 빌드

 

 

3 - 4) 네임스페이스 - namespace

소속을 지정해 주는 역할을 한다.

std::cout에서std::는 std라는 네임스페이스에 접근할 때 쓰는 표현이다. 

'::' : scope resolution operator

 

네임스페이스는 내부 식별자(형식, 함수, 변수 등)에 범위를 부여해 여러 라이브러리를 포함할 때 이름이 충돌하는 것을 방지하려고 사용한다. 또는 코드가 커지면, 내가 만든 함수들 사이에서도 실수로 충돌하는 것을 방지한다.

 

그래서 서로 다른 namespace로 그룹화하여 충돌을 방지할 수 있다.

 

그런데 만약 입출력문 앞에 매번 std:: 를 붙이는 것이 번거롭다면 소스 앞부분에 using namespace std 코드를 작성해 생략할 수 있다. 그러나 using namespace를 모든 코드에 넣는다면 namespace의 기능을 상실할 수 있다.

 

#include <iostream>

int main() {
	int favorite_number;

	std::cout << "Enter your favorite number between 1 and 100 : ";
	std::cin >> favorite_number;
	std::cout << "Amazing! That's my favorite number too!" << std::endl;

	return 0; 
}

 

 

#include <iostream>
using namespace std;

int main() {
	int favorite_number;

	cout << "Enter your favorite number between 1 and 100 : ";
	cin >> favorite_number;
	cout << "Amazing! That's my favorite number too!" << endl;

	return 0; 
}

 

 

3 - 5) 주석 - //, /* */

- 프로그래머가 읽을 수 있는 정보를 제공하기 위함(협업, 유지보스의 목적이있다.)

- 전처리 단계에서 무시(삭제)되기 때문에 프로그램의 동작과는 무관하다.                                                                      

- "//", "/* */"

 

 

 

3 - 6) 입출력 - cin/cout

cout <<

- C++의 표준 력 스트림, 삽입 연산자

- 순차적인 출력이 가능하다.

- 줄바꿈은 필요한 경우 명시해야한다.

cout << "My age is" << age << endl;
cout << "My age is" << age << "\n";

 

cin >>

- C++의 표준 입력 스트림, 추출 연산자

- 순차적인 입력이 가능하다.

- 변수의 타입에 맞게 해석이 불가능한 입력이 주어질 땐 undetermined behavior

 

 

 

 

※본 블로그는 학습을 하며 제가 이해한 내용을 바탕으로 작성되어 실제 정의와 다를 수 있습니다.

 

참고문헌

GitHub - diskhkme/cpp_lecture_material: C++ 프로그래밍 강의 자료

https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=K842939734&start=pnaver_02

 

 

 

 

 

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

[C++]Lec02. Basic Syntax  (0) 2024.04.23
[C++]Lec01. Variable and Constant  (1) 2024.04.23
[C++]Lec05. OOP / Class  (0) 2024.04.18
[이것이 C#이다]Ch.07 클래스 - 1  (0) 2024.02.05
[이것이 C#이다]Ch.06 메소드로 코드 간추리기 - 2  (0) 2024.02.05