본문 바로가기

728x90

C++

[디자인패턴][행위패턴] 매개자 Meditator - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Meditator Pattern 우리가 작성하는 코드의 상당 부분은 서로 다른 컴포넌트(클래스) 간 포인터나 직접적 참조를 통해 커뮤니케이션한다. 어떤 경우 컴포넌트 간 명시적으로 상대방 객체의 존재를 알아야 하는 상황이 불편할 수 있다. 또는 상대방 객체를 알더라도 객체 생성/소멸 시점에 대한 관리 때문에 포인터나 참조로 접근되는 것이 싫을 수 있다. 매개자는 컴포넌트 간 커뮤니케이션을 돕기 위한 메커니즘이다. 매개자 자체는 커뮤니케이션에 동반되는 모든 컴포넌트로부터 접근 가능해야 한다. 즉, 전역 정적 변수이거나 모든 컴포넌트에 참조가 노출되어야 한다. 채팅 룸 채팅 룸은 매개자 디자인 패턴이 적용될 수 있는 가장 전형적인 .. 더보기
[디자인패턴][행위패턴] 반복자 Iterator - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Iterator Pattern 복잡한 데이터 구조를 다뤄야 할 때 데이터 순회(traversal) 문제에 부딪힌다. 여러 방법이 있지만 vector 형태의 데이터에서는 반복자(iterator)라고 불리는 방법이 흔히 사용된다. 반복자는 단순히 어떤 컬렉션의 항목 하나에 접근하는 방법과 그 항목의 다음 항목으로 이동하는 방법을 알고 있는 것이다. 따라서 ++ 연산자와 != 연산자만 구현하면 된다. C++ 표준 라이브러리에서도 반복자를 광범위하게 사용하고 있다. 먼저 C++ 표준 라이브러리가 반복자를 어떻게 사용하고 있는지 알아볼 것이다. 그다음 직접 반복자를 만들고 반복자가 가진 제약들을 살펴본다. 표준 라이브러리 반복자 vect.. 더보기
[디자인패턴][행위패턴] 인터프리터 Interpreter - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Interpreter Pattern Interpreter 디자인 패턴의 목적은 입력 데이터를 해석하는 것이다. 꼭 텍스트에 한정되지는 않는다. 인터프리터의 작업을 수행하는 몇 가지 단순한 예를 보여줄 것이다. 일반적인 예는 다음과 같다. 42나 1.234e12와 같은 숫자 리터럴은 바이너리로 저장하면 효율적이다. C++에서는 Boost.LexicalCast와 같은 고급 라이브러리를 사용할 수 있다. C의 API인 atof()를 이용할 수도 있다. 텍스트에서 어떤 패턴을 찾을 때 정규 표현식을 사용하면 편하다. 정규 표현식은 특정 목적을 위한 완전 별개의 언어다. 정규 표현식도 적절히 해석되어야만 한다. CSV, XML, JSON.. 더보기
[디자인패턴][행위패턴] 커맨드 Command - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Command Pattern 커맨드 패턴은 어떤 객체를 활용할 때 직접 그 객체의 API를 호출해 조작하는 대신, 작업을 어떻게 하라고 명령을 보내는 방식을 제안한다. 여기서 명령은 무엇을 어떻게 하라는 지시가 담긴 클래스 그 이상도 이하도 아니다. 시나리오 은행의 마이너스 통장을 생각해 보자. 마이너스 통장은 잔고와 인출 한도가 있다. 입금과 출금 동작을 수행해야 한다. 이때 모든 입출금 내역을 기록해야 한다고 하자. 또한, 입출금 클래스는 이미 기존에 만들어져 검증되었고 동작 중이어서 수정할 수 없는 상황이다. struct BankAccount { int balance = 0; int overdraft_limit = -500.. 더보기
[백준알고리즘] 2104번: 부분배열 고르기-C++ 10090번: Counting Inversions (acmicpc.net) 10090번: Counting Inversions A permutation of integers from 1 to n is a sequence a1, a2, ..., an, such that each integer from 1 to n is appeared in the sequence exactly once. Two integers in а permutation form an inversion, when the bigger one is before the smaller one. As an example www.acmicpc.net 문제를 오랜만에 풀었다. 전에 풀려고 미리 좀 봤었는데 이리저리 바쁜 일정들로 인해 잊고 살았었다. .. 더보기
[디자인패턴][행위패턴] 책임 사슬 Chain of Responsibility - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Chain of Responsibility 어떤 시스템을 구성하고 있는 여러 개의 서로 다른 컴포넌트들이 어떤 메시지를 역할에 따라 주고받으며 처리할 수 있다. 개념적으로는 구현하기 쉬워 보인다. 어떤 처리를 수행할 담당 컴포넌트의 목록만 있으면 된다. 시나리오 컴퓨터 게임에서 크리처들이 있다고 하자. 공격력과 방어력 두 가지 값을 속성으로 갖는다고 하자. struct Creature { // 생성자와 add(cm); } else { next = cm; } } virtual void handle() { if ( nullptr != next ) { next->handle(); //< 핵심 부분 } } protected: Creat.. 더보기
[디자인패턴][구조패턴] 프록시 Proxy - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Proxy pattern Decorator 패턴은 객체의 기능을 수정/확장하는 여러 다른 방법들을 제시해준다. Proxy 패턴도 객체의 기능을 수정/확장한다는 목적은 비슷하지만 기존 API 사용 방식을 정확히 동일하게 유지하면서 내부 동작만 다르게 한다는 점이 다르다. Proxy는 API를 일관되게 유지하기 위한 것은 아니다. 같은 API에 대해서 서로 다른 종류의 서로 다른 목적의 완전히 다른 프록시들이 여러 개발자에 의해 만들어질 수 있기 때문이다. 스마트 포인터 가장 단순하면서도 직접적인 프록시 패턴은 스마트 포인터라 할 수 있다. 스마트 포인터는 포인터의 참조 횟수를 관리하고, 몇몇 연산자를 오버라이딩하는 래퍼(wrapp.. 더보기
[백준알고리즘] 2104번: 부분배열 고르기-C++ 2104번: 부분배열 고르기 (acmicpc.net) 2104번: 부분배열 고르기 크기가 N(1 ≤ N ≤ 100,000)인 1차원 배열 A[1], …, A[N]이 있다. 어떤 i, j(1 ≤ i ≤ j ≤ N)에 대한 점수는, (A[i] + … + A[j]) × min{A[i], …, A[j]}가 된다. 즉, i부터 j까지의 합에 i부터 j까지의 최솟값을 곱 www.acmicpc.net 문제를 푸는데 되게 오래걸렸다. 처음에는 세그먼트 트리를 오랜만에 공부하려고 시작한 거라, 공부하는데 시간이 소요됐다. 그러고 나서는 어떻게 적용되면 좋을지 고민하느라 시간이 소요됐다. 마지막으로, 알 수 없는 '틀렸습니다'의 늪에서 헤어나오지 못했다. 게다가 하루에 30분 저도씩 밖에 시간을 못 쓰는 바람에 며칠이 걸.. 더보기

728x90