개요파이썬으로 개발한 프로그램을 외부로 배포해야할 수 있다. 외부의 환경에서는 프로그램이 사용하는 모듈이나 라이브러리가 없을 수 있고, 파이썬 자체가 설치되어 있지 않을 수도 있다. PyInstaller를 이용하면 프로그램에서 이용하는 모든 것을 패키징할 수 있다. 사용방법다음은 PyInstaller 매뉴얼이다.https://pyinstaller.org/en/v4.2/index.html 먼저 PyInstaller는 설치한다.pip install pyinstaller 다음으로 실행시킬 파이썬 파일을 지정하여 전체 프로그램을 패키징한다.pyinstaller --onefile main.py PyInstaller는 지정된 파이썬 파일로부터 재귀적으로 종속적인 모듈들을 모두 수집하여 바이너리파일로 패키징한다..
개요파이썬 파일에는 다양한 변수들을 쉽고 편하게 저장할 수 있다. 이는 파이썬 인터프리터가 구문분석을 통해 파일을 구조화하기 때문이다. 그래서 파이썬으로 개발을 하다 보면 컨피그 파일을 .py 파일로 구성하여 사용하곤 한다. 파이썬 파일로 구성된 컨피그는 dict와 같은 자료구조로 변수들을 쉽고 편하게 저장해둘 수 있기 때문이다.하지만 문제는 이러한 컨피그 파일이 프로젝트의 포함된 코드가 아니라 프로젝트 외부로부터 입력받아야하는 상황에서 발생한다. 예를 들어 어떤 개발자가 파이썬으로 만든 실행파일을 배포한다고 했을 때, 컨피그파일이 이미 프로젝트의 일부로 들어가 있다면 실행파일에 포함되어버릴 것이다. 이 문제를 해결하기 위해 literal_eval을 이용하면 컨피그를 외부로부터 입력받고, 파이썬 구문분석..
개요모든 재귀함수는 스택과 반복문으로 구현할 수 있다. 다만, 난이도가 높기 때문에 시도하기 어렵다.이 포스팅에서는 재귀함수를 스택과 반복문으로 구현하는 방법에 대해 다룬다. 구현 - Tail Recursion먼저 상대적으로 쉬운 Tail Recursion을 스택으로 변환해보자.예제로 사용될 알고리즘은 이진 탐색이다.int binarySearch(const std::vector& arr, int target) { int left = 0; int right = arr.size() - 1; while (left target) right = mid - 1; else left = mid + 1; } return -1;} 스택을..
소개모듈 다루기는 파이썬 프로그래밍에서 필수적이다. 모듈은 파이썬 정의와 명령어를 담은 파일이다. 어떤 파이썬 파일(.py)이라도 모듈이 될 수 있다. 개발을 하는 과정에서는, 때때로 다른 디렉토리에서 모듈을 가져와야 할 필요가 있다. 이는 코드를 여러 디렉토리에 조직적으로 관리해야 하는 큰 프로젝트에서 유용하다. 이 섹션에서는 파이썬에서 다른 디렉토리의 모듈을 어떻게 가져오는지 알아보는데, 시스템 경로를 수정하거나 상대 경로를 사용하는 방법을 포함해 여러 방법을 다룬다. 모듈 임포트 방법파이썬 프로젝트를 작업할 때, 종종 다른 모듈이나 패키지의 코드를 사용해야 할 수 있다. 모듈의 코드를 사용하려면 현재 파이썬 스크립트에 그 모듈을 가져와야 한다. 파이썬에는 스크립트에 모듈을 가져올 수 있게 해주는 i..
운영체제란 무엇인가?운영체제는 컴퓨터 프로그램이 하드웨어 자원을 이용할 수 있도록 하는 특수 소프트웨어 계층이다. 이는 컴퓨터 하드웨어와 사용자 응용 프로그램 사이에서 중개자 역할을 하며, 소프트웨어가 하드웨어와 일관되고 효율적으로 상호 작용할 수 있도록 한다. 운영 체제는 메모리 관리, 입력 및 출력 장치 처리와 같은 물리적인 인터페이스와 이를 추상화한 소프트웨어적인 인터페이스를 제공한다. 인기있는 운영 체제의 예로는 Windows, macOS, Linux 및 Android가 있다. 컴퓨터 게임을 하는 상황을 가정해보자. 키보드와 마우스를 통해 게임 캐릭터를 움직여주고 화면을 통해 출력되는 게임 화면을 본다. 내부적으로는 메모리에 게임 데이터가 적재된다. 게임을 플레이하다 저장 버튼을 누르면 디스크에 ..
C# Nullable 타입 소프트웨어 개발 세계에서 null 참조는 꽤나 골치아픈 문제로, 개발자들 사이에서 악명 높은 "NullReferenceException"으로 이어질 수 있다. 지속적으로 발전하고 있는 C# 언어는 이러한 문제를 해결하기 위해 안전성과 개발자의 생산성을 향상시키는 강력한 기능들을 도입하고 있다. C#의 최신 버전에서 주목할 만한 발전 중 하나는 nullability 기능의 도입 및 강화이다. 이번에는 C#에서 nullability의 중요성을 다루며, 코드 안전성과 명확성을 어떻게 향상시키는지 실용적인 예시와 함께 살펴본다. Nullable을 활용해 Non-Nullable 타입을 Nullable로 만들기 C#에서 타입 시스템은 변수가 null 값을 가질 수 있는지를 구분하는 데 큰..
C# 불변성 처리 소프트웨어 개발이 발전하는 과정 속에서, 불변성의 원칙은 견고하고 thread-safe한 애플리케이션을 만드는 기초로 자리잡았다. 불변성은 객체가 생성된 후 변경되지 않는 능력을 의미한다. 이 개념은 비록 간단해 보일지라도, 특히 동시성과 멀티 스레드 프로그래밍의 영역에서 많은 이점을 가져다 준다. 이 글에서는 불변성을 위한 C#의 새로운 기능들, 그리고 readonly 및 const와 같은 다른 C# 구문과의 차이점을 알아볼 것이다. 불변성의 장점 불변성의 주된 매력은 그 단순성과 예측 가능성에 있다. 한 번 초기화되면, 불변 객체는 그 상태가 변경되지 않을 것이라는 보장을 제공하여, 특히 여러 스레드가 동시에 데이터에 접근하는 환경에서 상태 관리와 관련된 다양한 버그의 가능성을 없앤..
C# 비동기 프로그래밍 C#의 async와 await 키워드는 비동기 작업을 다루는 과정을 간소화하여 비동기 코드를 더 읽기 쉽고 유지보수하기 쉽게 만드는 데 사용된다. 비동기 프로그래밍은 시간이 많이 걸리는 작업(예: I/O 작업, 웹 요청, 데이터베이스 트랜잭션 등)을 메인 스레드를 차단하지 않고 실행할 수 있게 해주므로, 사용자 인터페이스의 반응성을 유지하고 서버 측 응용 프로그램의 확장성을 향상시키는 데 필수적이다. async와 await async 키워드는 메소드, 람다 표현식 또는 익명 메소드를 비동기적으로 표시하는 데 사용된다. async 메소드는 호출자의 스레드를 차단하지 않고 잠재적으로 오래 걸리는 작업을 수행하는 편리한 방법을 제공한다. async 메소드는 await 표현식에 도달할 때..
ChatGPT와 오목 두기 Chat GPT는 텍스트 기반의 데이터를 이해하고 인간과 같은 자연스러운 대답을 만들어준다. 물론 이 과정은 무수히 많은 데이터를 통계적으로 처리하여 이루어질 것이다. Chat GPT를 너무나도 잘 쓰고 있는 입장에서 문득 들었던 의문이 있다. 과연 오목과 같은 특수적인 상황에서도 적절한 의사결정을 할 수 있을까? 이 의문을 해소하기 위해 Chat GPT와 오목을 둘 수 있는 환경을 개발해볼 계획이다. 개발 계획 1. ChatGPT API 이용 2. ChatGPT Function Calling을 통해 게임과의 인터페이스 개발 3. 게임 개발 4. 테스트 ChatGPT API 개발을 위해 ChatGPT를 이용하기 위해서는 직접 ChatGPT API를 코드를 통해 호출해야한다. C..
힙 (Heap) 힙(Heap)은 완전 이진트리인 특별한 트리를 기반으로 한 자료구조이다. 힙에는 최대힙과 최소힙이 있는데, 최대힙은 최대값을 다루는데 특화되어 있고 최소힙은 최소값을 다루는데 특화되어 있다. 각 힙은 일련의 원소들이 주어졌을 때 최대 or 최소 원소를 빠르게 조회, 삭제할 수 있다. 또한 각 힙 모두 임의의 원소를 빠르게 삽입할 수 있다. 최대, 최소 원소를 다루는 특수적인 상황에 있어 효율적이고, 의외로 최대 최소 원소를 활용해야 하는 상황이 많이 발생하기 때문에 굉장히 중요한 자료구조에 속한다. (우선순위큐도 힙으로 제작된다.) 힙에서 제공하는 연산들을 배열과 비교해보자. 값 삽입 배열 : O(1) 힙 : O(log N) 최대값 or 최소값 삭제 배열 : O(N) 힙 : O(logN)..
Event Convention C#의 이벤트 관련 컨벤션은 꽤나 복잡하다. 개발하는 조직에 따라서도 많이 달라질 수 있으므로 네이밍 컨벤션의 경우에는 현재 속한 조직에 맞게 적용하는것이 바람직할 것이다. 다만, 유니티에서 이벤트와 연관된 개념들이 어떻게 분리되어야 하는지, 어떤 그룹으로 구분되어야 하는지에 대해서는 정리해둘 필요가 있다. 구분 기준을 명확하게 정해두었다면 조직에 따라 네이밍 기준이 달라지더라도 개발에 있어서 컨벤션을 통한 생산성을 극대화시킬 수 있을 것이다. 다음은 MS에서 제공하는 이벤트 네이밍 컨벤션이다. https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members#names-of-ev..
카드 시스템 플레이어가 카드를 사용하는 모든 행동과, 시스템이 카드를 다루는 모든 동작들에 대한 내용을 카드 시스템으로 정리한다. 카드를 다루기 위해 알아야하는 모든 개념들과 동작 원리에 대한 내용을 다룬다. 카드 더미 카드 더미는 손 카드 더미(Hand Cards Pile), 뽑을 카드 더미(Draw Cards Pile), 버려진 카드 더미(Discarded Cards Pile), 제외된 카드 더미(Excluded Cards Pile)로 구성된다. 다음 이미지는 왼쪽에 뽑을 카드 더미, 가운데에 손 카드 더미, 오른쪽에 제외된 카드 더미와 버려진 카드 더미를 나타낸다. 카드 행동 및 동작 카드 뽑기(Draw)는 뽑을 카드 더미에서 카드를 손 카드로 가져오는 행동 및 동작을 의미한다. 카드 뽑기 과정에서..
Multithreading에 대해 컴퓨터에는 CPU라는 연산 장치가 존재한다. CPU의 코어에서는 명령 집합들을 빠른 속도로 처리하는데 이 처리되는 단위를 Thread라 부른다. 현대의 CPU는 여러 개의 코어들로 구성되어 있고, 여러 스레드가 동시에 여러 명령 집합들을 수행할 수 있다. 여러 개의 스레드를 동시에 사용한다면, 하나의 스레드만 사용하는 것보다 훨씬 CPU를 효율적으로 활용할 수 있다. 이처럼 두 개 이상의 스레드를 통해 동시에 실행하는 것을 멀티스레딩이라 부른다. 스레드에 대해 자주 혼동하는 것 중 하나가 있다. 처리되는 단위를 스레드라 부르는데, 이것이 스레드를 코어 개수만큼만 생성해야 한다는 의미는 아니다. 스레드는 1000개 10000개까지도 생성시킬 수 있다. 다만, 코어의 개수가..
Partial Class란? C#에서 Partial Class는 단일 클래스를 여러 소스 코드 파일에 나눠서 정의할 수 있는 기능이다. Partial Class의 각 부분은 동일한 클래스 정의에 기여하며 컴파일러는 컴파일 중에 해당 부분을 단일 클래스로 병합한다. Partial 클래스는 주로 구현 세부 사항을 분리하고 코드베이스를 보다 체계적이고 유지 관리하기 쉽게 유지하는 데 사용된다. 특히 코드 생성 도구나 여러 개발자가 관련된 시나리오에서 더욱 그렇다. 코드 생성 부분 클래스는 일반적으로 코드 생성 도구(예: Entity Framework)와 함께 사용되어 자동 생성 코드를 사용자 지정 코드와 분리한다. 이러한 분리를 통해 개발자는 생성된 코드에 영향을 주지 않고 사용자 지정 코드를 수정할 수 있다..
인터페이스란? Java나 C#과 같은 언어들을 보면 Interface라는 강력한 개념이 존재한다. 인터페이스는 객체에 대한 명세서만 나타내고 구체적인 구현은 각 파생 객체에서 작업하도록 한다. 명세서에는 메서드, 프로퍼티, 이벤트와 같은 것들이 포함될 수 있다. 겉으로만 보면 별로 대단할 것 없어 보이는 개념이지만, 인터페이스를 잘 활용한다면 객체지향 개발에 있어서 신세계를 경험할 수 있다. C++을 이용한 인터페이스 구현 C++은 언어 차원에서 인터페이스를 명시적으로 지원하지는 않는다. 하지만 C++ 자체에서 갖고 있는 개념인 추상 클래스와 순수 가상함수를 조합하여 인터페이스를 구현할 수 있다. class IPrintable { public: virtual void Print() = 0; // Pure..
C++ Casting C++에는 여러가지 캐스팅 방법들이 존재한다. C Style Casting C에서 계승받은 전통적인 캐스팅 방법으로 여러 캐스팅 작업을 복합적으로 사용한다. 편리할 수 있지만 덜 명확하고 예상치 못한 동작이 발생할 수 있다. 잠재적인 문제를 숨길 수 있으므로 최신 C++ 코드에서는 권장되지 않는다. double numDouble = (double)42; 최신 C++에서는 가능하면 static_cast, dynamic_cast, const_cast와 같은 보다 구체적인 형변환 연산자를 사용하는 것이 일반적으로 권장된다. 이러한 연산자는 더 나은 유형 안전성을 제공하고 코드를 보다 명확하게 구분할 수 있도록 해주기 때문이다. 그러나 하위 수준 작업에 reinterpret_cast를 사용..
DateTime DateTime은 언리얼에서 시간을 관리하기 위해 사용하는 구조체이다. 다음과 같이 현재 시간에 대한 정보를 얻을 수 있다. FDateTime CurrentTimestamp = FDateTime::Now(); 얻은 타임스탬프를 초로 환산하고 싶은 경우 다음과 같이 한다. FDateTime CurrentTimestamp = FDateTime::Now(); FDateTime UnixEpochTime = FDateTime(1970, 1, 1); double TotalMilliseconds = (CurrentTimestamp - UnixEpochTime).GetTotalMilliseconds(); 두 타임스탬프를 비교하고 싶은 경우 둘 다 초로 환산하여 비교하면 된다. 타임스탬프를 직접 비교하는..
Chat GPT를 이용한 게임개발 Chat GPT를 이용하여 게임을 만들 수 있는지 테스트해보자. 게임은 5 x 5 그리드 월드에서 각 플레이어들이 두 개의 캐릭터에게 턴제로 명령을 주어서 서로를 죽이는 것을 목표로 진행된다. 이 게임에 대해 Chat GPT를 설명하려면 구체적인 텍스트 기획이 갖춰져야 할 것이다. 이를 대화를 통해 학습시키고 학습이 어느정도 완료된 시점에서 코드를 요구해볼 것이다. Algorfati Let's play game I made! Chat GPT Sure, I'd be happy to play your game! What kind of game did you make? Please tell me the rules and how to play. Algorfati Here is ..
Unreal HTTP Request HttpModule은 언리얼에서 Rest API를 편하게 이용할 수 있도록 설계될 모듈이다. 현재 프로젝트의 MyExample.Build.cs 파일에서 다음 모듈들을 포함시켜준다. PrivateDependencyModuleNames.AddRange( new string[] { "HTTP", "JsonUtilities", "Json" }); Header // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "Runtime/Online/HTTP/Public/Http.h" #inclu..
TCP Socket을 구현하는 방법들 TCP Socket은 네트워크 레벨에서의 기능을 담당한다. Connect, Read, Write, Disconnect 등등과 같은 기능들이 있을 것이다. 다만 이 소켓을 이용한 함수들을 이용하는데에는 필연적으로 직면하게 되는 문제가 있다. 네트워크 레벨을 통해서 데이터를 주고받아야 하기 때문에, 네트워크 레벨에서 버퍼에 데이터가 모두 준비되지 않았을 경우, 이 상황을 어떻게 처리해야할까? 이러한 문제에 대해 여러가지 방법으로 대응이 가능하다. 다음과 방법들이 있다. 1. Blocking I/O TCP 소켓의에서 Blocking I/O는 가장 간단하고 일반적으로 사용되는 접근 방식이다. Blocking I/O를 이용하여 Socket의 기능을 이용하는 경우 어플리케이션은..
기본 개념 우리들이 흔히 사용하는 ChatGPT는 언어 모델을 기반으로 한 텍스트 생성 AI 서비스이고, OpenAI에서 제공하는 여러 서비스들 중 하나이다. OpenAI 에서는 ChatGPT 외에도 여러 서비스들을 제공해주고 있다. ex) 이미지 생성, 오디오 생성, TTS 보통 ChatGPT 3.5는 무료이기 때문에 일반인들도 많이 사용하지만, 4.0 부터는 유료이기 때문에 따로 결제를 해서 사용해야한다. 여기서 ChatGPT 4.0을 결제했으니 ChatGPT API도 무료로 사용할 수 있어야 하는 것 아닌가? 라고 헷갈려하는 경우가 많은데, ChatGPT 4.0 결제는 OpenAI 에서 제공하는 서비스를 구독한 것이므로 서비스 이용은 자유롭게 할 수 있겠지만 API를 무료로 사용할 수는 없다. 즉,..
유니티 설계 경험유니티를 이용하면서 내가 경험한 내용을 정리한 글이다. 이 글은 유니티를 개발하는 과정 속에서 지속적으로 업데이트 될 예정이다. 핵심 개념다음 개념들은 알고 시작하는 것이 좋다. 유니티 버전단위 문서유니티 버전에 따른 매뉴얼이다. 이 문서를 통해 대부분의 유니티 관련한 이용방법을 숙지할 수 있다.https://docs.unity3d.com/2021.2/Documentation/Manual/index.html Unity - Manual: Unity User Manual 2021.2Use the Unity Editor to create 2D and 3D games, apps and experiences. Download the Editor at unity3d.com. The Unity Us..
AWS Amazon Web Services(AWS)는 전 세계적으로 분포한 데이터 센터에서 굉장히 다양한 서비스들을 제공하는 클라우드 플랫폼이다. 특히 스타트업처럼 빠르게 서비스를 개발해서 출시까지 해봐야 하는 상황에서 AWS는 필수적이다. 먼저 AWS에서 가장 핵심적인 개념들을 알아보자. AWS 기본 설계 구조 AWS를 이용한 가장 단순한 서비스 구조도이다. 1. 인스턴스 (EC2) 인스턴스는 AWS 에서의 하나의 가상 서버를 의미한다. 즉 하나의 가상화된 컴퓨팅 환경으로 RAM이나 코어와 같은 하드웨어 스펙을 설정할 수 있고, 어떤 OS를 설치할 것인지도 정할 수 있다. (인스턴스는 AWS에서의 가장 핵심적인 개념이며 이것들이 모인 집합을 클라우드라 부른다.) 만약 우리가 서버 개발을 통해 어떤 프로..