TIL

[241224 TIL] Git 사용방법, C++ 공부_포인터

yoosorang 2024. 12. 24. 20:09
❗ New Knowledge

▪ 스택 메모리 : 함수가 종료되면 메모리 저절로 회수

▪ 힙 메모리 : 사용자가 직접 관리 new/delete

▪ Dangling Pointer : A 포인터로 메모리 해지시키고 B 메모리로 접근 시 발생하는 에

▪ 포인터 변수가 저장되는 메모리
delete로 해제했을 때는 포인터 변수가 가리키는 데이터가 해제된 것이므로 포인터 변수는 함수 종료시까지 소멸X (다른 데이터 재할당 가능 → 이때 할당되는 메모리는 이전 메모리와 무관한 새로운 메모리 블록)

▪ 스마트 포인터 : 메모리 자동 관리 해주는 포인터

▪ 얕은 복사(주소를 복사)와 깊은 복사(가리키는 내용을 복사)

▪ 함수 오버로딩 : C++은 함수의 이름에 추가로 매개변수를 가지고 판단

▪ 템플릿 : 일반화된 코드를 작성할 수 있는 문법

1️⃣ Git 특강

🔹Git 이론

Git : 소스 관리 툴

Github : 깃 플랫폼(원격 저장소)

branch : 독립적인 작업 공간

 

main 또는 master 브랜치가 기본.(에러가 없고 확인이 끝난 깔끔한 공간)

dev 브랜치가 실질적인 작업공간

 

순서

원격 저장소 로컬 저장소에 클론 -> 새로운 브랜치에서 작업 -> 변경 사항 커밋 -> 원격 저장소로 푸시 -> Pull Request 생성 -> 코드 리뷰 후 병함

//로컬 저장소 생성(처음 원격 저장소에 올리는 사람만 사용하면 됨)
git init

//add: 변경 내용을 스테이징 영역에 추가(임시)
git add <파일명>

//commit: 변경 내용을 (로컬)저장소에 기록(확인)
git commit -m "커밋 메시지"

//push: 로컬 변경 사항을 원격 저장소(main이라는 이름의 브랜치)에 업로드
git push origin main

//pull: 원격 저장소의 변경 사항을 로컬로 가져오기(clone으로 받은 파일이 원격 저장소와 다를 때)
git pull

//clone: 원격 저장소 복제(프로젝트를 처음 받을 때)
git clone <저장소 URL>

//branch: 작업환경을 나눔
git bracnch

//checkout: 다른 작업환경으로 이동
git checkout

//merge: 작업환경을 합침
git merge

 

언리얼 엔진의 협업 도구는?

Perforce(무료_5명 미만 소규모는 공짜)Plastic SCM, SVN(무료) 같은 도구 사용

Git 을 사용할 수 있으나 대용량 파일 처리 비효율 등의 문제로 Git LFS를 추가해야 함(잘 사용하려면 유료)

 

🔹 Git 실습

Dark 모드 설정

1. 레포지토리 클론 

비주얼 스튜디오로 생성한 깃허브 폴더 열면 새로운 폴더(.vs는 개인 세팅) 생기고 깃허브 데스크톱에 업로드 됨

.vs 개인 세팅 폴더 제외하고 깃허브 올릴 때는 .gitignore 파일을 만들어서 폴더 이름을 적어주면 됨

 

2. 커밋하기

Fetch Origin으로 바뀐 게 있는지 확인해야 함

Commit 눌러서 로컬 저장소에 저장함

 

3. 푸시하기

 

4. Full request

 

5. main으로 합치기

 

2️⃣ C++ 개념 강의

🔹스마트 포인터를 활용한 로그분석기 구현

#include <iostream>
#include<memory>
#include <string>

using namespace std;

class Logger {
private: 
	int logCount = 0;

public:
	Logger(){
	}

	void logInfo(string message) { //참조값으로 전달해야 복사가 안 이루어짐
		cout << "[INFO]" << message << endl;
		logCount++;
	}
	void logWarning(string message) {
		cout << "[WARNING]" << message << endl;
		logCount++;
	}
	void logError(string message) {
		cout << "[ERROR]" << message << endl;
		logCount++;
	}


	void showTotalLogs() {
		cout << "Total logs recorded: " << logCount << endl;
	}

	~Logger() {
		cout << "Logger instance destroyed.";
	}
};

int main() {
	unique_ptr<Logger> logger = make_unique<Logger>();

	logger->logInfo("System is starting");
	logger->logWarning("Low disk space.");
	logger->logError("Unable to connect to the server.");

	logger->showTotalLogs();

	return 0;
}
💭자아성찰
로그 함수에 message 전달할 때 참조 사용 안 함

🔹 과제

▪️간단한 프로그래밍 구현 미니 과제

💭자아성찰
함수 안에서 함수 사용할 때 해당 함수 위에 사용할 함수가 정의 되어있어야 함(없으면 식별자 에러 뜸)

3️⃣ 추가 공부

🔹 일반 포인터 vs 스마트 포인터

  • 일반 포인터
    1. 성능이 매우 중요한 경우(짧은 생명주기를 가지거나 빈번히 생성/소멸되는 객체)
    2. 객체를 소유하지 않는 경우(소유권이 명확하지 않고 수명 관리가 필요하지 않다면)
    3. 객체의 수명을 명시적으로 관리해야 할 때
    4. Legacy 코드 및 Third-Party 라이브러리
  • 스마트 포인터
    1. 메모리 관리 자동화
    2. 참조 카운팅
    3. 안전성
    4. 가독성 및 유지보수

🔹  언리얼 스마트 포인터

  • UObject를 관리하는 경우 일반 포인터를,소유권과 수명이 명확한 객체를 관리할 때는 스마트 포인터를 사용하는 것이 일반적
❓소유권과 수명이 명확한 객체
  1. 일회성으로 사용되는 객체
  2. 특정 시스템에 완전히 소속된 객체
  3. 자식 객체
  4. 리소스 관리 객체
  5. 플러그인이나 모듈에서 사용하는 객체
→ 언리얼에서는?
게임 플레이 컴포넌트, UI위젯, 파티클 효과, 수명 제한이 있는 타이머 객체