목록Language (77)
Coding Memo
먼저 Factory 패턴에 대해... Factory Pattern은 객체 생성 로직을 캡슐화 하여, 객체 생성 방법과 사용을 분리시키고 생성방법을 특정 로직으로 강제할 수 있는 생성 디자인 패턴이다. 라이브러리에서 `~~Factory.~~~()`을 사용해보았거나 보았던 기억이 있을 것이다.Factory를 통해서 어떤 객체를 생성하는 개념은 라이브러리에서 자주 찾아볼 수 있다. (Builder와는 조금 다른 개념이라는 것에 유의하자.) 이 Factory이 패턴이 필요한 시나리오와 특징에 대해서 알아보자.Scenario(해당 단락은 책을 참고하여 작성했다.) Shape라는 구조체에 원과 정사각형의 정보를 저장하고 싶다고 가정하자. 그렇다면 다음과 같이 코드를 작성할 수 있을 것이다. (물론 딱 봐서는 cir..
브릿지 패턴은 구현과 추상화를 분리하여 독립적으로 변경 할 수 있도록 설계하는 디자인 패턴이다. 단순하게 말해서 어떤 컴포넌트가 다른 컴포넌트의 구체적인(concrete) 구현을 알지 못해도 연동할 수 있도록 설계한다. 브릿지 패턴을 사용하면 추상화를 통해, 클라이언트 코드가 특정 API에 의존하지 않도록 설계할 수 있다. 예를 들자면, 어떤 원을 그리는 Renderer 인터페이스가 있다고 하자. 이 Renderer에 렌더링 클래스를 제공하여 지정된 방식으로 렌더링을 하도록 한다. DirectX, OpenGL, Vulkan과 같은 다양한 렌더링 API를 독립적으로 관리하고 실행시킬 수 있다. 예로 들어던 Renderer를 직접 간단하게 구현하고 확인해보자.1. Renderer Renderer는 인터페이스..
먼저, 이 포스팅을 작성하게된 이유는 헤더 파일에 있는 함수들은 모두 암묵적으로 inline화가 되는 줄 착각하고 있던 내 생각때문이다... 결론만 먼저 말하면...클래스 외부에서 함수의 body를 정의할 때는 inline을 명시적으로 추가하지 않는 이상, 암묵적으로 inline으로 간주되지 않는다. 내가 직면한 링킹에러는 LNK2005 에러로, 다음 내용이다.[~~~~] already defined in [~~~].obj 어떤 함수가 어떤 클래스의 오브젝트 파일에 이미 정의되어 있다는 에러이다. 즉, 같은 함수가 중복되어 정의되어 있다는 것이다.샘플 코드를 보고 무엇이 문제인지 생각해보자. Transform.h#include "Rotation.h"class Transform{public: Rotati..
먼저 간단하게 각각 짧게 요약해보자. 템플릿 특수화 (Template Specialization): 템플릿에서 특정 타입이나, 조건에 맞게 별도로 구현해 놓는 것. if constexpr: if 조건문의 constexpr 버전으로, 컴파일 타임에 해당 조건을 확인하고 false인 경우 해당 블록을 컴파일 하지 않는다. concept: C++20부터 추가된 기능으로, 템플릿에 조건을 추가하여 특정 타입이 조건에 맞는지 검증할 수 있는 기능. 이번 글은 템플릿 특수화 대신 if constexpr을 사용하는 것과, concept 타입에 대해서도 템플릿 특수화를 사용해 보는 것을 포함한다. 또한 템플릿 특수화와 if constexpr을 사용할 상황에 대한 내 생각도 작성해보겠다. (이 글을 기록하는 이유는 co..
C++20에서 추가된 Concepts의 기능인 requires에 대해서 간단히 정리해보자. requires는 C#에 비유하자면 where와 비슷한 키워드라고 생각할 수 있을 것 같다.where가 C#에서 제레릭 타입에 대한 조건을 지정하듯이,C++에서도 템플릿 타입에 대해 조건을 지정할 수 있다. Concepts 도입 전에는 SFINAE(Substitution Failure Is Not An Error)를 이용해, 템플릿 타입을 제약했었다. 그러나 C++20 이후에는, 템플릿에서 requires를 이용하여 타입에 대한 제약 조건을 쉽고 직관적으로 지정할 수 있다. 먼저 일반적인 코드를 확인해보자.struct A {};template T add(T a, T b){ return a + b;}int main(..
싱글턴 디자인 패턴은 어플리케이션 전체에서 단 하나만 존재해야하는 인스턴스를 위한 패턴이다. 특정 인터페이스를 제공한다거나 동일한 데이터를 사용할 때 한번만 로드할 때 사용한다. 보통은 전역적으로 접근 가능한 인스턴스를 사용한다. 또, 어플리케이션 시작 시점에 인스턴스를 로드할지, 이후에 사용할 때 로드 할지 (Lazy Intialization) 잘 고려하면 될 것이다. 싱글턴 패턴 구현은 언어와 개발 환경에 따라 크게 달라지는 것 같다.인스턴스를 1개로 제한하는 방법에는 인스턴스 카운트를 관리하는 코드를 추가하거나, static 전역 변수를 두어 이 인스턴스를 반환하여 사용하는 메서드를 만들면 될 것이다.보통 후자의 방법이 많이 사용되는 것 같다. 먼저 구현하는 코드를 살펴보자. struct Singl..
에서 제공하는 std::sort 함수는 지정된 조건에 맞게 정렬을 해주는 함수이다.vector나 배열에서 사용은 많이 해보았을 것이라 생각한다. 그렇다면 std::sort는 과연 어떤 인자를 받고 있을까? 이 글에서는 std::sort의 작동방법과 왜 std::list에서는 사용할 수 없는지 알아보겠다.(Visual Studio MSVC 기준이다.)std::sort 이 함수는 헤더 파일에 다음과 같이 정의되어 있다._EXPORT_STD template _CONSTEXPR20 void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) { // order [_First, _Last) _Adl_verify_range(_First, _Last); c..
C++17부터 추가된 파일 시스템 라이브러리에서 파일과 디렉터리에 관한 여러가지 유틸을 사용할 수 있다.자주 사용할 것 같은 메서드와 멤버 변수들을 간단하게 정리해 보았다.HeaderfilesystemNamespacestd::filesystem1. 현재 경로 (working directory, current path) current_path()현재 실행중인 경로(working directory)를 반환한다. (return: std::filesystem::path)참고로, 반환된 경로는 절대 경로(absolute path)이다. current_path(const std::filesystem::path& p)현재 경로를 p로 변경한다. (return: void)마찬가지로 p가 상대경로로 지정했더라도 curr..