본문 바로가기
728x90
React 요약 2024. 1. 17.
CPP Lvalue, Rvalue, &&(우측값 레퍼런스) 개념 Lvalue, Rvalue가 뭘까? 🔸 lvalue 저장할 장소가 있는 값, const가 붙은 값 ex) int a, const char b 🔸 rvalue 임의의 값 ex) 10, 'a' rvalue와 lvalue가 생긴 이유!? 원래 cpp98까지는 rvalue와 lvalue의 개념이 연산자 오른쪽에 있는 애, 연산자 왼쪽에 있는 애였다. 하지만 deep copy가 꼭 필요하지 않은 경우가 있다. class A { std::string a[100000000]; }; A a; B(a); B(makestr(a)); 위의 코드를 보면 class A는 굉장히 큰 string 배열을 저장하고 있다. A 클래스를 파라미터로 받는 B의 생성자를 만들 때, 우리는 항상 deep copy로 A 클래스의 string값.. 2022. 7. 27.
CPP explicit 키워드 c++ 98에 처음 도입된 키워드! 암시적 형 변환의 특성 때문에 프로그래머가 예상치 못하는 형 변환이 일어남으로 인해 정말 어려운 버그가 생기는 걸 방지하기 위해 도입된 키워드. 도대체 형 변환으로 정말 어려운 버그가 어떻게 생기는 걸까? 밑의 예제를 보자. template struct Print { void operator() (T v) { cout 2022. 4. 27.
CPP 4가지 타입 변환 연산자 (Casting) CPP에서는 안전한 casting을 보장하기 위해 casting을 도와주는 4가지 타입 변환 연산자가 있다. ( static_cast, dynamic_cast, const_cast, reinterpret_cast ) 1. static_cast - 실수와 정수, 열거형과 정수형, 실수와 실수 캐스팅 가능 - 컴파일 타임에 형 변환을 하기 때문에 컴파일 당시 오류를 확인할 수 있는 장점이 있다. static_cast (바꿀 대상) 밑과 같이 부모를 private, protected로 상속받을 경우에는 캐스팅이 되지 않음! class A { }; class B : A { }; int main() { A aa; B bb; // 둘 다 불가능 aa = bb; aa = static_cast(bb); } 부모를 pu.. 2022. 3. 20.
CPP template c언어에서 min이라는 함수를 만들 때, 아래 코드와 같이 파라미터로 int를 받는 함수, double를 받는 함수를 각기 만들어 줘야 되는 불편함이 있었다. int min(int a, int b) { return a > b ? b : a; } double min(double a, double b) { return a > b ? b : a; } cpp에서는 template을 통해 여러 가지 data type를 유동적으로 받을 수 있는 함수를 만들 수 있다!!! 위의 예제 코드와 같이 데이터 형 별로 함수를 따로 만들어줘야 됐는데 template를 사용하면 밑의 코드와 같이 하나만 만들어도 모든 데이터 타입에서 사용할 수 있다!! template T min(T a, T b) { return a > b ? .. 2022. 3. 18.
CPP 부모클래스에서 virtual 함수가 하나라도 있으면 소멸자도 무조건 virtual? cpp 공부를 하며 여러 가지 테스트를 진행 중, 이상한 상황을 발견했다! class A { A() {}; ~A() {}; virtual void test1() {}; }; class B : A { } int main() { A a = new B(); delete a; } 위와 같이 코드를 적었을 때 컴파일 오류가 난다. 원래 업 캐스팅을 할 때는 자식 클래스의 소멸자가 호출되지 않기 때문에 부모 클래스의 소멸자를 virtual로 설정해서 가상 함수 테이블을 만들어 줘야 된다. 부모 클래스의 소멸자를 virtual로 설정하는 것이 좋다~이지 필수는 아니라고 알고 있어서 위의 코드에서 컴파일 오류를 마주했을 때 왜 오류가 뜨는지 몰랐다. 밑에 코드와 같이 A class(부모)에서 virtual 함수가 없으.. 2022. 3. 10.
:: Scope Operator(범위 지정 연산자)를 쓰는 3가지 상황 :: 이 기호는 Scope Operator(범위 지정 연산자)라고 한다. 범위 지정 연산자는 밑의 3가지 경우에서 쓸 수 있다. 1. namespace:: 2. className:: 3. :: namespace:: 어떤 namespace 안에 선언된 함수인지 지정하여 호출할 때 사용한다. namespace nameA{ void A(); } int main() { nameA::A(); } className:: 어떤 class 안에 선언된 멤버 함수인지 지정하여 호출할 때 사용한다. class A{ void a(); } int main() { A::a(); } :: global scope 함수나 변수를 지정하여 호출할 때 사용한다. int g_num; intmain(int argc, char **argv) .. 2022. 2. 15.
CPP Enum(enumerate) Enum이란? 열거형, enumerate에서 나온 키워드다. enum를 통해 자기만의 자료형을 만들 수 있다 = 사용자 정의 자료형 아래와 같이 enum은 열거자를 가지는데, 열거자는 ;이 아니라 ,로 구분된다. enum DayWeak { MON, TUE, WEN, THU, FRI, SAT, SUN }; enum을 정의 시에는 메모리가 할당되지 않고, 열거된 유형의 변수가 정의된 경우에 변수에 대해 메모리가 할당된다. 열거자 대체로 모두 대문자로 이름을 짓는다. 열거자는 enum와 같은 네임스페이스에 배치되므로, 열거자 이름은 같은 네임스페이스 내의 여러 enum에서 사용할 수 없다. 밑의 예제를 보자. enum dayWeak { MON }; enum classDay { MON 2022. 1. 19.
CPP STL 맵(Map) 맵(Map)이란? 각 노드가 key와 value 쌍으로 이루어진 정렬이 되어 있는 트리 에 있다. 중복을 허용하지 않는다. map m; ex) map m; first, second가 있는 pair 객체로 저장된다. first = key, second = value map의 내부 구현은 검색, 삽입, 삭제가 O(logn)이다. 맵 정렬 자료를 저장할 때 내부에서 자동으로 정렬한다. key를 기준으로 오름차순으로 정렬한다. 내림차순으로 정렬하고 싶으면 value 뒤에 greater를 넣어주면 된다. map m; 맵은 컨테이너이므로 iterator를 사용해서 데이터를 찾는다. 2022. 1. 18.
CPP 정적 바인딩(Static Binding)과 동적 바인딩(Dynamic Binding) 바인딩(Binding)이란? 프로그램에 사용된 각종 내부 요소, 이름 식별자들에 대해 값 또는 속성이 결정되는 과정 "int a = 4;"에서 a의 데이터 타입이 int형이라고 정하는 것을 말한다. 정적 바인딩(Static Binding)이란? 컴파일 시점에 결정되는 바인딩을 정적 바인딩이라고 함! 소스상에 명시적으로 타입과, 그 타입의 변수명을 선언하는 것 장점 - 컴파일 시 타입에 대한 정보가 결정되기 때문에 실행 속도가 빠름 - 타입 에러로 인한 문제를 초기에 발견할 수 있어 안정성 ⬆ 단점 - 컴파일 시 결정이 되고 그 이후로는 변경이 불가능 동적 바인딩(Dynamic Binding)이란? 런타임 시점에 이루어지는 바인딩 과정을 동적 바인딩이라고 함! CPP에서 가상 함수 오버라이딩이 동적 바인딩.. 2022. 1. 18.
728x90