0. 개요
오늘은 github에 대해서 배웠다.
이전에 DirectX11로 젤다의 전설 : 야생의 숨결을 모작했을 때에도 팀으로 진행하면서 git을 사용해 프로젝트를 관리했었다.
하지만 그때는 git에 대해 잘 모르고, 단순히 크라켄을 이용해 Branch를 만들어 작업하고 작업이 끝나면 다시 Marge해 오류가 있는지 체크하면서 진행했었다.
때문에 잘못 병합하거나, 분기를 나누었을 때 되돌리는 방법을 몰라 고생했었던 경험이 있다.
또, 다른 분들은 git을 이용해 이전에 공부했던 자료들을 올리고, ReadMe를 작성해 깔끔하게 사용하는 것들을 봤는데, 이제 그런 것들도 공부해서 앞으로 git을 적극 사용해야할 것 같다.
특강에서는 어떻게 협업을 진행하는지 명령어가 어떤 것들이 있는지 등을 배울 수 있었다.
1. Git
Git이란?
버전 관리 시스템으로 소스 코드 변경 사항을 추적하고 협업을 원활하게 도와준다.
○ 분산형 버전 관리 시스템
○ 로컬 저장소와 원격 저장소로 나뉨
○ 변경 이력 관리 (버전 히스토리)
GitHub란?
GitHub는 Git 저장소를 관리할 수 있는 클라우드 기반 플랫폼이다.
○ 협업 도구로 Pull Request, Issue Tracker, Actions 등이 있다.
○ 오픈소스 프로젝트를 위한 주요 허브
git으로 협업하는 방법
독립적으로 작업을 진행할 수 있는 가상의 '경로', '공간'인 브랜치를 이용해 진행한다.
협업 플로우는 다음과 같이 진행된다.
1. 원격 저장소를 클론한다.
2. 새로운 브랜치에서 작업한다.
3. 변경 사항을 커밋한다.
4. 원격 저장소로 푸시한다.
5. Pull Request를 생성한다.
6. 코드 리뷰 후 병합을 진행한다.
주요 명령어
git init : 로컬 저장소 생성
git add <파일명> : 변경 내용을 스테이징 영역에 추가
git commit -m "커밋 메세지" : 변경 내용을 저장소에 기록
git push origin main : 로컬 변경 사항을 원격 저장소에 업로드
git pull : 원격 저장소의 변경 사항을 로컬로 가져오기
git clone <저장소 URL> : 원격 저장소 복제
git branch <브랜치명> <분기 대상 브랜치명> : 분기 대상에서 분기를 만들어 브랜치명대로 브랜치를 생성해준다.
git branch -D <브랜치명> : 브랜치 삭제
git branch -m <브랜치명> <새로운 브랜치명> : 브랜치 이름 바꾸기
git checkout <브랜치명> : 해당 브랜치로 이동하는 명령어
Unreal Engine의 협업 도구
Git 이외에도 Perforce, Plastic SCM, SVN 같은 도구들이 있다.
그 중 Perforce는 대규모 파일 관리에 적합하고, Unreal이 공식으로 권장하는 도구이다.
Plastic SCM은 분산형 및 중앙 집중형을 모두 지원하며, GUI가 직관적이다.
Git으로 Unreal 프로젝트를 진행하면 어려운점.
1. 대용량 파일 처리가 비효율적이다.
2. 브랜치 충돌 문제가 발생할 가능성이 있다.
3. 저장소 크기 증가로 속도가 저하된다.
2. 과제
과제를 진행하면서 잊고 있었던 것들이나, 새로 알게된 것들만 기록할 것이다.
생성자 소멸자 호출 순서
생성자 : 부모 -> 자식 순으로 호출된다.
ㄴ> 이유는 파생 클래스 객체를 생성할 때, 먼저 기초 클래스의 객체를 생성한다.
소멸자 : 자식 -> 부모 순으로 호출된다.
!! 주의할 점 !!
CMonster* p_monster = new Skeleton;
위 처럼 부모 클래스 타입 포인터 변수에 자식 클래스 객체를 받아왔을 때, delete p_monster를 하게되면, 프로그램은 CMonster의 소멸자만 호출한다.
띠리서 소멸자도 가상 소멸자를 갖도록 만들어주어야 예상치 못한 메모리 누수를 방지할 수 있다.
가상 소멸자로 만들면, 가상 함수 테이블을 통해 올바른 함수 호출을 할 수 있기 때문이다.
오늘도.. 이걸 잊고있어서 TIL을 작성하다가 ?!!!!!!!!!!!! 싶었다. ㅋㅋㅋㅋ
[C++] virtual 소멸자
virtual 소멸자 상속 시에 소멸자는 반드시 virtual을 이용하여 가상함수로 만들어야 한다. 평범한 상속 Case #include using namespace std; class Base { public: Base() { cout
wn42.tistory.com
함수 오버로딩 오버라이딩
함수 오버로딩과 오버라이딩
해당 글은 공부를 하면서 적은 글이기 때문에 틀릴 수 있습니다. 참고용으로만 봐주세요~ 1. 오버로딩(Overloading) : 함수 중복 정의 오버로딩은 같은 이름의 함수에 매개 변수를 다르게 사용하여
rozentea.tistory.com
난수
랜덤한 동물을 추가해주기 위해 rand(), srand()가 어느게 문제이고, 그 대신 사용할 수 있는 함수는 어떤 것인지 공부했다.
이전에 포켓몬스터를 모작하면서 rand()와 srand()를 이용해 랜덤 인카운트를 구현했기 때문에 익숙했다.
때문에 rand()와 srand()를 이용해 함수를 먼저 만들고, 다른 방법은 없나 하고 찾아보게 되었다.
C스타일 난수 생성의 문제점
rand()와 srand(), <random>은 모두 마치 난수 처럼 보이는 의사난수를 생성하는 코드이다.
첫 번째 수 만 무작위로 정하고, 나머지 수들은 그 수를 기반으로 여러가지 수학적 방법을 통해서 마치 난수처럼 보이지만 실제로는 무작위로 생성된 것이 아닌 수열들을 만들어내게 된다.
이때, 첫 번째 수를 시드(seed)라고 부르는데, C스타일에서는 프로그램을 실행했던 초를 시드값으로 지정해 많이 사용했다.
이러한 시드값을 기반으로 무작위 처럼 보이는 수열을 생성하게된다.
문제점 1. 시드값이 너무 천천히 변한다.
시드값을 초로 지정했다는 것은 같은 시간대에 시작된 프로그램의 경우 모두 같은 의사 난수 수열을 생성한다는 것이다.
문제점 2. 0부터 99까지 균등하게 난수를 생성하지 않는다.
rand()가 리턴하려는 값이 0부터 RAND_MAX라는 점이다.
물론 rand()가 0부터 RAND_MAX까지의 모든 값들을 같은 확률로 난수를 생성하지만, 모듈러 연산을 통해 우리가 원하는 범위로 만드는 과정에서 각각 수가 나올 확률이 변하게 된다.
문제점 3. rand() 자체도 별로 뛰어나지 않다.
rand() 함수는 선형 합동 생성기(Linear Congruential Generator) 이라는 알고리즘을 바탕으로 구현되어 있는데, 이 알고리즘은 썩 좋은 품질의 난수열을 생성하지 못한다.
더 깊게 설명하자면 생성되는 난수열들의 상관 관계가 높아서 일부 시뮬레이션에 사용하기에 적합하지 않다.
<random>
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dis(0, (int)ANIMAL_TYPE::END);
AddAnimal((ANIMAL_TYPE)dis(gen));
srand()의 시드를 넣어준 것처럼 random_device라는 것을 제공한다.
단순 시간을 시드로 넣어준 것보다 좀 더 양질의 시드값을 얻을 수 있다.
random_device를 이용하면 운영체제 단에서 제공하는 진짜 난수를 사용할 수 있다. 다만 진짜 난수의 경우 컴퓨터가 주변의 환경과 무작위적으로 상호작용하면서 만들어지는 것이기 때문에 의사 난수보다 난수를 생성하는 속도가 매우 느리다는 단점이 있다.
때문에 시드값처럼 난수 엔진을 초기화 하는데 사용하고, 그 이후의 난수열은 난수 엔진으로 생성하는게 적합하다.
만약 위처럼 random_device 대신 임의의 시드값을 넣고 싶으면 원하는 값을 넣어주면 된다.
mt19937 gen(1224)
mt19937은 c++ <random> 라이브러리에서 제공하는 난수 생성 엔진 중 하나로, 메르센 트위스터라는 알고리즘을 사용한다.
=> 기존의 선형 합동 생성기 보다 좀 더 양질의 난수열을 생성한다고 알려져있다.
무엇보다도 생성되는 난수들간의 상관관계가 매우 작기 때문에 여러 시뮬레이션에서 사용이 가능하다.
마지막으로는 uniform_int_distribution<int>를 만들어 수들을 어떤 범위에서 뽑아 낼지 정의해주면 된다.
ㄴ> 균등 분포 ( uniform distribution )
<random> 라이브러리에서는 선형 합동 생성기, 정규 분포 등등 다양한 기능들을 제공하고 있다.
씹어먹는 C++ - <17 - 3. 난수 생성(<random>)과 시간 관련 라이브러리(<chrono>) 소개>
난수를 생성하기 위해서 C 의 srand 와 rand 를 사용하지 말자. 대부분의 상황에서는 std::mt19937 로 충분히 양질의 난수를 뽑아낼 수 있다. 특히 라이브러리를 사용할 경우 원하는 확률 분포에서 샘플
modoocode.com
선형 합동 생성기 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 선형 합동 생성기(Linear congruential generator, LCG)는 널리 알려진 유사난수 생성기이다. 선형 합동 생성기는 다음 재귀 관계로 정의된 순열 X i {\displaystyle X_{i}} 을 반
ko.wikipedia.org
유사난수 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 유사난수(pseudorandom number)는 난수를 흉내내기 위해 알고리즘으로 생성되는 값을 가리킨다. 이때 유사난수를 생성하는 알고리즘을 유사난수 생성기(pseudorandom num
ko.wikipedia.org
3. 후기
앞에서 말했다싶이 git을 이용하는 방법을 배울 수 있어서 좋았다.
물론 생각했던것 처럼 깊은 내용은 아니었고, 직접 사용을 해보면서 익히는게 좋을 것이라고 하셨다.
하지만 이전과 다르게 이번에는 깃에서 막히는 부분이 생기면 도움을 청할 수 있는 곳이 생겼다는게 너무 좋았다.
(물론 질문 전에 충분히 검색해보고 스스로의 힘으로 하려고 엄청 노력하겠지만..)
또, 특강 이후로는 과제를 진행했는데,
이전에 DirectX 프로젝트를 진행하면서 많이 사용해본 덕분인지 오히려 어제했던 과제보다 익숙하고 편했다..
물론 평가 기준에 잘 맞도록 구현한건가?는 잘 모르겠지만..?
ㄴ> 이정도여도 충분하다고 생각한다. 최대한 평가 기준에 맞추려 노력했기에..
과제를 진행하면서 클래스 상속, 순수 가상 함수, 가상 소멸자, 소멸자, 생성자 호출 순서등을 다시 한번 더 복습할 수 있어서 좋았다.
특히 마지막에 TIL을 작성하면서 가상 소멸자 사용을 안한건 너무나도 깜짝놀랐었다.. 왜그랬지.. ㅋㅋㅋ 너무 오랜만에 써서 그런것 같다..
이후에는 가변 배열을 직접 구현하면서, 템플릿, 연산자 오버로드에 대한 복습도 함께 할 수 있어서 좋았다.
ㄴ> 원래는 가볍게 만들려 했는데, 하다보니 욕심이 나서 템플릿으로 구현했다...
대신에 iterator는 아직 굳이 사용하지 않을 것 같아서 구현하지 않았다.
오늘도 알찬 하루를 보낸것 같다..~!
메리 크리스마스~!
Project Titan
ㄴ> 따끈따끈 신작 에셋 및 프로젝트 둘러면 좋을 것 같다.
'프로그래밍 > Unreal 부트캠프' 카테고리의 다른 글
TIL 2024.12.27 기록 (0) | 2024.12.27 |
---|---|
TIL 2024.12.26 기록 (0) | 2024.12.26 |
TIL 2024.12.23 기록 (0) | 2024.12.23 |
TIL 2024.12.20 기록 (0) | 2024.12.20 |
TIL 2024.12.19 기록 (3) | 2024.12.19 |