분류 전체보기 269

[디자인 패턴] 구조 패턴 (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) ..

[디자인 패턴] 구조 패턴 (4) 장식자 Decorator

장식자 (Decorator) 1. 의도 객체에 새로운 기능을 동적으로 추가하는 방법 2. 활용 기존에 있던 인터페이스에 기능을 추가하고 싶을 때 사용한다. 특정 클래스에 추가적인 기능을 포함하고 있는 서브 클래스를 만드는 것을 피한다. 예시로 GUI에 표시하는 시각적 객체들을 위한 VisualComponent 클래스가 있다하자. 그렇다면 VisualComponent 내부의 클래스 계통에 있는 모두에게 기능을 추가하는 것이 아니라 특정 서브 클래스에만 기능을 추가하는 것이다. VisualComponent 클래스를 상속하는 특정 서브 클래스를 TextView라고 하자. TextView 인터페이스에 스크롤바와 테두리 기능을 추가하고 싶을 때, TextView를 상속하는 새로운 서브 클래스를 만들어야할까? 당연..

[디자인 패턴] 구조 패턴 (3) 복합체 Composite

복합체 (Composite) 패턴 1. 의도 객체 구조가 트리 형태로 나타낼 수 있다. 객체의 부분은 또 다른 객체의 전체를 표현한다. 2. 활용 Grahpic 객체와 Picture 객체 Graphic 객체는 화면에 표시할 수 있는 모든 객체가 될 수 있다. 한 객체는 또 다른 Graphic 객체들을 포함하고 하나의 그룹처럼 행동할 수 있다. 예를 들면, MS PowerPoint의 도형 객체들을 그룹하하여 하나의 객체처럼 이동하거나 확대, 축소 연산이 가능하다. 이러한 그룹으로 묶어진 객체들을 컨테이너라고 하고 예시에서 Picture 클래스는 컨테이너로서 여러 그림 요소를 포함할 수 있다. 복합체 패턴에서 Graphic 클래스는 컨테이너와 개별 그림 요소의 의미를 모두 포함하도록 추상화하여 정의한다. 따..

[디자인 패턴] 구조 패턴 (2) 가교 Bridge

가교 (Bridge) 패턴 1. 의도 개체의 틀(Handle)과 내용(Body)을 분리하여 다른 클래스 계통을 가지게 함 2. 활용 예시 Window - WindowImp Window 창에 대한 인터페이스를 제공하는 Window 클래스가 있고 같은 계통으로 상속할 수 있는 클래스가 있다. 1. Window 창 종류의 변화 Icon을 표시하는 창이거나 잠시 로그인으로 띄우는 Transient 임시 창일 수도 있다. 2. Window 창을 그리는 시스템 환경 Window를 X Window 시스템이나 PM Window 시스템에서 그릴 수 있다. IconWindow이면서 X Window환경에서 그리려면 어떻게 해야할까 IconWindow를 서브 클래싱하는 IconXWindow 클래스를 정의함으로 해결할 할 수 ..