전체 글 262

[디자인 패턴] 행동 패턴 (1) 책임 연쇄 Chain of Responsiblity

책임 연쇄 (Chain of Responsibility) 1. 의도 메시지를 보내는 객체와 이를 받아 처리하는 객체들 간의 결합도를 없애기 위한 패턴 요청에 대해 객체는 자신의 요청이면 처리하고 아닐시 다른 객체에게 요청을 전달한다. 2. 활용 그래픽 사용자 인터페이스(GUI)에 있는 문맥 감지 도움말 기능의 예 - 다이얼로그와 버튼 버튼은 클릭 가능한 인터페이스를 제공하고 다이얼로그는 버튼 인터페이스를 포함하고 사용자에게 메세지나 기능의 내용을 전달하는 인터페이스이다. Microsoft Visual Studio 프로그램 종료 시 하면 위 예시와 같은 다이얼로그를 표시한다. "저장", "저장안함", "취소" 버튼 인터페이스와 변경 내용을 띄우는 창 그리고 기본적인 텍스트가 포함된 다이얼로그라고 할 수 있..

[디자인 패턴] 생성 패턴 정리

예시 코드로 생성 패턴을 정리해보고 각 구현의 차이점을 알아보자. 추상 팩토리 Abstract Factory 만들고자하는 인스턴스에 대한 정보가 담기거나 타입이 결정된 공장 객체를 통해 인스턴스를 생성하는 방법. 주로 개별 객체를 만드는 것이 아니라 여러 객체가 합쳐진 시스템이나 환경을 만들기 위해 사용한다. 그러한 전체 시스템 객체의 생성자나 Create()와 같은 연산으로 참조자를 반환하는 방법으로 객체를 생성하고 매개변수로 추상 팩토리를 전달하면 원하는 시스템이 만들어진다. 팩토리 메서드 Factory Method 생성자가 아닌 함수 호출로 인스턴스를 생성하는 방법으로 클래스 타입을 동적으로 설정할 수 있다는 장점이 있다. 객체 생성시 가장 흔히 쓰이는 방법. 매개변수로 생성하는 클래스 타입을 알아..

[디자인 패턴] 구조 패턴 정리

※ 구조 패턴을 총 정리 종류 특징 적응자 Adapter - 서로 관련 없는 두 개의 인터페이스를 가져와 새로운 인터페이스로 통합하는 것 - 다른 클래스 인스턴스를 참조자로 관리하거나 다중 상속으로 구현. 가교 Bridge - 클래스 계통을 추상 표현과 구현부로 나누고 구현부 인스턴스를 통한 구현 기능을 제공. - 구현부 인스턴스를 참조자로 관리. 복합체 Composite - 객체의 전체와 부분을 포괄하여 표현할 수 있는 추상 클래스를 정의. - 소유 관계를 트리 형태로 나타내고 자식 연산에 대한 인터페이스를 제공. - Leaf 클래스는 자식을 포함하지 않는 독립적인 객체. 장식자 Decorator - 어떤 객체에 새로운 기능을 추가하고 싶을 때 덧대는 방법. - Decorator는 덧대고자 하는 대상 ..

[디자인 패턴] 구조 패턴 (7) 프록시 Proxy

프록시 (Proxy) 패턴 1. 의도 다른 객체에 대한 접근을 대신 수행하는 대리 객체를 둔다. 2. 활용 티스토리의 글과 같이 한 문서에는 글, 이미지, 링크 개체 등 여러 그래픽 요소가 포함되어 있을 수 있다. 문서를 화면에 띄우기 위해 모든 그래픽 요소를 그려야 하는데 모든 문서에 대한 필요 요소를 메모리에 올릴 필요는 없다. 오버레이와 같이 운영체제 기능도 있지만 사용자 코드로 필요한 객체만 메모리에 올릴 시간을 결정하도록 한다. 따라서 현재 보고 있는 문서 내용에 관련된 객체만 필요할 때 생성하는 방식으로 이미지와 같이 데이터 용량이 큰 객체에 적용한다. 프록시 패턴은 자신이 객체를 생성하지 않고 사용자로부터 접근이나 요청이 있을 때 생성된 객체를 사용하도록 한다. 이로 현재 보고 있는 문서에 ..

[C++ 클래스] 가상 함수 테이블

가상 함수, virtual 키워드로 메서드를 정의하면 실제 인스턴스의 타입에 해당하는 메서드로 호출할 수 있다. 함수의 호출 과정은, 클래스 메서드를 포함한 일반 함수 내용을 가리키고 있는 함수 포인터들이 메모리 어딘가에 저장되고 관리된다. 따라서 가상 함수로 정의하지 않으면 프로그램이 실행될 때 참조형 클래스에 미리 정의된 메서드를 호출하게된다. 가상 함수의 원리는 미리 정의된 메서드를 호출하지 않고 실행중 실제로 "참조하고 있는" 타입을 판별해야한다는 의미이다. C++에서는 참조하고 있는 타입을 따로 판별하는 기능이 없기 때문에 실행 중 이를 아는 것은 불가능하다. 따라서 객체의 인스턴스마다 호출해야하는 함수를 관리해야한다는 뜻이다. 이러한 함수를 함수 포인터 배열로 저장하고 있는 것을가상 함수 테이..

