분류 전체보기 262

[디자인 패턴] 행동 패턴 (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

[C++] 가변 길이 템플릿 Variadic Template

가변 길이 템플릿 (Variadic Template) 템플릿 매개변수에 대해 그 수를 제한하지 않고 템플릿 함수를 정의할 수 있다. 특징 1. 제한하지 않는 매개 변수 수 2. 매개 변수 타입은 당연히 임의적이므로 모두 달라도 된다. 3. 함수 구현 내용에 매개 변수 타입에 따른 처리가 필요하다. (string, int, float, 구조체, 일반 class 등등) 4. 재귀적인 호출로 가변 인자 템플릿 문제를 해결한다. 모두의 코드 C++ modoocode.com/290에 가변 인자 템플릿의 간단한 예제로 소개되어 있는 print 함수는 Python 함수의 print 함수를 구현하고 있다. /* 가변 길이 템플릿 2 이상의 인자를 가지는 가변길이 템플릿 함수를 호출했을 떄, 첫번째 인자와 나머지 인자들..

Advanced C++ 2021.02.21

[C++] 예외 처리 Exception

예외 처리 Exception C++ Standard Libary에서 제공하는 예외 처리를 위한 클래스로 자신의 프로그램 코드에서 어느 부분에서 예외가 발생할 것을 대비해 미리 예외 발생에 대한 디버깅 정보를 알기 위해 사용한다. 주로 어떤 모듈의 초기화 중 발생한 소프트웨어 에러나 메모리 할당/해제, 혹은 어떤 특정 코드 범위 내에서 발생하는 예외만 관찰하고 싶을 때 사용한다. VC 런타임 헤더 vcruntime_exception.h를 보면 예외 처리 Exception 클래스에 대한 정보가 있다. namespace std { #pragma warning(push) #pragma warning(disable: 4577) // 'noexcept' used with no exception handling mo..

Advanced C++ 2021.02.20

[C++ 클래스] 순수 가상 소멸자

순수 가상 소멸자 순수 가상 함수를 포함하는 추상 클래스로 설계하고 싶을 때 사용한다. 일반적인 함수를 순수 가상 함수로 정의하지 않고 소멸자를 순수 가상 소멸자로 정의해서 추상 클래스로 정의한다. Behavior라는 클래스는 Attack과 Defense 행동을 추상화한 클래스인데, 기본적으로 doAction()의 내용을 사용자가 정의해서 상속받은 클래스가 이 함수를 재사용하는 것을 생각한다. class Behavior { private: string type; float duration; public: Bahavior(string _type, float _duration) : type(_type), duration(_duration) {} virtual ~Behavior(){}; virtual void..

Advanced C++ 2021.02.18

[디자인 패턴] 행동 패턴 (5) 감시자 Observer

감시자 (Observer) 패턴 1. 의도 객체 사이에 一 대 多의 의존 관계를 정의하여 어떤 객체의 상태가 변할 때 그 객체를 관찰하는 감시자에게 변화를 통보하고 변화된 상태를 알 수 있게 한다. 2. 활용 감시자 패턴은 서로 의존적인 두 클래스가 일관성을 갖도록 하는 것이다. 일관성을 가지면서 두 클래스의 결합도를 높이지 않아 각 클래스의 재사용성을 높이는데 목적이 있다. - Subject-Observer 예시 의존적인 관계를 가지는 두 클래스르 Subject-Observer라고 할 수 있고 이를 설명하기 위해 데이터와 그래프 자료를 예로 들 수 있다. 데이터 자료형을 스프레드 시트나 그래프로 나타내는 GUI 객체들이 있는데 이들은 모두 실제 데이터에 의존적인 모습을 보인다. 데이터가 변경되면 그에 ..

[디자인 패턴] 행동 패턴 (4) 상태 State

상태 (State) 패턴 1. 의도 객체 상태에 따라 행동이 다르고 행동은 다른 상태 전이를 발생시킬때 사용하는 패턴. 2. 활용 - TCP 연결 네트워크 연결을 추상화한 TCPConnection 클래스를 생각해보면 TCPConnection 클래스는 여러가지 상태를 가질 수 있다. 연결 성공(Established), 대기(Listening), 연결 종료(Closed) 상태를 가지는데 TCP-Connection 객체는 자신의 상태에 따라 사용자 요청에 대한 처리 결과가 다르다. ex) Open 요청은 종료 상태에서만 의미가 있을 수 있고 Acknowledge() 요청은 전송된 패킷을 성공적으로 수신했다는 패킷을 보내는 것이므로 대기나 연결 성공 상태에서 의미가 있는 연산이다. - TCPState 추상 클래..

[디자인 패턴] 행동 패턴 (3) 해석자 Interpreter

해석자 (Interpreter) 패턴 1. 의도 어떤 언어로 표현된 문장을 해석하는 방법을 제공 2. 활용 어떤 언어로 표현된 문장을 해석하는 번역 문제를 해결하는 것이다. - 정규식 표현으로 문자열을 찾는 문제 정규식 문법으로 표현된 문장을 어떻게 해석하여 문자열을 찾도록 할 것인가 다음 정규식 문법을 생각해보자 expression: literal '|' alternation '|' sequence '|' repetition '|' 다른 expression을 포함한다. alternation: expression '|' expresssion, 두 표현 중 하나가 올 수 있다. sequence: expression '&' expression, 두 표현 모두가 와야한다. repetition: epxressi..

[디자인 패턴] 행동 패턴 (2) 명령 Command

명령 (Command) 1. 의도 요청 자체를 캡슐화하는 것. 요청이 서로 다른 사용자를 매개변수로 만들고, 요청을 대기/로깅/되돌릴 수 있는 연산을 지원. 2. 활용 명령 패턴은 요청 자체를 객체화하여 명시되지 않은 응용프로그램 객체의 요청을 처리할 수 있도록 지원. Command 추상 클래스는 연산에 필요한 인터페이스를 선언한다. Command 클래스의 가장 기본적인 연산은 Execute() 서브 클래스는 생성자에서 수신 객체(피연산의 대상)을 매개변수로 받고 수신 객체와 관련된 요청을 호출하도록 Execute()를 구현한다. - 메뉴 예시 Menu에서 각 선택 항목은 MenuItem 클래스의 인스턴스이다. Application은 메뉴와 메뉴를 구성하는 메뉴 항목(Menu Item)을 관리하고 열고 ..