분류 전체보기

프로그래밍/C++

[C++] 객체 복사

객체 복사 C#, Java, Python 같은 다른 많은 언어에서는 객체에 대해 = 연산을 수행하였을 경우 객체 복사를 수행하지 않는다. 하지만 C++에서는 class가 = 연산을 수행하였을 경우 복사가 일어난다. #include #include using namespace std; class Data { public: int data1; int data2; string data3; }; void Print(const Data& data) { cout

프로그래밍/알고리즘

[Algorithm] 해시 테이블

해시 테이블 먼저 배열에 대해 생각해보자. 배열은 컴퓨터 프로그래밍에 있어서 가장 근본이 되는 자료구조이다. 레지스터가 메모리 어드레싱을 통해 특정 번지의 값을 바로 참조해올 수 있는 것처럼, 배열도 특정 주소의 공간을 바로 참조해올 수 있다. 사실 이 특성은 굉장히 유용하게 활용될 수 있다. 특정 위치를 탐색비용 없이 참조해 올 수 있다는 것은, 어떤 데이터들을 저장할 때, 각 데이터가 저장될 위치를 결정할 수 있다고 가정했을 때, 아무런 탐색비용 없이 그 데이터를 저장하고 참조해올 수 있는 자료구조를 설계할 수 있다는 의미이다. 리스트와 같은 일반적인 컨테이너가 저장비용으로 O(1), 데이터 참조 비용으로 O(N) 인 것을 감안했을 때, 저장비용 O(1), 참조비용 O(1)은 자료구조로서 엄청나게 효..

프로그래밍/알고리즘

[Algorithm] 이진 탐색 트리

이진 탐색 트리 (Binary Search Tree) 이진탐색트리는 키(Key)를 기반으로 한 데이터들을 트리 구조로 관리하는 노드기반 자료구조이다. 루트 데이터의 키를 기준으로 더 작은 키 값을 갖는 데이터들은 왼쪽 하위 서브트리에 위치시키고, 더 큰 키 값을 갖는 데이터들은 오른쪽 하위 서브트리로 위치시킨다. 그리고 각 서브트리들은 재귀적으로 같은 전략을 통해 새로운 데이터들을 위치시킨다. 일반적인 리스트 형태로 구조화된 자료구조에서는 데이터를 탐색하기 위한 비용이 O(N) 정도인 반면, 이진 트리 형태로 자료를 구조화시키고 나면, 이진탐색을 통해 원하는 데이터를 찾기 위한 탐색비용을 O(logN)까지 줄일 수 있다. 예를 들어 7을 키로 갖는 데이터를 찾고자 한다면, 다음과 같은 순서로 찾을 수 있..

프로그래밍/알고리즘

[Algorithm] 정수론

소수 소수판별 어떤 자연수 N을 입력으로 받았을 때, 그 자연수가 소수인지 아닌지 판단하는 알고리즘을 작성해보자. 어떤 자연수 N이 소수라고 한다면, 그 수는 1과 자기자신 외의 약수를 가지지 않는다. 그러므로 가장 간단하게 알고리즘을 작성한다면 2부터 N-1까지의 모든 자연수로 나누어 보고, 한번이라도 나누어진다면, 소수가 아니고, 단 한번도 나누어지지 않았다면 소수라고 할 수 있을 것이다. 하지만, 합성수의 대한 개념을 이용하면, 이 알고리즘을 조금 더 최적화시킬 수 있다. 합성수란, 1과 자기자신 외의 다른 약수를 갖고있는 수를 의미한다. 예를 들어 6은 2*3으로 표현될 수 있으므로 합성수이다. 소수와 완전 반대되는 개념을 갖으므로, 어떤 수가 합성수라면, 소수가 아니다. 어떤 자연수 N이 입력으..

프로그래밍/C++

[C++] C++의 데이터 타입 종류

C++ Data Types C++의 모든 타입은 기본 타입, 파생 타입, 사용자 정의 타입으로 구분할 수 있다. 기본 타입 (Primary Type) 기본 타입은 C++에서 기본적으로 사용되는 타입들을 의미한다. 다음과 같은 기본 타입들이 존재한다. // primitive types bool a = false; char b = 'a'; unsigned char c = 255; short d = 32767; unsigned short e = 65535; int f = 2147438647; unsigned int g = 4294967295; long h = 2147438647; unsigned long i = 4294967295; long long j = 9223372036854775807; unsigned..

