전체 글 269

[Modern C++] (3-2) 현대적 C++에 적응하기

현대적 C++ 기능을 잘 쓸 수 있도록 관련 내용을 정리한다. - 목록 1. iterator보다 const_iterator를 선호한다. 2. 예외를 방출하지 않을 함수는 noexcept로 선언한다. 3. 가능하면 항상 constexpr을 사용한다. 4. const 멤버 함수를 스레드에 안전하게 작성한다. 5. 특수 멤버 함수들의 자동 작성 조건을 숙지한다. 1. iterator보다 const_iterator를 선호한다. 원소를 바꿀 필요가 없는 반복자를 사용하는 함수에 const_iterator를 사용하도록 한다. cbegin()과 cend()는 const_iterator를 반환한다. std::vector values; // ... auto iter = std::find(values.cbegin(), v..

Advanced C++ 2021.03.26

[Modern C++] (3-1) 현대적 C++에 적응하기

현대적 C++ 기능을 잘 쓸 수 있도록 관련 내용을 정리한다. - 목록 1. 객체 생성시 괄호와 중괄호의 차이점을 안다. 2. 0과 NULL보다 nullptr을 선호한다. 3. typedef보다 별칭 선언을 선호한다. 4. 범위 없는 enum보다 범위 있는 enum을 선호한다. 5. 정의되지 않은 비공개 함수보다 삭제된 함수를 선호한다. 6. 재정의 함수들을 override로 선언한다. 1. 객체 생성시 괄호와 중괄호의 차이점을 안다. - C++11에서 변수 초기화 방법 // 괄호와 중괄호를 이용한 초기화 int x(0); int y = 0; int z{ 0 }; int w = { 0 }; 중괄호를 이용한 초기화의 특징: 균일 초기화 Uniform Intialization 모든 초기화에 사용가능한 단 한..

Advanced C++ 2021.03.25

[C++ 클래스] 템플릿 클래스와 전방 선언

