01. Exception C는 Exception이 없어서 모든 에러를 return과 &argument로 해결한다 C++는 std::optional, std::variant, std::tuple/pair를 통해 해결한다 그리고 에러를 handling 하는 Exception 개념이 도입되었다 을 인클루드 하고 try, catch, throw를 통해 사용한다 error의 종류에 따라 다양한 exception의 자식 클래스들을 활용할 수 있다 #include #include int divide(int a, int b) { if (b == 0) { //throw std::exception(); throw std::runtime_error("divide by 0"); } return a / b; } int main..
01. Floating Numbers 1 # 변환 방법 float은 아래와 같은 방법으로 변환된다 # converter 위에서 사용되는 이진법 부동소수점 정의에 스탠다드는 IEEE 754이고 해당 변환을 직접적으로 보여주는 사이트를 활용해서 내부를 확인할 수 있다 02. Floating Numbers 2 # 주의점 float은 근삿값으로 변환이 되기에 equality, comparison을 사용하는 것에 주의해야 한다 double은 float보다는 더욱 정밀하지만 마찬가지로 주의해야 한다 #include #include #include #include int main() { const float num1 = 0.3f; const float num2 = 0.4f; if (0.7f == num1 + num2..
01. Introduction C++는 함수형 프로그래밍을 지원하지만 OOP 중심의 언어이다 C++ 17부터 Lambda Function이 도입되면서 함수형 프로그래밍을 쉽게 사용할 수 있도록 바뀌었다 함수형 프로그래밍의 기본은 함수를 변수처럼 다루는 것으로부터 시작된다 java script의 closure개념과 같은 Function Object를 C++에서 아래와 같이 구현할 수 있다 #include class Plus { public: explicit Plus(int a) : localVar{ a } { } int operator()(int x) const { return localVar + x; } private: int localVar; }; int main() { Plus plus3{ 3 }; ..
01. Introduction # Template의 종류 Function template Class template Aliasing template Variable template C++ 20부터 Template에 concept이 도입되면서 템플릿 프로그래밍 시 실수를 줄여준다 # Function template 함수의 인자 타입에서 함수 오버로딩을 제공하는 경우 가장 유용하게 사용된다 템플릿 함수는 미리 모든 것이 만들어지는 것이 아니라 넘겨지는 인자의 타입에 따라서 그때 함수들을 생성하며 컴파일이 되고 문제가 생기면 컴파일 에러가 발생한다 # Function template의 instantiation Function template은 코드로 존재하다가 사용을 할 때, 그 타입에 맞는 함수가 컴파일이 ..
01. Smart Pointer # RAII 스마트 포인터를 사용하는 이유는 RAII(Resource Acquisition Is Initialization)이다 RAII는 오브젝트와 리소스의 Life Cycle을 일치시키는 것을 의미하고 여기서 리소스란 Heap memory, Thread, file access, mutex, db Connection과 같은 한정된 리소스를 의미한다 RAII 중 Heap Memory(리소스)를 관리해 주는 스마트포인터(오브젝트)를 통해 Memory Leak을 근본적으로 없앨 수 있다 # Memory Leak new를 통해 힙메모리에 데이터를 할당하고 delete를 해주지 않고 프로그램이 종료된다면, 스택에서 포인터만 없어지고 힙에 할당된 데이터는 영원히 남게 되고 이를 M..
01. Inheritance Intro# 기본적인 개념1) Class relationship2) Code reuse3) Class Interface Consistency: abstract / interface, pure virtual function4) Dynamic function binding: virtual function, virtual table # 접근 권한 키워드 (private, public, protected)접근 권한 키워드는멤버 변수 및 함수에 작성하는 경우와상속 권한에 작성하는 경우가 있다 멤버 변수 및 함수에 작성하는 경우에 주의점은클래스 외부에서private 멤버 변수에 접근하려면 public 멤버 함수를 통해서 접근 가능하다는 것이다 상속 권한에 작성하는 경우에는 아래와 같은..
01. Pointer vs. Reference 값, 포인터, 참조를 통해 전달하는 3가지 방식이 존재한다 값으로 전달을 하면 데이터를 전체 다 복사해야 한 경우가 발생한다 따라서, 포인터와 참조를 통해 전달하는 것이 효율적이다 둘의 차이는 내부적으로 없으며 참조의 경우는 const와 함께 작성해서 값을 변경하지 못하도록 막는 경우가 많다 void fooV(std::array a) { int b = a+1; }; void fooP(int * ap) { int b = *ap+1; }; void fooR(const int & a) { int b = a+1; a =100; }; 02. L-Value vs. R-Value # L-Value vs. R-Value R-Value는 한 번만 사용되고 더 이상 불려지거나..
01.Build Introduction # 과정 Pre Processor 과정부터 Linker 과정 까지를 Compile이라고 부른다# 대표 컴파일러 종류Visual C++gccclang 02.Header file 선언부는 헤더 파일에구현부는 cpp파일에 넣어주는 것이 일반적이다 03.PreProcessor 전처리 과정에서는#include, #define, #ifdef, #pragma once와 같은#을 사용한 부분들을 복사 & 붙여 넣기를 통해 처리한다 여러 파일들이 생성되고서로 헤더파일을 참조하다 보면,전처리 과정에서 include 중복이 발생하는데 이를 막아주기 위해서는모든 헤더파일 위에 #pragma once를 작성하면 된다 C++에서는 최대한 define 문법을 사용하지 않는 것이 좋다defi..
01. Variables in Memory# 스택 메모리와 변수스택 메모리에 변수가 저장되는 방법은스택 메모리의 가장 위 부분부터 데이터를 하나씩 쌓아가고스택이 쌓이는 방향은 메모리의 주소가 감소하는 방향으로 쌓인다 # 예시#include int main(){ int a = 0; int b = 0; int c = a+b; double d = 2.5; std::cout 실제로 메모리를 까보면 위 그림과 같이 저장된다스택이 쌓일 때는 &a 부터 밑에서 위로 쌓이게 되고메모리의 내부를 보았을 때는 &d가 먼저 보인다는 사실을 알 수 있다 02. Variable Types 1# Fixed width integer types 컴파일러와 아키텍처에 따라서 int, unsigned int와 같은 변수들은 최소 1..