프로그래밍/CS 개념

[CS] 메모리 구조

메모리 구조 프로세스의 메모리 (RAM) 구조는 다음과 같은 형태로 구성된다. 코드 영역 메모리의 코드 영역은 실행할 프로그램의 코드(명령어) 자체가 저장되는 영역이다. 텍스트 영역이라고도 불리는데, 이 영역에서 CPU는 저장된 명령어를 하나씩 가져가서 처리한다. 데이터 영역 메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. ex) 다음 변수들은 데이터 영역에 저장된다. int global_value = 10; void temp() { static int static_value = 10; } 스택 영역 메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매..

프로그래밍/CS 개념

[CS 기초] Managed vs Unmanaged 언어

Managed 언어 Managed 언어란 특정 런타임 환경 내에서, 프로그램을 생성하도록 설계된 언어를 의미한다. 이러한 언어들은 대부분 인터프리터나, VM(Virtual Machine)을 지원하고, 프로그램의 코드가 이 위에서 동작하도록 설계되어 있다. 소스코드를 컴파일하는 과정은 VM 위에서 이루어지고, 실행파일 또한 VM 위에서 동작하게 된다. 추가로 VM은 메모리 관리(Garbage Collector .. ), 운영체제 차원의 보안성을 위한 관리 등의 역할을 수행한다. Python, JavaScript, Java, C# 등등의 언어가 managed 언어에 속한다. Unmanaged 언어 따로 VM과 같은 런타임 환경의 관리를 받지 않는 모든 언어는 unmanaged 언어라고 할 수 있다. 우리가 ..

프로그래밍/CS 개념

[CS 기초] 정적타입 언어 vs 동적타입 언어

컴파일 과정 소스코드를 작성하고 빌드를 하게되면 일반적으로 다음과 같은 과정을 통해 실행파일이 만들어진다. 소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output) 전처리기는 소스코드 자체에 대한 수정을 담당한다. 컴파일러는 소스코드를 어셈블리 코드로 번역한다. 어셈블러는 어셈블리 코드를 목적코드로 번역한다. 링커는 생성된 목적코드들을 링킹하여 실행파일을 만든다. 컴파일타임 & 런타임 전체 컴파일 과정과 그 이후 과정 중, 실행파일이 만들어지는 순간까지를 컴파일타임이라 부르고, 실행파일이 실행된 후의 시간대를 런타임이라 부른다. 소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output) -> 실행 컴파일타임 런타임..

프로그래밍/알고리즘

[Algorithm] 정렬

기본 개념 정렬은 컨테이너에 저장된 데이터를 크기 순으로 나열하는 알고리즘을 말한다. 정렬 알고리즘은 굉장히 많은 알고리즘들의 기초 토대가 되기 때문에, 잘 알고 있어야한다. 다음과 같은 수열이 있다고 가정해보자. 3, 500, 2, 600, 5, 150, 800, 1, 2500, 800 수열을 작은 수에서부터 큰 수로 나열하는것을 오름차순 정렬이라 한다. 1, 2, 3, 5, 150, 500, 600, 800, 800, 2500 수열을 큰 수에서부터 작은 수로 나열하는것을 내림차순 정렬이라 한다. 2500, 800, 800, 600, 500, 150, 5, 3, 2, 1 어떤 정렬 알고리즘으로 수열을 정렬하였을 때 같은 크기의 원소가 정렬 후에도 순서가 유지된다면, 그 정렬을 Stable Sort라 부..

프로그래밍/알고리즘

[Algorithm] 백준 온라인 저지 문제 풀이

별찍기 - 7 www.acmicpc.net/problem/2444 2444번: 별 찍기 - 7 첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다. www.acmicpc.net 소스코드 #include #include using namespace std; int main() { // 별찍기 - 7 int n; cin >> n; // scanf // 5가 들어왔을 경우 -4 ~ 4 for (int y = -(n - 1); y to; reverse(v, from, to); } print(v); return 0; } 미로 탐색 www.acmicpc.net/problem/2178 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 ..

