전체 글 169

[WinAPI] 01. Windows 데스크톱 어플리케이션 메인 분석

Windows 데스크톱 어플리케이션을 실행하면 위와같은 파일이 자동 생성됩니다. 콘솔 앱과는 사뭇다른 모습이고 처음보는 함수들이 난무합니다. 심지어 main도 안보이구요. 어쨌든 이 구조가 기본 window 프로그램을 만들기위한 프레임워크입니다. 위에서부터 천천히 분석해보도록 하겠습니다. 전역변수들을 볼 수 있습니다. WCHAR은 그냥 2바이트 char 자료형을 재정의한 것 입니다. HINSTANCE 는 프로그램의 HANDLE을 의미합니다. 윈도우 운영체제에서 실행되는 프로그램을 구별하기위한 ID값인데, HINSTANCE는 Win32 프로그램이 메모리 상에 올라가있는 시작 주소 값을 저장하는 자료형입니다. 즉, HINSTANCE (핸들 인스턴스) 는 내 프로그램의 시작 주소라고 볼 수 있죠 즉, hIns..

Window API 2024.01.30

[C++] 백준 1261. 알고스팟

https://www.acmicpc.net/problem/1261 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미 www.acmicpc.net 문제 아이디어 BFS 문제의 대표격 중 하나인 미로찾기 문제입니다. 그러나 시간 제한이 1초이기 때문에 O(N^2) 인 BFS로는 풀 수 없고, O(N logN) 인 다익스트라 알고리즘을 이용해서 풀어야만 합니다. 맨 좌측 상단에서 시작해서 맨 우측 하단까지 어떻게 도달할 것인가? 에 대한 문제이고 1은 벽인데 필요하다면 벽을 부술수도 있습니다. 단, 벽을 최대한 적게 부수면..

[C++] 백준 17070. 파이프 옮기기1

1. 문제 https://www.acmicpc.net/problem/17070 2. 아이디어 다이나믹 프로그래밍으로 풀 수 있는 문제일 것 같다. 특정 좌표를 (y, x) 라고 했을 때 파이프의 우측 좌표를 기준으로 (좌측 좌표는 생각할 필요 없다.) (y, x) 에 가로로 도착할 횟수 + (y, x) 에 세로로 도착할 횟수 + (y, x) 에 대각선으로 도착할 횟수 의 합을 구하면, 해당 좌표에 도달할 수 있는 모든 경우의 수가 된다. 이 때, 벽에 막힐수도 있기에 예외처리에 신경쓴다. 3. 풀이 먼저 전역변수 목록이다. tableSize는 격자의 크기 table은 격자의 정보를 입력하는 부분 dpRight, dpDown, dpRD 는 각각 특정 좌표에 가로로 도착하는 경우, 세로로 도착하는 경우, 대..

[C++/디자인패턴] 빌더 패턴 (Builder Pattern)

1. 개요 빌더 패턴은 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴입니다. 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식이죠. 예를 들어서 몬스터를 만들어낸다고 생각합시다. 몬스터는 종족, 공격력, 체력, 방어력 등 많은 매개변수를 가지고 있습니다. 이것들을 커스텀해서 생성하는 방식을 지원하는 것이 빌더 패턴입니다. 2. 예제 주석에 적힌대로 위와같은 형식으로 생성을 한다면 어떤 매개변수를 설정하는지 명확하지 않습니다. 이런 식으로 따로 생성을 위한 빌더를 정의해서 사용하면, 몬스터에 대한 청사진도 만들 수 있고, 명확하게 매개변수를 전달할수도 있습니다. 이렇게 청사진을 만들어놓고 빌드자체를 나중에 따로..

[C++/디자인패턴] 커맨드 패턴 (Command Pattern)

1. 개요 커맨드 패턴은 행동 디자인 패턴 중 하나로, 행동을 객체화 하는 것이 목표입니다. 명령을 인터페이스로 하여 하위에 구체적인 명령을 재정의합니다. 명령들을 객체로 캡슐화해서 사용할 수 있도록 하는 패턴을 뜻합니다. 2. 기본 구조 커맨드 패턴은 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우 유용합니다. 예를들어 게임에서 캐릭터에게 단축키 설정을 할 수 있는 경우가 있죠. WASD로 기본적으로 이동할 수 있지만, 사용자에 따라서 IJKL 로 이동하고 싶은 사람도 있을테니 말이죠. 또, 여러 커맨드를 조합하여 하나의 커맨드처럼 사용해야할 때, 커맨드 실행 취소 및 재실행 등의 기능을 구현해야 할 때 유용합니다. 이런 식으로 코딩하는 것을 막는 디자인 패턴이죠. 3. 예제 이렇게..

[C++/디자인패턴] 옵저버 패턴 (Observer)

