묻공러
'C++' 카테고리의 글 목록 (3 Page)

C++

C++/[노코프] Tips

[C++ Tips] Unit Test

유닛테스트는 구현된 부분을 테스트하며 버그를 수정하여 로직의 완성도를 높이는 것이다 유닛테스트의 장점은 초기 단계에서 버그를 잡을 수 있고 샘플 코드의 역할을 한다 또한, 유지 보수를 쉽게 만들어준다 C++에서 Unit Test를 하기 위해서는 Google Test를 이용하는 방법이 있다 이는 빌드해서 바이너리를 실행해야 테스트가 가능하다는 복잡함이 있지만 Unit Test는 그만큼 중요하기 때문에 필수불가결하게 여겨지고 있다 간단한 예시는 아래와 같다 // GameLogic.h #pragma once class Enemy { public: float health; }; class Player { public: void Attack(Enemy& enemy, float damage); }; // GameL..

C++/[노코프] Tips

[C++ Tips] 생성자 리스트

constructor에서 initializer list를 사용하면 object를 더 효율적으로 생성할 수 있다 # 내부에서 선언 vs. initializer list 내부에서 선언하는 코드는 아래와 같다 class A { public: A() { m_b = B("param"); } private: B m_b; }; A의 멤버변수인 m_b가 만들어질 때, B의 constructor를 호출하며 object를 만들고 A의 생성자 내부에서 "param"이 담겨있는 B의 constructor 통해 object를 만들고 m_b에 copy를 한다 이처럼 A의 멤버변수를 만들어내기 위해 B의 오브젝트를 두 번 만들고 copy도 한번 발생하니 효율이 좋지 않다 반면, initializer list를 이용하면 class ..

C++/[노코프] Tips

[C++ Tips] random library

random 한 데이터를 추출하기 위해서는 아래와 같은 방법을 자주 사용한다 #include int main() { srand(time(nullptr)); int radNum = rand() % 100; } 하지만, 이는 사실 균등한 랜덤이 아니다 예를 들어, 랜덤함수가 0부터 9까지 나오는 것이 기본이라는 가정을 한다면 이 함수를 가지고 0 ~ 3까지 나오게 하기 위해서 rand() % 4 를 하게 된다 실제로 0, 1, 2, 3의 비율이 균등하게 나오는 것이 아니라 랜덤함수를 열어보면 0, 1, 2, 3 을 통해 0, 1, 2, 3 4, 5, 6, 7 을 통해 0, 1, 2, 3 8, 9 에서는 0, 1 이처럼 균등하게 나오지 않고 0, 1의 비율이 높은 상태가 된다 따라서 모듈레이션을 통해 랜덤함수..

C++/[노코프] Tips

[C++ Tips] const

const는 최대한 많이 사용하는 것이 좋다 또한, C++ 17부터는 컴파일 타임에 변수를 아는 경우에는 constexpr를 사용하면 된다 const를 많이 사용하는 것은 성능의 이점 때문이 아니라 실수 확률을 줄여주고 더 안전하게 사용하기 위해서이다 # const 예시 1 #include int main() { int a = 0; a = 1; a = 2; const int a = 0; const int b = 1; const int c = 2; // 변수의 재사용을 최소화 const int d = get_integer();// 해당 함수에 불러진 값이 유지되니 안전함 constexpr int e = 3; // 컴파일 타임에 값을 아는 경우 } # const 예시 2 - 클래스 member #includ..

C++/[노코프] C++

[C++ NOTE] Exceptions

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..

C++/[노코프] C++

[C++ NOTE] Types

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..

C++/[노코프] C++

[C++ NOTE] Functional Programming

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 }; ..

C++/[노코프] C++

[C++ NOTE] Template

01. Introduction # Template의 종류 Function template Class template Aliasing template Variable template C++ 20부터 Template에 concept이 도입되면서 템플릿 프로그래밍 시 실수를 줄여준다 # Function template 함수의 인자 타입에서 함수 오버로딩을 제공하는 경우 가장 유용하게 사용된다 템플릿 함수는 미리 모든 것이 만들어지는 것이 아니라 넘겨지는 인자의 타입에 따라서 그때 함수들을 생성하며 컴파일이 되고 문제가 생기면 컴파일 에러가 발생한다 # Function template의 instantiation Function template은 코드로 존재하다가 사용을 할 때, 그 타입에 맞는 함수가 컴파일이 ..

C++/[노코프] C++

[C++ NOTE] Smart Pointer

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..

C++/[노코프] C++

[C++ NOTE] Inheritance

01. Inheritance Intro # 기본적인 개념 1) Class relationship 2) Code reuse 3) Class Interface Consistency : abstract / interface, pure virtual function 4) Dynamic function binding : virtual function, virtual table # 접근 권한 키워드 (private, public, protected) 접근 권한 키워드는 멤버 변수 및 함수에 작성하는 경우와 상속 권한에 작성하는 경우가 있다 멤버 변수 및 함수에 작성하는 경우에 주의점은 private 멤버 변수에 접근하려면 public 멤버 함수를 통해서 접근 가능하다는 것이다 상속 권한에 작성하는 경우에는 아래와 ..