목록분류 전체보기 (162)
Coding Memo
복습 차원 및 메모용으로 남겨두기 위해서 작성했다.각 SQL 테스트는 MS SQL Server와 SSMS (SQL Server Management Stduio)를 사용했다. 정말 간단하게 쿼리를 작성하고 정말 간단하게 테스트해보기로 하자. Note: CREATE DATABASE로 데이터베이스를 먼저 생성하고 시작한다.CREATE DATABASE TestDB SQL (Structured Query Language, 구조적 질의 언어)는, RDBMS(Relational DataBase Management System, 관계형 데이터베이스 관리 시스템)에서 데이터를 관리하기 위해서 설계된 언어이다. SQL을 이용하여 데이터베이스의 관리뿐만 아니라, 테이블과 데이터의 관리를 할 수 있다. SQL은 크게 4가지로..
먼저 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(..
Windows 어플리케이션 개발 시, 하나의 어플리케이션의 실행만 허용해야할 때가 있을 것이다. 예를 들어, 게임에서 클라이언트 다중 실행을 막거나,서버에서 같은 프로그램이 동시에 실행되는 것을 방지하는 등이 있겠다. Windows에서 동일한 응용 프로그램을 여러 번 실행하는 것을 방지하기 위한 방법에는 어떤 것들이 있는지 알아보자. 1. Mutex 이용 멀티 스레드 환경에서 (하나의 응용 프로그램 내에서) 동기화를 위해 mutex를 활용하듯이, 커널에서도 mutex를 사용할 수 있다. 이 mutex는 커널 오브젝트 (kernel object)로, 하나의 프로세스만 해당 자원에 접근 할 수 있도록 할 수 있다.자세한 내용은 다음 글에!https://minttea25.tistory.com/168 Wind..
프로그램 내의 스레드 간 공유 자원에 대한 접근을 제한하는 것처럼 프로세스에서도 어떤 자원에 대해, 같은 응용 프로그램이 동시에 변경을 하거나, 작업을 하면 안되는 경우가 있다. 어떻게 방지 할 수 있을까? 여러 방법 중 하나로, Windows에서 제공하는 mutex를 활용하는 방법이 있다.HANDLE CreateMutexW( [in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes, [in] BOOL bInitialOwner, [in, optional] LPCWSTR lpName); HANDLE OpenMutexW( [in] DWORD dwDesiredAccess, [in] B..