## 목차
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 |