프로그래밍/알고리즘

[Algorithm] 프로그래머스 - 코딩 테스트 연습 풀이

코딩테스트 연습 > 해시 > 완주하지 못한 선수 programmers.co.kr/learn/courses/30/lessons/42576 코딩테스트 연습 - 완주하지 못한 선수 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수 programmers.co.kr 소스코드 github.com/insooneelife/AlgorithmTutorial/blob/master/Algorithm/Sources/Hash/Solutions/Programmers/%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80%20%EB%AA%BB%ED%95%9C%20%EC%84%A0..

프로그래밍/알고리즘

[Algorithm] 프로그래머스 - 2021 KAKAO BLIND RECRUITMENT 풀이

코딩테스트 연습 > 2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천 programmers.co.kr/learn/courses/30/lessons/72410 코딩테스트 연습 - 신규 아이디 추천 카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로 programmers.co.kr 시행착오 6단계에서 연산 후 . 문자열을 제거해야하는데, 문제를 꼼꼼히 읽지 않아서 시간을 좀 소모함. 소스코드 github.com/insooneelife/AlgorithmTutorial/blob/master/Algorithm/Sources/String/Solutions/Progr..

프로그래밍/C++

[C++] friend

friend 키워드 C++에서는 캡슐화를 위한 접근지정자(private, protected, public)들을 갖고 있다. 그 중 private과 protected로 지정된 함수 및 변수들은 외부에서 접근이 불가능하다. (protected는 하위클래스에서 접근 가능) 이러한 상황에서 어떤 특정 객체 or 함수에서만 예외적으로 접근을 허용하도록 하기 위해 friend 키워드를 이용한다. ex) Item이라는 클래스가 있다. 이 클래스는 Init이라는 함수를 통해 내부 변수들을 초기화한다. 그러므로 외부에서 Item 객체 생성 후 반드시 Init 함수를 따로 호출해야한다. 그리고, Item 클래스는 반드시 ItemManager 클래스를 통해 생성되어야한다. (이유는 여러가지겠지만, ItemManager에서 ..

게임 엔진/Unreal

[Unreal] 플러그인과 모듈

Module 언리얼에는 모듈이라는 개념이 있다. 모듈은 언리얼 엔진의 기본 구성요소이다. 모든 언리얼 엔진 프로젝트는 최소 하나의 primary모듈, 하위 모듈, thirdparty 모듈, plugin모듈들의 집합으로 구성된다. 각 모듈은 일정한 함수들을 (경로와 전처리를 포함하여) 캡슐화하고, 다른 모듈에서 사용할 수 있도록 공용 인터페이스와 컴파일 환경을 제공한다. 모듈은 C# 소스파일에 .build.cs 확장자로 선언되고, 프로젝트의 Source 디렉터리 아래에 저장된다. c++ 소스 파일들은 .build.cs 파일 옆이나 그 하위 디렉터리에 저장된다. 각 .build.cs 파일에서는 ModuleRules라는 c# 객체를 상속받은 객체를 정의하고, 이 객체 내부에서 어떻게 빌드할지를 제어하도록 프로..

게임 엔진/Unreal

[Unreal] Android 디버깅 방법들

안드로이드 앱에 대해 로깅이 필요할 수 있다. 선행작업 안드로이드 앱을 로깅하기 위해서는 먼저 선행되어야 하는 부분이 있다. 앱이 shipping으로 빌드되면 로그가 나타나지 않기 때문에 다음과 같이 빌드를 해야한다. 1. 프로젝트 세팅 -> 플랫폼 -> Android -> 앱 번들 -> 앱 번들 생성 = false 2. 프로젝트 세팅 -> 프로젝트 -> 패키징 -> 프로젝트 -> 빌드 환경설정 = Development, 배포용 = false 빌드된 apk파일을 모바일폰에 설치하고, 모바일폰을 usb로 연결한다. 언리얼 에디터를 이용한 방법 언리얼 에디터에서 모바일 디바이스 로그를 확인하기 위해 디바이스 출력 로그를 실행시킨다. 창 -> 개발자 툴 -> 디바이스 출력 로그 밑에 미확인 디바이스를 탭 하여..

서비스 운영

[Unreal] Google Play 광고 시스템 이용

언리얼에서 Google Play 광고시스템을 이용하기 위한 메뉴얼이다. 먼저 구글 AdMob 계정을 만들어야한다. AdMob 계정을 만들고 세팅하는 부분은 다음 영상을 참고하자. www.youtube.com/watch?v=YLXdzKTqfkY&t=88s 그리고 언리얼에서 Google AdMob을 이용하기 위해 해주어야 할 작업이 있다. 언리얼 In-Game Ad Mob 설정 공식 문서 docs.unrealengine.com/en-US/SharingAndReleasing/Mobile/Android/Ads/index.html Using Ad Mob In-Game Ads on Android Using the AdMob in-game advertisement system on Android. docs.unrea..

게임 엔진/Unreal

[Unreal] 언리얼로 Google Play 결제 시스템 이용하기

언리얼에서 google play 결제 시스템을 이용하기 위한 메뉴얼이다. 언리얼 시스템은 google play 결제 시스템을 한번 래핑해 두었기 때문에, 결제 시스템을 구축하기 위해서 해주어야 할 작업이 google play 결제 관련 공식 문서와 조금 다르다. 준비해주어야 할 것들이 있다. 1. Google Play Console의 internal test 준비. (internal test 링크로 다운받은 앱으로 테스트하는것이 좋다.) 다음 링크를 참고하여 Google Play Game Services에 내부테스트까지 등록하자. algorfati.tistory.com/90 Google Play Console Google Play에 앱을 출시하기 위해서는 Google Play Console을 이용하여야 ..

서비스 운영

[Google Play] 구글 플레이에 앱 출시하기 (Google Play Console)

Google Play Console Google Play에 앱을 출시하기 위해서는 Google Play Console을 이용하여야 한다. 다음 링크를 통해 Google Play Console 페이지로 이동한다. play.google.com/console/developers/?pli=1 Google Play Console | Google Play Console Google Play Console 방문 페이지 play.google.com 로그인하기 위해서는 Google Play Console을 이용하기 위해서는 개발자 계정이 필요하다. 만약 계정이 없다면 다음 링크를 통해 개발자 계정을 먼저 생성하자. (25달러를 지불하면 평생 이용가능한 개발자 계정을 만들 수 있다.) wp.swing2app.co.kr/k..

서비스 운영

[Google Play] 구글 플레이에 게임 앱 출시하기 (Google Play Game Services)

Google Play Game Services Google Play에 게임 앱을 출시하기 위해서는 일반적인 앱 출시를 위한 세팅 외에도 추가적인 작업들을 해주어야 한다. 먼저 Google Play Console 세팅이 선행되어야 한다. 작업이 이미 완료되었다면 건너뛰면 된다. https://algorfati.tistory.com/90 Google Play Console Google Play에 앱을 출시하기 위해서는 Google Play Console을 이용하여야 한다. Google Play Console 페이지 링크 play.google.com/console/developers/?pli=1 Google Play Console | Google Play Console Google.. algorfati.tis..

게임 엔진/Unreal

[Unreal] 언리얼 안드로이드 프로젝트 Google Play에 출시하기

언리얼로 안드로이드 프로젝트를 만들 수 있도록 환경세팅을 하고, 프로젝트를 패키징하고, Google Play Game Service에 출시가 가능하도록 세팅하는 방법에 대한 내용이다. 안드로이드 스튜디오 먼저 Android Studio를 설치하고 Android SDK를 연동하여, 언리얼에서 안드로이드 작업이 가능하도록 한다. docs.unrealengine.com/en-US/SharingAndReleasing/Mobile/Android/Setup/AndroidStudio/index.html Setting Up Android SDK and NDK for Unreal How to set up your Android development environment for Unreal 4.25 and later do..

게임 엔진/Unreal

[Unreal] 언리얼 Tick 시스템

Tick Tick이란 코드나 블루프린트 스크립트를 프레임과 같은 일정한 주기로 실행시키는 것을 의미한다. 게임의 Actor, Component들이 Tick을 수행하는 상대적인 순서를 이해하는 것은 게임 실행 방식의 일관성을 보장하고, 또 엔진에서 따로 수행되는 작업과의 Tick이 어긋나며 생기는 문제를 피할 수 있다. Actor와 Component는 설정된 최소 시간 간격으로 프레임 Tick을 설정할 수도 있고, Tick을 전혀 하지 않도록 할 수도 있다. 또한 엔진의 프레임 별 업데이트 루프에서 서로 다른 단계에서 Grouping이 가능하며, 특정 Tick이 완료될 때까지 기다리도록 설정도 가능하다. TickFunction 언리얼 엔진에서 Tick을 어떻게 발생시키는지 알아보자. 가장 기본적으로는 FT..

게임 엔진/Unreal

[Unreal] 언리얼 프로젝트 소스코드를 옮기는 방법 (Redirect)

언리얼 엔진을 사용하다 보면 가끔 프로젝트 소스를 다른 프로젝트로 옮겨야 하는 상황이 생긴다. Blueprint나 기본 리소스들의 경우 이주를 통해 쉽게 옮길 수 있다. 하지만 c++ 소스코드의 경우 옮기는 과정이 어렵다. 예를들어 모듈 이름 AAA라는 프로젝트 에서 모듈 이름 BBB라는 프로젝트로 소스코드를 옮겨서 빌드하면, 코드 내 클래스들의 이름은 같지만, 내부적으로는 다음과 같이 저장된다. (옮겨지는 클래스 이름이 MyClass라고 가정) "/Script/AAA.MyClass" -> "/Script/BBB.MyClass" 엔진 내부에서 이름이 같더라도 다른 URL로 클래스를 인식하기 때문에, 이렇게 코드를 옮겨놓은 상태에서 Contents를 옮기게 되면, c++ 소스와 연결고리가 있는 모든 파일들..

게임 엔진/Unreal

[Unreal] 언리얼 메모리 관리 시스템 (Smart Pointer, GC)

언리얼 메모리 관리 시스템 스마트 포인터와 가비지 컬렉터는 메모리 관리를 위한 개념들로 프로그래밍 영역에서 굉장히 일반적으로 통용되는 개념이다. 언리얼은 스마트 포인터와 가비지 컬렉터(GC)를 모두 사용하여 메모리를 관리하는데, 두 개념 모두 c++로 자체 제작한 코드를 이용한다. 순수 c++을 이용하는 상황에서는 스마트 포인터들을 사용하고, UObject와 관련된 부분에서는 GC를 사용한다. Smart Pointer 1. TUniquePtr 메모리의 유일한 소유권을 넘겨주고, 해제를 자동화한 개념. (c++ stl의 unique_ptr과 대응된다.) 일반적인 포인터와 달리 객체가 파괴될 때 소유한 메모리도 해제한다. 아래 예제를 보자. 해당 코드대로 실행 시 메모리는 해제되지 않고 남아있게 된다. 이러..

게임 엔진/Unreal

[Unreal] 언리얼 엔진 디버깅

Editor Debug Symbol 엔진 코드를 디버깅해야하는 상황이 생길 수 있다. 에픽게임즈 라이브러리에서 Editor Debug Symbol을 설치하면 엔진 코드 디버깅이 가능하다. 추가로, 코드 최적화로 인해 중단점을 놓지 못하거나, 콜스택이 생략되는 문제가 있는데, 이 경우 Visual Studio의 Editor configuration을 DebugGame Editor로 설정하면 된다. 에픽 게임즈 런처 디버깅을 위한 편집기 기호 설치 Full Build Unreal Engine 다른 방법으로 언리얼 엔진을 풀빌드하는 방법도 있다. 다음 링크를 통해 언리얼 엔진을 클론하고, 디버깅 심볼도 포함되도록 풀빌드하면 엔진 코드를 디버깅할 수 있다. 또한, 이 방법을 이용한다면 엔진코드 자체를 수정할수도..

AlgorFati
'분류 전체보기' 카테고리의 글 목록 (3 Page)