컴퓨터공학/C++ 20

[C++] 함수 객체, 콜백 함수

[ C++ : 함수 객체, 콜백 함수 ] 함수 포인터 리마인드void (*pfunc)(void); 포인터를 타고 갔더니 데이터가 아니라 함수가 있는 것.동작을 넘겨줄 때 유용하다pfunc = &HelloWorld;(*pfunc)(); 함수 포인터 단점1) 시그니처가 안 맞으면 사용할 수 없다.2) 상태를 가질 수 없다. 상태를 가질 수 없다는건 무슨 뜻일까?일반적으로 객체지향 클래스를 만든다고 가정할 때, 데이터와 동작을 둘 다 들고 있을 수 있는데 Knight가 _hp를 갖는다면 이건 Knight의 상태 값이 된다.→ 각기 다른 "상태"를 지닐 수 있다. 함수는 상태가 없다. Knight가 _hp를 갖고 있으면서 유지되는 개념이 없는 것이다.하지만 경우에 따라서 기존에 실행했던, 혹은 저장한 데이터를 ..

컴퓨터공학/C++ 2024.11.19

[C++] #include <algorithm>

[ C++ : #include ] findfind_ifcountcount_ifall_ofany_ofnone_offor_eachremoveremove_if STL의 사용함에 있어서 장점은, 일반화된 함수를 쓴다면 다른 프로그래머가 쓴 코드를 봐도, 어떤 기능을 하는지 한 눈에 파악하기 쉬울 뿐더러, 컨테이너가 바뀌어도 그대로 동작한다는 것. [1] findnumber와 동일한 element가 존재하는지 탐색auto itFind = ::find(v.begin(), v.end(), number); [2] find_ifPredicate의 조건에 맞는 element가 존재하는지 탐색auto itFind = ::find_if(v.begin(), v.end(), [](const int N) { return (N %..

컴퓨터공학/C++ 2024.11.17

[C++] 함수 포인터

[ C++ : 함수 포인터 ]  포인터의 data 타입에는 int, float 같은 타입 또는, Player, Knight같은 클래스에 썼었다.제 3의 타입인 함수가 있다. [ 함수의 시그니쳐 ]int(int a, int b) 함수의 타입도 정의할 수 있다.[ 함수 타입 정의 ]typedef int(FUNC_TYPE)(int a, int b);using FUNC_TYPE = int(int a, int b); 함수 포인터 : 주소를 타고 들어가면 함수가 있다고 하는 것. 함수의 이름 : 함수의 시작 주소 (배열과 유사)어셈블리로 보면, 결국 함수 이름에 있는 주소로 jmp하ㅡㄴ 것을 볼 수 있다.일반 함수를 호출하더라도, 결국 함수의 주소를 타고 가는 것이다.typedef int(FUNC_TYPE)(int..

컴퓨터공학/C++ 2024.11.13

[C++] using

[ C++ : using ] C++11에서, typedef을 대신해서 사용할 수 있는 문법인 using이 추가되었다.typedef vector::iterator VecIt;typedef int id; // typedef __int64 id[ typedef vs using ]typedef __int64 id;using ide2 = int;1) 직관성typedef void (*MyFund)();using MyFunc2 = void(*)();2) 템플릿typedef은 템플릿을 활용할 수 없는 대상.templatetypedef std::vector List // Error templateusing List = std::list; // OK// → using List = std::vector;/* ... */Li..

컴퓨터공학/C++ 2024.11.09

[C++] noexcept

[ C++ : noexcept ] std::vector vector에서 push_back()이 호출되었을 때, size와 capacity가 동일하다면1.5배 증가된 capacity로 새롭게 reserve()를 하고, 기존 데이터들을 옮겨야 한다.이 때, 복사를 하면 성능이 떨어질 수 있으므로 가능하면 이동을 한다.하지만 컴파일러는 예외가 생길 수 있으므로, 이동 생성자가 아닌 복사 생성자를 호출할려고 한다. 이를 프로그래머가 막아주기 위해 명시적으로 noexcept 키워드를 붙여 예외가 발생하지 않는다고 힌트를 주게 한다. 여기서 예외는, try-catch에 걸리는 이론상 발생할 수 있는 수많은 예외를 말한다.예를 들면, 동작할당 new를 할 때에도 극단적인 상황, 즉 메모리가 부족하다면 할당이 실패할 ..

컴퓨터공학/C++ 2024.11.09

[C++] 캐스팅 4가지

[ C++ : 캐스팅 4가지 ] 용도에 따라 4가지로 나뉜다. (int)같은 고전적인 C타입 캐스팅은 가장 강력한 캐스팅.Player를 상속받는 Knight, Archer가 각각 있다고 가정하자. [1] static_cast타입 원칙에 비춰볼 때, 상식적인 캐스팅만 허용해준다.1) int float (통상적인 형변환)2) Player* -> Knight* (위험하긴 하지만, 상속관계에서의 다운캐스팅)안정성은 보장하지 않는다.Player* p를 Knight*로 캐스팅하려 할 때, p의 본체가 Knight인 것을 알 수 있을 때만 캐스팅해야 한다. 예시)1) Player* p = new Knight();우리가 무엇을 하는지는 알고 있다. 본체는 Knight이기 때문에 안전할 것. (Knight는 Playe..

컴퓨터공학/C++ 2024.11.09

[C++] std::move()

[ C++ : std::move() ] 자주 사용하진 않지만, C++11에서 핵심적인 변화에 해당.이 기능덕에 코드의 속도 차이가 나게 되었음. [ l-value vs r-value ]l-value : 단일식을 넘어서 계속 지속되는 개체r-value : l-vaule가 아닌 나머지 (임시 값, 열거형, 람다, i++ 등) int a = 3;3 = a; // [Error : 식이 수정할 수 있는 lvalue여야 합니다.](a++) = 5; // [Error : 식이 수정할 수 있는 lvalue여야 합니다.]// → (a++)은 복사된 임시 값이기 때문 void TestKnight_Copy(Knight knight) { }void TestKnight_LValueRef(Knight& knight) { ]voi..

컴퓨터공학/C++ 2024.11.09

[C++] 전방 선언

[ C++ : 전방 선언 ] class를 만들면서 문제가 되기 시작하는 것은 Player class내에서 다른 class를 멤버 변수로 갖게 되는 것.일반 객체로 갖고 있거나, 포인터로 갖고 있을 수 있다.// Player.hclass Player{/* ... */Monster target;Montser* target2;} Player의 설계도를 완성하려면, Monster의 크기를 알아야하므로 Monster.h를 include해야 한다.Player를 만들기 전에, Monster를 만들어야 하는 것. 의존성이 생긴 것이다. 반대로, Monster*를 들고 있다고 생각해보자.이전과 달리, 포인터이므로 Monster.h가 없더라도 알 수 있다. 본질적으로 Monster*는 주소를 담는 바구니이기 때문이다.이제..

컴퓨터공학/C++ 2024.11.05

[C++] 템플릿 기초

[C++ : 템플릿 기초 ] C++에서 가장 어려운 부분 중 하나인 템플릿.기초를 다뤄보자. Template(템플릿) : 함수나 클래스를 찍어내는 틀 [ 함수 템플릿 ]void Print(int x){ cout  구현부가 같은데, 인자들만 편리하게 바꿀 수 없을까?템플릿을 사용하면 된다.templatevoid Print(T a){ cout  인자로 int, float, const char* 등을 넣어주면 실행이 잘 된다. 동일한 함수를 다르게 호출하는 개념이 아니라 "틀"을 만들어준 것이고, 하나라도 사용하는 순간 컴파일러가 직접적으로 각기 버전을 만들어 낸다. (int, float 버전 등등) 컴파일러가 형을 추론해서 만들어주는 것이다.프로그래머가 타입을 지정해서 만들수도 있는데, 를 사용Print(5..

컴퓨터공학/C++ 2024.11.05