전체 글 153

싱글톤 패턴(Singleton Pattern)

개요 싱글톤 패턴(Singleton Pattern)은 오직 한 개의 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공하는 패턴이다. 구조는 아래와 같다. 싱글톤이 되려고 하는 클래스는 Singleton 클래스를 상속 받으면 된다. 구현 구현 방법은 상황에 따라 달라질 수 있으므로 아래의 코드는 정답이 아니라 참고 정도로 여겨야 한다. 모던 C++ template class Singleton abstract { public: Singleton(const Singleton&) = delete; Singleton(Singleton&&) = delete; Singleton& operator=(const Singleton&) = delete; Singleton& operator=(Singleton&..

재귀(Recursion)

재귀 재귀(Recursion)는 함수가 자기 자신을 호출하는 것을 말한다. 재귀의 구조는 재귀를 중단시키는 기저 조건(Base Case)과 기저 조건으로 수렴하게 되는 재귀 조건(Recursive Case)으로 구성된다. 재귀를 사용하는 이유는 문제에 따라 전체를 한 번에 해결하기보다 같은 유형의 하위 작업으로 분할하여 작은 문제부터 해결하는 방법이 효율적*일 수 있기 때문이다. 다시 말해 복잡한 알고리즘을 단순하고 알기 쉽게 표현할 수 있다. 그뿐만 아니라 알고리즘 자체만으로는 얼마나 많은 단계를 깊이 들어가야 하는지 알 수 없을 때에도 사용할 수 있다. *이를 분할 정복법(Divide & Conquer)이라고 한다. 예시를 살펴보자. 어떤 디렉토리가 갖고 있는 모든 파일 및 디렉토리를 지우는 함수를 ..

Study/Algorithm 2022.07.05

직장인의 질문법

회사에서의 질문은 내가 얻어야 할 것을 얻어내는 과정이다. 회사에서의 질문법은 아래 3단계로 발전한다. 1단계 : 질문을 무조건 많이 하겠다는 마인드셋 갖추기 질문을 전혀 하지 않다가 갑자기 제대로 된 질문을 던질 수는 없다. 자주 대화를 나눠보면서 질문하는 역량을 길러야 한다. 그리고 일을 시작하기 전에 매니저의 지시를 제대로 이해한 것이 맞는지 꼭 확인하자. 또, 질문의 타이밍은 빠를 수록 좋다. 2단계 : 내가 먼저 소화한 다음에 그 내용을 토대로 질문하기 질문은 모르는 것을 묻는 것이 아니라 내가 이해한 것이 맞는지 확인하는 것이다. 항상 미리 공부해서 나의 언어로 정리하도록 하자. 그리고 스스로 결정을 내려도 충분한 질문은 하지 말자. '목적'을 달성하는 데 드는 비용이나 다른 부분에서 매니저의..

Diary/Note 2022.03.21

김정주 회장님의 별세 소식을 접하며

https://www.techm.kr/news/articleView.html?idxno=94685 세상 등진 넥슨 김정주...시대를 앞서간 '韓 벤처 영웅' - 테크M 국내 최대 게임사 \'넥슨\'의 창업주인 김정주 회장이 향년 54세의 나이로 미국에서 사망했다. 그는 한국 벤처업계의 신화이자, 줄곧 미래 개척자로 통했다. 1일 넥슨 지주사 엑엔스씨(NXC)에 따르 www.techm.kr 어제 김정주 회장님의 별세 소식을 접했다. 너무 갑작스러워서 매우 놀랐는데, 정확한 사인은 나와 있지 않았지만, 최근 우울 증세가 심하셨다고 한다. 창업 이래 약 30년 가까이 경영하시며 숱한 어려움이 있으셨을텐데, 무엇이 그를 그렇게 힘들게 했을까, 참 안타깝다는 생각이 들었다. 삼가 고인의 명복을 빕니다.

Diary/Note 2022.03.02

가비지 컬렉션

개요 C++에서는 메모리를 프로그래머가 관리한다.* 즉, 동적 할당된 메모리를 전부 사용했다면 시스템에 돌려줘야 한다. 이 과정에서 여러가지 실수가 많이 발생하는 데 아래와 같다. * C++11부터 스마트 포인터 라이브러리가 추가되어 모던 C++에서는 명시적 해제보다는 스마트 포인터 사용을 권장하고 있다. 메모리 누수(Memory Leak) 메모리 사용이 끝났음에도 불구하고 해제하지 않은 것이다. 이중 해제(Double Free) 이미 해제가 된 메모리임에도 불구하고 또 해제하는 것이다. 이미 해제가 된 메모리를 가리키는 포인터를 댕글링 포인터(Dangling Pointer)라 한다. 섣부른 해제(Premature Free) 아직 사용이 끝나지 않았음에도 불구하고 해제하는 것이다. 이런 불편함을 해결하기..

Study/C# 2022.02.06

공용 타입 시스템

개요 .NET에서는 여러 .NET 언어를 지원하기 위해 공용 타입 시스템(CTS; Common Type System)을 지원한다. .NET의 모든 형식은 값 타입(Value Type) 혹은 참조 타입(Reference Type)으로 구분되며 모든 타입은 기본 타입인 System.Object에서 파생된다. C#에서는 아래와 같은 계층을 가지고 있다. 값 타입 C#에서 값 타입은 구조체 / 열거형 / 그 외에 기본 제공 타입으로 구성된다. 값 타입은 아래와 같은 특징을 갖는다. 구조체를 제외한 모든 타입은 System.ValueType에서 파생된다. 스택 메모리에 직접 값이 포함된다. 다시 말해 복사가 일어난다. 상속이 불가능하다. 구조체 멤버 중에 참조 타입이 있다면 메모리 주소가 복사된다.* * 얕은 복..

Study/C# 2022.02.06

C#에 대한 이해

개요 C#은 마이크로소프트에서 개발한 객체 지향 프로그래밍 언어다. C#은 강건하고 유지보수를 위한 여러 가지 기능을 제공하는데 메모리를 자동으로 정리해주는 가비지 컬렉션, 함수형 프로그래밍을 위한 람다 식, 비동기 프로그래밍 등이 있다. .NET 아키텍처 C#과 함께 빼놓을 수 없는 것이 .NET이다. 마이크로소프트는 어떤 플랫폼이던지 언어를 동작시킬 수 있도록 공용 언어 인프라(CLI; Common Language Infrastructure)라는 사양을 발표했는데, .NET은 이 사양에 맞춰 마이크로소프트가 구현한 프로그램인 공용 언어 런타임(CLR; Common Language Runtime)과 클래스 라이브러리 세트를 말한다. C#은 이러한 .NET 위에서 동작하는 프로그래밍 언어 중에 하나다.*..

Study/C# 2022.02.05

템플릿 메서드 패턴(Template Method Pattern)

개요 템플릿 메서드 패턴(Template Method Pattern)은 알고리즘의 뼈대를 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스에서 하는 패턴이다. 구조는 아래와 같다. 템플릿 메서드 패턴의 구조 TemplateMethod()에서 알고리즘의 뼈대를 정의하고 각 단계에서의 연산을 가상 함수로 만들어, 서브클래스에서 오버라이딩한다. 이 중 기본 행동을 제공하는 가상 함수를 훅 연산(Hook Operation)이라고 한다. 자주 사용되는 패턴이다. 특히 게임 엔진 사용할 때 Unity의 이벤트 함수 순서라던가 Unreal의 Actor 라이프 사이클 등이 그것이다. Unity나 Unreal은 이미 함수를 호출할 순서를 정의해놓고 우리가 사용할 때는 그것을 오버라이딩 하여 사용한다. using Un..

[BOJ] 5585번 거스름돈

복기해당 문제가 그리디로 풀었을 때 정당성을 가지는 이유는 가지고 있는 거스름돈의 큰 단위가 항상 작은 단위의 배수기 때문이다. 코드C++ 17 #include int M;int Rests[] = { 500, 100, 50, 10, 5, 1 }; int main(){ scanf("%d", &M); int target = 1000 - M; int ans = 0; for (int i = 0; i < 6; ++i) { ans += target / Rests[i]; target %= Rests[i]; } printf("%d\n", ans);} C# 6.0 using System; namespace Csharp{ class Program { static readonly int TARO_MONEY = 1000; s..

[BOJ] 9935번 문자열 폭발

복기괄호 쌍 찾는 문제와 비슷하다. 코드C++ 17 #include #include using namespace std; string Word, Bomb; // 끝에서부터 비교해 나가면 중첩되었더라도 삭제할 수 있다.bool CanExplode(const string& str){ if (str.back() != Bomb.back() || str.size() < Bomb.size()) return false; for (int i = 0; i < Bomb.size(); ++i) { if (str[str.size() - 1 - i] != Bomb[Bomb.size() - 1 - i]) return false; } return true;} int main(){ ios::sync_with_stdio(false);..