※ 본 포스팅은 유튜브 C++ Full Course 강의를 기반으로 제가 직접 정리한 C++ 기본 문법에 대한 글입니다.
서론을 잠깐 말하자면, C++에 대해 배운 것을 까먹지 않기 위해 블로그에 정리하는 것입니다. 기본적으로 다른 프로그래밍 언어를 다룬 적이 있기 때문에 강의 영상을 보고 제가 제 마음대로 빼거나 추가하면서 정리할 예정입니다. 최대한 틀린 부분이 있지 않게 적겠지만 혹시 잘못된 부분이 있으면 알려주세요!
강의는 Bro Code라는 유튜버의 총 6시간 분량의 강의입니다. 영상에서 나눠져 있는 챕터 제목을 기준으로 작성할 예정입니다. 다만 영어강의라는 점이 좀 걸리는데..한국어 강의를 찾다가 컴팩트 하면서 제가 지루하지 않고 잘 배울 수 있는 영상을 못찾아서 영어강의를 듣게 되었습니다. 혹시 이 블로그를 보시고 들을 생각을 가진 분이 계시다면 영어자막도 있고 어색하지만 자동번역되는 한글자막도 있으니 너무 겁먹지 마시고 들어보길 바랍니다:)
< 1. Hello, World! >
#include <iostream>
int main(){
std::cout << "It's really good!" << '\n';
//동일문장
//std::cout << It's really good!" << std::endl;
return 0;
}
// This is a comment
/*
This
is
a
multi-line
comment
*/
모든 프로그래밍 언어의 시작인 Hello,World!
물론 코드 내에는 적지 않았지만 기본적으로 처음 출력함수를 통해 output을 낼 때 빠지지 않고 등장하는 문장이다.
C++의 가장 기본이 되는 구조를 적어보았다.
① #include <iostream> 헤더 문장이다.
여기서 iostream은 input output stream의 약자이고 말 그대로 input and output function들을 사용할 수 있게 해준다.
② std::cout << "It's really good!";
std는 standard의 약자이고 cout은 출력함수이다 반대로 입력함수는 cin이다.
③ int main(){} / return 0;
가장 기본적으로 출력을 하기 위해 이 main함수에 2번 문장을 적으면 된다.
return 0; 은 나중에 아닌 경우도 있으려나? 아직 모르겠다.
(추가)
- 두 문장이 반복될 때 문장이 두 행으로 나오게 줄을 띄우려면 코드처럼 '\n' 또는 std::endl을 뒤에 붙이면 된다.
- 주석의 경우 한줄 주석은 // 두줄이상을 주석처리할 때는 /* */ 안에 적으면 된다.
< 2. Variables and basic data types >
#include <iostream>
int main() {
int x; //declaration(선언)
x = 5; //assignment(할당)
// int x = 5; 동일
std::cout << x << '\n';
return 0;
}
int main() {
//integer (whole number)
int age = 21;
//double (number including decimal)
double price = 10.99;
//single character
char grade = 'A'; // single 을 넘어가면 warning을 받게 됨
char dollarSign = '$'; //특수문자도 single character로 취급
//boolean (true or false)
bool power = false;
//string (objects that represents a sequence of text)
std::string day = "Sunday";
std::string address = "123 Fake St."; // string 에 number 넣을 수 있지만 integer와 다르게 취급
std::cout << "You are " << age << " years old" << '\n';
return 0;
}
(위 코드에는 main 함수가 두 개 적혀있지만, 실행할 때는 하나는 주석 처리가 필요함)
변수와 기본적인 데이터 타입에 대한 챕터이다.
선언과 할당을 따로 할 수도 있고 동시에 할 수도 있다.
기본적으로 정수, 실수, character, string, boolean 정도가 C++에서 어떻게 다루어야 하는지 볼 수 있다.
*여기서 나의 궁금증은 single character일 때는 single quote(')를 사용하고 string일 때는 double quote(")를 사용했는데 이 부분이 관례적인 부분인지 문법상 무조건 지켜야 하는 부분인지였다.
//char 변수에 double quote 썼을 때의 오류
error: cannot initialize a variable of type 'char' with an lvalue of type 'const char[2]'
//string 변수에 single quote 썼을 때의 오류
warning: character constant too long for its type
error: no viable conversion from 'int' to 'std::string'
→ 직접 해 본 결과 문법적으로 무조건 지켜야 하는 부분이라는 결과가 나왔다.
< 3. Const >
#include <iostream>
int main() {
const double PI = 3.14159;
double radius = 10;
double circumference = 2 * PI * radius;
// const -> read only and can't be changed
std::cout << circumference << "cm";
return 0;
}
const 키워드는 지정하면 변수값을 변경할 수 없다.
기본적으로 상수(const) 키워드를 적을 때 변수명은 대문자로 적는 게 낫다.
변경을 시도하면
note: variable 'PI' declared const here
라고 오류가 뜬다.
const의 역할은 read only라고 생각할 수 있다.
< 4. Namespaces >
#include <iostream>
namespace first {
int x = 1;
}
namespace second {
int x = 2;
}
int main() {
int x = 0;
// int x = 1; //error: redefinition of 'x' 라는 오류가 나옴
// std::cout << x;
//사용하고자 하는 namespace를 지정하지 않았기 때문에 local x 가 output
std::cout << second::x;
return 0;
}
Namespace는 큰 프로젝트에서 이름이 같아서 생기는 충돌을 미리 방지하기 위해 만들어졌다.
각각의 개체들은 각각의 unique한 이름을 가져야 한다. 동일한 이름은 namespaces가 다르다는 전제하에 가질 수 있다.
여기서 먼저 main 함수를 보면,
int x = 0; 이라고 선언과 할당을 했기에 x의 값만 바꾸려고 하면 그건 상수가 아니기에 가능하지만, 똑같은 x를 다시 선언할 수는 없다.
이는 같은 namespace(main함수) 안에 있기 때문이다.
반면 namespace가 다른 경우에는 같은 변수명을 사용할 수 있다.
위의 namespace first와 namespace second를 보면 알 수 있듯이 같은 변수명 x를 썼지만 컴파일까지 오류가 나지 않는다.
또한 main함수 안에서 x를 출력하고자 할 때 따로 지정해주지 않으면 local x가 output이 된다.
-> output = 0
따로 지정하는 경우 위 코드와 같이 std::cout << second::x; 처럼 x 앞에 namespace를 지정해 줘야 한다.
-> output = 1
* 여기서 ::는 범위 확인 연산자이다.
int main() {
using namespace std;
string name = "chaeon";
cout << "Hello " << name;
return 0;
}
main 함수 안에서 namespace를 output하려는 변수명 앞에 일일이 지정하지 않고 고정시키는 방법이 있는데, 그게 using namespace 문장이다.
위 코드에는 없지만 앞 예시에서 using namespace first;라는 문장을 main에 넣으면 first namespace라는 걸 출력할 때 지정하지 않아도 x의 output은 1이 된다.
단, 이 경우에도 만약 namespace second의 x값을 쓰고 싶을 때는 범위확인연산자로 붙여줘야 한다.
이처럼 자주 쓰이는 문장이 using namespace std 인데 이걸 쓰면 위 코드처럼 출력할 때 cout앞에 std를 붙일 필요가 없다. 다만 std namespace안에는 너무 많은 name들이 있기 때문에 필수적으로 필요한 상황에 적절히 활용하는 것이 좋다.
< 5. Typedef and type aliases >
#include <iostream>
typedef std::string text_t;
typedef int number_t;
// 위 두줄과 아래 두줄은 동일한 동작 수행
using text_t = std::string;
using number_t = int;
int main() {
text_t firstName = "chaeon";
number_t age = 15;
std::cout << firstName << '\n';
std::cout << age << '\n';
return 0;
}
typedef 는 데이터 타입이 복잡할 때 별칭키워드를 제공해주는 도구라고 할 수 있다.
typedef 대신 using을 이용해서도 똑같은 동작을 수행할 수 있다.
현재는 데이터 타입이 복잡하지 않지만 이후 복잡한 데이터 타입이 보이면 유용하게 쓸 것 같다
그리고 typedef 별칭을 지을 때는 _t를 붙이는 게 일반적이다.
첫 글이라서 너무 자세하게 쓴 것 같다. 아마 다음글에서는 훨씬 더 간결하게 내용을 포스팅할 것 같다.
혹시 틀린 부분이나 추가해주고 싶은 부분이 있으면 알려주세요.