본문 바로가기

728x90

study/design pattern

[디자인패턴][구조패턴] 브릿지 Bridge - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Bridge Pattern 최근 C++ 컴파일러들은 컴파일 속도가 굉장히 빨라졌다. 번역 단위(translation unit) 전체를 생성하는 대신 변경된 정의 부분만 새로 만들고 나머지는 재활용하는 방식으로 진화했다. 과거 C++ 개발자들은 유사하게 컴파일 시간을 단축시키기 위해 독특한 관례를 사용했다. Pimpl 관례가 그것이다. Pimpl 관례 Pimpl(Pointer to Implementation)은 구현부를 포인터로 참조하는 관례를 말한다. 기술적 측면에서 어떤 역할을 수행하는지 살펴보자. 일반적으로 개인 정보를 담는 Person 클래스를 구현한다 해보자. 사람 이름을 저장하고, 인사말을 출력하는 메서드를 갖는다고 할.. 더보기
[디자인패턴][구조패턴] 어댑터 Adapter - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Adapter pattern 어댑터 패턴은 일상생활에서 많이 보이는 어댑터와 같은 용도로 사용된다. 어떤 인터페이스가 용도에 맞지 않을 때 변환하는 역할로 사용하는 패턴이다. 시나리오 픽셀을 그리는 그리기 라이브러리가 있고, 이 라이브러리를 이용해야만 그림을 그릴 수 있다. 그런데 선분, 사각형과 같은 기하학적 모양을 그려야 하는 상황이다. 픽셀을 그리는 라이브러리는 요구사항에 비해 너무 저수준의 작업이기 때문에 기하학적 도형을 픽셀 기반의 표현이 가능하도록 바꿔주는 어댑터가 필요하다. 기본적인 그리기 객체를 정의한다. struct Point { int x, y; }; struct Line { Point start, end; }.. 더보기
[디자인패턴][생성패턴] 싱글턴 Singleton - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Singleton pattern 싱글턴 패턴은 가장 많이 미움받고 있는 디자인 패턴이다. 하지만, 필요하기 때문에 많이 사용된다. 싱글턴 디자인 패턴은 어떤 특정 컴포넌트의 인스턴스가 애플리케이션 전체에서 단 하나만 존재해야 하는 상황을 처리하기 위해 고안됐다. 개인적으로 처음 알았던 디자인 패턴이고, 그만큼 여기저기서 많이 사용되는 패턴이다. 그래서 왜 미움받는 디자인 패턴이라고 묘사했는지를 몰랐다. 책의 내용을 읽다 보니 그럴만한 이유들이 있구나 생각했다. 내가 사용하던 수준은 해당 문제들에 얽혀 있지 않은지 생각해볼 수 있었다. IoC 컨테이너 방식으로의 전환도 만만치 않을 것이고 회사에 바로 적용한다고 해서 가능할지도 모.. 더보기
[디자인패턴][생성패턴] 프로토타입 Prototype - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Prototype pattern 처음부터 모두 새로 만드는 방식(이 경우 팩토리나 빌더 패턴이 유용)은 어렵다. 대신, 이미 존재하는 객체를 이용해 복제해 사용하는 방식은 처음부터 새로 만들지 않고 쉽게 생성할 수 있다. 아니면 일부를 수정하거나 확장할 수도 있을 것이다. 이러한 아이디어를 갖고 프로토타입 패턴이 나오게 된다. 프로토타입 패턴을 이용하면 어떤 모델 객체도 복제할 수 있고, 복제본을 커스터마이징해 사용할 수도 있다. 가장 까다로운 부분이라면, 복제를 구현하는 부분이다. 객체 생성 생성자를 통해 객체를 생성하는 것보다 이미 잘 설정된 객체를 복제하는 것이 보다 쉬운 방법이다. 빌더 패턴을 이용해 복잡한 생성 과정을 .. 더보기
[디자인패턴][생성패턴] 팩터리 Factory - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Factory pattern 두 개의 GoF(Gang of Four) 패턴, 팩터리 메서드와 추상 팩터리를 동시에 알아본다. 이 두 패턴은 긴밀하게 연관이 되어있다. 시나리오 직교 좌표계의 좌표점 정보를 저장한다고 가정하자. 다음과 같이 쉽게 구현할 수 있을 것이다. struct CPoint { CPoint(const float x, const float y) : m_x(x), m_y(y) {} float m_x, m_y; //< 직교 좌표계의 좌표 } 여기서 극좌표계로 좌표점 정보를 저장해야 한다면 어떻게 할까? 쉽게 다음과 같이 극좌표계용 생성자를 추가할 것이다. CPoint(const float r, const float .. 더보기
[디자인패턴][생성패턴] 빌더 Builder - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Builder pattern 생성이 까다로운 객체를 쉽게 처리하기 위한 패턴이다. 즉, 생성자 호출 코드 단 한 줄로 생성할 수 없는 객체를 쉽게 다루는 패턴이다. 코드 한줄로 생성할 수 없는 객체는 다른 객체들의 조합이거나, 상식적인 것을 벗어난 까다로운 로직이 요구된다. 이런 객체는 생성하는 코드를 따로 분리해야 한다. 책에 나오는 예제는 그렇게 까다로워 보이지 않지만, 빌더 패턴을 어떻게 구현하는지, 빌더 패턴을 사용하는 의미가 무엇인지에 대해 설명할 수 있는 정도다. 시나리오 HTML 웹 페이지에 입력할 컴포넌트를 생성한다고 가정하자. 단순하게 "hello"와 "world"를 비순차() 리스트() 태그로 출력하려고 한다... 더보기
[디자인패턴] 공부를 시작하면서 (개요) [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. 어떻게 공부할지 오늘은 그 첫 번째 내용으로 책의 개요에 해당하는 내용을 정리하고, 앞으로 어떻게 공부할 지에 대한 내용이다. 해당 책은 모던 C++(C++11)을 기준으로 디자인 패턴을 공부할 수 있도록 재정리한 책이다. (고전적인 디자인 패턴 원저 GoF를 최신 버전의 C++을 이용해 업데이트한 것이라고 소개하고 있다.) 현재 회사에서는 C++98을 기준으로 코드를 작성하고 있다. 납품해야 하는 고객사들 서버 기준으로 아직까지도 호환성을 고려해야 하기 때문이다. 그래서 나는 앞으로 디자인 패턴을 디자인 패턴을 공부하면서, 책에서 모던 C++ 예제를 C++98 기준으로 최대한 재정의해보고 공부를 해보자 한다. 다만, 언어 자체.. 더보기

728x90