1. 개요 옵저버 (혹은 관찰자, 리스너) 패턴은 객체의 상태 변화를 관찰하는 관찰자를 두어, 어떤 객체의 상태가 변하면, 그와 연관된 객체들에게 알림을 보내는 패턴입니다. 옵저버 패턴을 활용하면 연관된 객체가 어떤 객체의 상태가 변할시 별도의 함수 호출 없이 즉각적으로 알 수 있기 때문에, 이벤트에 대한 처리를 해야할 경우 유용하게 사용됩니다. 예를들어 플레이어가 열쇠 4개를 모으면 문이 열리는 게임이 존재한다고 해봅시다. 플레이어가 문에 대한 정보를 알고있고 문에대해서 직접 이벤트를 처리해주는 것은 OOP 의 설계 원칙과는 맞지 않습니다. 플레이어가 홀로 너무 많은 일을 떠맡고 있는 것이죠. 그래서 플레이어에게 옵저버를 두어, 플레이어가 열쇠를 획득할 때마다 옵저버들에게 열쇠를 획득했다고 알리는 설계..

[C++/디자인패턴] 상태 패턴 (State Pattern)

상태 패턴 1) 개요 스테이트 패턴은 객체가 특정 상태에 따라 다른 기능을 구현할 때, 객체가 자기 상태에 따라 행위를 호출하는 것이 아니라, 상태를 객체화하여 상태가 행동을 할 수 있도록하는 패턴을 말합니다. 2) 기본 구조 예를들어 게임 캐릭터가 있다고 상상해봅시다. 게임캐릭터는 대기, 점프, 달리기, 웅크리기 총 4개의 상태를 가지고 있다고 하고 각각 상태에 따라 공격을 구현해봅시다. 그런데 이 코드에는 단점이 있습니다. 만약 캐릭터가 공격뿐만 아니라 공격, 방어, 스킬 총 3개의 동작이 존재한다고 하면 case처리만 12개로 늘어나 버립니다. 여기서 상태도 늘어나버린다면, 코드가 더욱 복잡해지겠죠? 그래서 이 때 사용하는 것이 스테이트 패턴입니다. 3) 예시 이런 식으로 상태를 객체화해서 상태가 ..

[C++/디자인패턴] 싱글톤 (Singletone)

개요 싱글톤 패턴은 하나의 클래스가 하나의 객체만 가지도록 하면서 이 객체에 대한 접근은 전역으로 제공하는 디자인 패턴 입니다. 게임을 만들 때 오브젝트를 관리하거나, 씬을 관리할 때 주로 싱글톤 패턴을 사용합니다. 전역적으로 접근할 수 있고, 하나의 객체만 존재하니 필요할때 객체에 접근해서 꺼내쓰는 것이죠. 리소스 관리, 데이터 공유가 필요할 때 사용하면 좋은 패턴입니다. 싱글톤 패턴 1) 개요 싱글톤 패턴은 클래스의 객체가 오직 하나만 생성되도록 보장합니다. 이 패턴은 단일 데이터베이스 객체처럼, 모든 객체에서 이용할 수 있는 단일 인스턴스가 필요할 때만 사용해야합니다. 2) 기본 구조 싱글톤 메소드 내부에서 getInstance 라는 static 함수를 선언합니다. 이 메소드는 자기 자신의 stat..

[C++/디자인패턴] 팩토리 메소드 패턴

개요 팩토리 패턴은 객체를 생성하기 위한 디자인 패턴으로, 이러한 종류의 디자인 패턴을 생성 패턴이라고 합니다. 말 그대로, 객체를 생성하는 역할을 담당하고 있는 클래스, 함수를 만든다라고 보시면 되겠습니다. C++ 코딩에서는 메모리 관리를 개발자 스스로 해야하기 때문에, 객체의 생성을 아무데서나 하기는 부담스럽습니다. 더하여, 생성자를 여기저기서 호출할 경우 유지보수에도 별로 좋은 코드는 아니죠. 그래서 생성만을 담당하는 팩토리 객체를 만들면 누가 언제 어디서 객체를 생성하는지 알 수 있고 관리도 쉬워집니다. 팩토리 패턴에는 팩토리 메서드 패턴, 가상 팩토리 패턴이 있습니다. 이번 포스팅에서는 팩토리 메서드 패턴만 다루도록 하겠습니다. 팩토리 메서드 패턴 1) 개요 팩토리 메서브 패턴은 부모 클래스에서..

???: 객체 지향 프로그래밍이 뭐야?

이때까지 객체 지향 프로그래밍만 해왔지만 정확히 객체 지향 프로그래밍은 ~야 라고 말하기는 힘든 것 같다. 그래서 이번 포스팅으로 간결하게 정리하고자 한다. 1. 객체 지향 프로그래밍이란? 단순히 데이터와 로직에 의해 프로그램이 진행되는 것이 아니라, 상태와 기능을 가지는 '객체' 라는 단위로 추상화하여 객체들 끼리의 상호작용으로 프로그램을 설계하는 방식을 뜻합니다. 2. 객체란 무엇인가? 서로 연관된 변수와 메소드를 묶어서 관리할 수 있는 것을 객체라고 정의할 수 있습니다. 3. 객체 지향의 특징은 무엇인가? 객체 지향의 특징은 크게 추상화, 캡슐화, 상속성, 다형성의 특징을 가집니다. 1) 추상화 불필요한 정보는 숨기고 중요한 정보만들 표현함으로써 핵심적인 개념과 기능을 간추려 내는 것을 뜻합니다. ..