템플릿 클래스 클래스 선언이 템플릿 인자와 함께 선언되어 인자만 달리하여 다른 클래스를 정의 및 생성 가능하다. - 임의의 원소를 담는 리스트 클래스 template class List { public: List(long size = DEFAULT_LIST_CAPACITY); ~List(); long Count() const; Item& Get(long index) const; Item& First() const; Item& Last() const; bool Includes(const Item&) const; void Append(const Item&); void Prepend(const Item&); void Remove(const Item&); void RemoveLast(); void RemoveF..

Advanced C++ 2021.03.24

[디자인 패턴] 행동 패턴 (8) 반복자 Iterator

반복자 (Mediator) 패턴 1. 의도 자료구조에서 흔히 쓰이는 패턴으로 속한 원소에 대한 순차적 접근 방법을 제공하고 방법에 대한 표현을 외부에 노출하지 않는다. 2. 활용 리스트와 같이 원소에 대한 접근과 다음 원소로 이동하는 방법이 존재하는 자료구조에서 모든 원소를 순차적으로 접근하는 방법을 구현한다. 순차적 접근을 통해 반복자 함수 내부에서 삽입, 삭제 등의 연산을 포함시킬 수 있다. 이를 위해 반복자는 현재 몇 번째 원소를 가리키고 있는지, 자료구조의 끝에 도달했는 지를 판별한다. - ListIterator와 List 반복자는 어떤 자료구조냐에 따라 순회 방법이 다르다. List와 같이 선형적 탐색 혹은 반대 방향으로 가능할 수도 있고 Tree같은 경우 전위, 중위, 후위 탐색 혹은 레벨 탐..

[디자인 패턴] 행동 패턴 (7) 중재자 Mediator

중재자 (Mediator) 패턴 1. 의도 같은 집합에 속해있는 객체들의 상호작용을 중재해주는 객체를 정의하고 상호작용을 하는 객체 간 결합도를 낮추도록 한다. 2. 활용 객체간의 상호작용에는 먼저 사건이 발생하고 다른 객체가 영향을 받는 등의 종속성이 존재하게 되는데, 이 복잡한 관계를 중재하고 객체 들은 서로 참조자를 관리하지 않고 중재자 객체만 알도록 하여 결합도를 낮추도록 한다. 결합도를 낮추게 되면 관리되는 객체들의 재사용성을 증가시킬 수 있다. - FontDialogDirector 클래스 FontDialogDirector 객체는 대화 상자를 구성하는 위젯 간의 상호작용을 중재한다. 대화 상자를 구성하는 요소중 ListBox는 마우스로 클릭할 수 있는 모든 리스트 정보를 관리한다. 사용자가 마우..

[Modern C++] (2) auto 키워드

auto 키워드 C++ 11에 추가된 기능으로 함수 반환 값이나 초기화시 데이터 타입을 자동으로 확인하여(연역하여) 변수 타입을 지정해준다. auto 키워드의 예시 auto x = 5; // int auto f = 1.0f // float auto d = 5.0 // double int func() {return 0;} auto res = func(); // 함수 결과에 대한 타입 연역 auto foo = func; // 함수 포인터 auto reset = [](Type* ptr) { ptr->reset(); } // 람다 클로저 함수 타입 연역을 위해 반드시 초기화값이 필요한 것이 특징이다. 타입을 직접 타자로 칠 때, 타입명이 길다면 불편한 점이 있는데 이를 자동으로 지정해주는 편함이 있다. 반복자의..

Advanced C++ 2021.03.22

[Modern C++] (1) 형식 연역

템플릿 함수 및 클래스와 C++11/14 혹은 그 이상의 버전에서 사용되는 auto 키워드에서 추론되는 형식 연역을 정리한다. 템플릿 형식 연역 템플릿 선언 template // T에 대한 형식 연역 void f(ParamType param); // 전달된 param에 대한 형식 ParamType 호출 방식 f(expr); // expr 이라는 표현식을 사용 경우 1. ParamType이 포인터 혹은 참조 형식인 경우 단순 참조 형식 T& template void f(T& param); 변수 선언 함수 호출 연역된 T 형식 param의 형식 int x = 27; f(x); int int & const int cx = x; f(cx); const int const int & const int& rx = x..

Advanced C++ 2021.03.19

[디자인 패턴] 행동 패턴 (6) 전략 Strategy

전략(Strategy) 패턴 1. 의도 객체가 사용하는 알고리즘을 추상화하고 선택적으로 사용할 수 있게 해준다. 2. 활용 공통성이 없는 여러 객체가 비슷한 알고리즘을 사용할 때, 함수를 객체로 만들어 사용하면 유용하다. 이에 대한 함수를 추상화하여 클래스로 정의하고 인스턴스를 만들 때 알고리즘을 선택할 수 있게 한다. - UI 화면에 띄울 문자를 파싱하여 자동으로 라인을 분리하는 객체 Composition 객체는 화면에 띄울 문자를 모두 가지고 있으며 라인 분리 알고리즘을 사용할 주체이다. Composition 객체는 직접 알고리즘을 구현하지 않으며, Compositor라는 클래스에 알고리즘을 구현하여 사용한다. Compositor 객체는 UI 화면에 띄울 문자와 라인 분리를 위한 문자 넓이, 라인 1..

[C++] 스마트 포인터 shared_ptr/unique_ptr/weak_ptr

스마트 포인터 클래스 혹은 함수 내에서 동적 할당을 한 객체를 해제하기 위해 해당 객체에 대한 소멸자를 명시적으로 호출하여 삭제시켜야하는데 스마트 포인터는 내부에 이 동적 할당을 한 객체를 소유함으로 객체 삭제를 자동으로 대신 해준다. 스마트 포인터는 내부에 포인터를 맴버변수로 가지고 있는 value-type의 일반적인 클래스 인스턴스라고 볼 수 있다. 자동 소멸의 기능 뿐만아니라 스마트 포인터는 A와 같이 객체를 포인터 형태로 소유함으로 A 자원을 공유하고 필요에 따라 스마트 포인터를 통해 공유 자원을 접근하도록 해준다. 자원 공유를 할 수 있는 간단한 스마트 포인터를 구현해보면 다음과 같이 구현할 수 있다. template class SmartPointer { private: int* ref_coun..

Advanced C++ 2021.03.06

[C++] 함수 객체 Functor, std::function, std::bind

Functor 호출 가능한 함수 기능을 가진 객체 보통 구조체나 클래스로 정의된다. Functor 클래스 template class Functor { public: Functor(T _th) : th(_th) {} bool operator()(const T& val) const { return val >= th; } private: T th; }; 클래스 예시 내용을 보면 일반적인 생성자와 멤버 함수 th를 가지고 있다. "호출 가능"의 의미는 구조체나 클래스 내부에 다음과 같은 함수가 정의되어 있을 때, 호출 가능한 객체로 본다. OutputType operator()(InputType in1, ...) { //... return value; } 호출 함수의 매개 변수 수에 따라 명칭이 있는데, 0개:..

Advanced C++ 2021.02.22