Advanced C++ 2021.01.29

[C++ 클래스] 가상 함수

가상 함수 Virtual Function 가상 함수란 C++ 객체 지향 프로그래밍에서 상속으로 클래스의 특정 메서드가 재정의될 수 있음을 암시할 때 사용한다. 클래스의 멤버 함수 앞에 virtual 키워드를 붙임으로 해당 메서드는 가상 함수로 명할 수 있다. 다음 ClassA를 상속하는 ClassB를 정의하고 print_name() 메서드를 virtual 키워드와 함께 정의하여 파생클래스에서 재정의함을 암시한다. ClassB는 ClassA의 print_name() 메서드를 재정의 (오버라이드) 하여 해당 기능을 ClassB에 맞게 재구현하는 것이다. class ClassA { public: const char* _name; public: ClassA(const char* name) : _name(name..

Advanced C++ 2021.01.29

[디자인 패턴] 구조 패턴 (6) 플라이급 Flyweight

플라이급(Flyweight) 패턴 1. 의도 표현 상태가 적은 객체들을 공유함으로 효율적으로 시스템을 지원 2. 활용 응용프로그램이 대량의 객체를 사용할 때 객체 수가 많아져서 전체가 사용하는 메모리 용량이 클 때 객체를 구성하는 상태가 적을 떄 예시) 문서 편집기의 문자를 표현하는 방법 문서 편집기의 내용을 표시하기 위애 여러 그래픽 요소를 객체로 관리하며 이는 효과적인 표시를 가능하게 한다. 만약 문서 내용을 나타내는 문자 하나하나를 객체로 관리한다면, 굉장히 많은 객체를 문서마다 보유하고 이는 메모리 문제와 그래픽을 그리는 실행시간이 크게 지연될 것이다. 플라이급 객체는 공유 가능한 객체들을 의미하고 본질적(intrinsic) 상태와 부가적(extrinsic) 상태로 구분된다. 본질적 상태는 플라이..

[C++] 이동 시맨틱과 r-value 참조형

먼저 C++ 객체 지향 프로그래밍의 복사 생성자와 대입 연산자를 복습해보자. Requset.h Request 클래스는 멤버 변수로 동적으로 할당하는 address 포인터 변수와 정수형 변수를 가지고 있다. 이에 대해 올바른 복사 생성자와 일반 대입 연산자 오버 로딩을 다음과 같이 할 수 있다. class Request { private: char* _address; unsigned int _id; public: Request() : _address(nullptr), _id(0){} ~Request() { if (_address) delete[] _address; cout

Advanced C++ 2021.01.28

[C++] l-value와 r-value

C++ 언어에서 l-value와 r-value 라 불리는 표현이 있다. l-value와 r-value는 연산 결과에 따른 대입 연산에서 비롯된다. l-value는 대입 연산에서 왼쪽과 오른쪽 모두 올 수 있는 표현이고 r-value는 대입 연산에서 오른쪽에만 올 수 있는 표현이다. int a = 23; int b = 12; // 둘 다 모두 가능 a = b; b = a; // 산술 연산 결과는 r-value a = 7 * 9; // l-value = r-value 7 * 9 = b; // error 위의 예시에서 7*9는 "연산 결과"로 오른쪽에만 올 수 있는 표현이다. C++에서 둘을 구분할 수 있는 방법은 l-value는 실제로 메모리 상에 존재하는 객체를 가리키는 표현이고 &연산을 통해 주소를 접근..

Advanced C++ 2021.01.28

[디자인 패턴] 구조 패턴 (5) 퍼사드 Facade

퍼사드 (Facade) 패턴 1. 의도 전체 서브시스템을 포괄하는 인터페이스를 정의. 2. 활용 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때 사용자와 서브시스템의 연관성을 줄이기 위해 서브 시스템을 계층화 시키고 퍼사드를 통해 서브 시스템을 접근 3. 참여자 퍼사드: 통합된 인터페이스를 제공, 서브시스템의 기능을 모두 알고 있으며 사용자의 요청을 서브시스템 객체에 전달한다. 서브시스템 클래스: 서브시스템의 기능을 구현하고 퍼사드 객체로 할당된 작업을 처리하지만 퍼사드를 접근할 수는 없다. 4. 협력방법 사용자는 퍼사드가 제공하는 인터페이스를 통해 서브 시스템의 기능을 이용한다. 5. 결과 1) 서브시스템 구성요소를 보호한다. 2) 서브시스템과 사용자 코드간의 결합도를 약하게 한다. 3) ..