개발 161

C++ 기초 - 포션 공방 만들기 과제

4번 과제 구현하며 정리한 점을 적는다. map에 원소 넣는 방법 3가지 std::map m;// [] 연산자 - 키가 없으면 추가, 있으면 덮어쓰기m["sword"] = 100;m["sword"] = 999; // 덮어씀// insert - 키가 이미 있으면 무시 (덮어쓰기 안 함!)m.insert({"sword", 999}); // sword 이미 있으면 그냥 무시m.insert(std::make_pair("bow", 300)); // 구식 방법// emplace - insert랑 동작 같은데 성능이 더 좋음m.emplace("sword", 999); // sword 이미 있으면 그냥 무시find 함수 쓰는법PotionRecipe searchRecipeByName(std::string name) {..

C++ 기초 - Vector 템플릿 구현하기

인벤토리처럼 Vector 템플릿을 구현하는 언리얼 내일배움캠프 3번 과제를 구현하는 과정에서 알게 된 것을 적는다. 1. 템플릿 클래스는 헤더와 구현 파일로 나눌 수 없다.템플릿은 타입이 정해져야 코드가 생성되기 때문에, 구현을 헤더에 같이 둬야 한다.2. const int&은 상수, 변수 둘 다 받을 수 있는 참조 타입이기 때문에 안전하다.void func(const int& a) { }func(5); // ✅ 리터럴도 OKfunc(x); // ✅ 변수도 OKconst int y = 10;func(y); // ✅ const도 OK복사 없음 + 수정 불가 + 뭐든 받을 수 있음 → 가장 안전하고 효율적! 3. item은 item이라는 기본 클래스를 상속 받아서 구현해보았다.#pragma ..

C++ 기초 - 언리얼 엔진 기본 개념

언리얼 엔진은 기존에 설치해두었으므로, C++을 언리얼에 적용하는 부분을 중점적으로 필기한다. Visual Studio도 2022 버전이 이미 설치되어 있으므로 C++을 사용한 게임 개발 도구만 추가되어있는지 체크한다. Blank(기본)으로 C++ 프로젝트를 생성한다. 언리얼과 비주얼 스튜디오 컴파일러의 충돌 방지를 위해 라이브 코딩 기능은 꺼주는 것이 좋다고 한다. 상단 메뉴의 Tools에서 New C++ Class를 클릭해 생성한다. 액터를 선택하고 Next 이름을 설정하고 Create Class를 진행하면 비주얼 스튜디오가 열린다. 소스 파일은 언리얼을 통해서 만들어야한다. UE_LOG를 추가하고 저장한다. 생성한 코드는 프로젝트 폴더의 C++클래스 폴더 하위에 들어있다. Actor를 레..

C++ 기초 - 스택, 큐

Ctrl+z 를 생각해보자.사용자의 행동을 자료구조로 저장해서 맨 마지막에 수행된 작업을 차례대로 제거해준다. LIFO : 나중에 들어온 것이 먼저 나간다. Stack.vector의 push_back(), pop_back()은 대표적인 LIFO다.C++에는 stack이라는 자료구조가 따로 있다. vector는 동적 배열이지만 stack은 stack으로만 쓰려는 의도를 명확하게 하려고 사용된다.push() : 맨 위에 값 추가pop() : 맨 위의 값을 제거하고 값은 반환하지 않음top() : 제거 안 하고 맨 위의 값만 반환 중간 값에 접근할 수 없다.FIFO : 먼저 들어온 것이 먼저 나간다.Queuepush() : 맨 뒤에 값 추가pop() : 맨 앞의 값 제거deque를 사용하기 때문에 O(1)f..

C++ 메모 - 은/는, 이/가 자동 처리

한글은 유니코드 구조 덕분에 코드로 받침 여부를 쉽게 판단할 수 있습니다.핵심 원리:한글 = 0xAC00 + (초성 * 21 * 28) + (중성 * 28) + 종성 그래서(글자 - 0xAC00) % 28 이 값이0이면 받침 없음0이 아니면 받침 있음C++ 코드 예제 (을/를)#include #include using namespace std;bool hasFinalConsonant(const string& word){unsigned int lastChar = word.back();if (lastChar >= 0xAC00 && lastChar 출력 예:사과를 먹었다 밥을 먹었다 이/가도 같은 방식 string getIGa(const string& word){if (hasFinalConsonant(word..

C++ 기초 - 디자인 패턴(싱글톤, 데코레이터, 옵저버)

생성 패턴객체 생성하는데 제한을 두고 싶을때 사용하는 패턴.예) 싱글톤 구조 패턴객체들의 구조를 구성하는 패턴예) 데코레이터 행동 패턴객체의 상태가 변화할 때 이 상태를 어떻게 전달할지에 대한 패턴.예) 옵저버 싱글톤비행기 게임을 만든다고 하자. 게임 내 비행기는 오직 하나만 존재한다. 비행기의 초기 위치는 (0, 0) 좌표이다.비행기는 move(int deltaX, int deltaY) 메서드를 통해 이동하고, 위치를 업데이트 한다.현재 비행기 좌표를 확인할 수 있는 getPosition()을 제공한다.비행기가 하나만 존재하도록 구현한다.생성 및 대입은 private으로, getInstance()를 통해서만 인스턴스를 받는다. #include using namespace std;class Airpla..

C++ 기초 - 객체지향 설계

응집도 : 클래스 내 모듈들이 얼마나 관련있는지를 나타냄클래스 하나에 모든 기능을 집어넣지 말고, 관련 없는 기능은 적절히 분산해주어야한다.응집도가 높을 수록 좋은 설계.예를 들어, 메시지를 처리하는 기능, 계산 기능, 문자열 수정 기능이 필요하다면, 한 클래스에 이를 다 구현하지 말고 각 기능을 하는 클래스를 각각 생성한다. transform함수 : 컨테이너의 원소들을 변환해서 다른 값으로 변환해주는 algorithm 함수transform(시작, 끝, 결과시작, 함수); 결합도 : 각 모듈들이 서로 얼마나 의존하는지 나타냄결합도가 낮은 것이 좋은 코드.결합도가 높으면 하나의 모듈이 변경될 때 다른 모듈까지 영향을 미침.결합도를 낮추려면, 자바의 의존성 주입처럼 다형성을 활용하여 기본 클래스에 파생 클..

배경 에셋 관리 일지

문제: 다운받은 배경 에셋에 자꾸 Preview라는 글자가 보여서 왜 이런가 했더니, 조명 빌드가 필요해서 생긴 문제였다. 언리얼에서 Static / Stationary Light를 사용할 때는 Lightmass가 라이트맵을 계산해서 베이크해야 한다..빌드 전 상태에서는 "이 조명은 아직 계산 안됨" 이라는 의미로 Preview 워터마크가 표시된다. Build Lighting Only 해주니 사라졌다.

C++ 헷갈리는 개념 정리

iterator 헷갈리는 부분- const_iterator it 이라고 선언하면 *it의 값, 즉 내용물만 못 바꾸는 것이지 it++은 가능하다.- iterator 연산이 불가능하게 하려면 const const_iterator it 또는 const iterator를 사용한다.- const auto it = v.begin(); 처럼 쓰면 it++ 불가능한 반복자가 지정된다.- 내용물이 안 바꿔지게 하려면 auto it = v.cbegin()을 써야한다. crbegin()도 있다.- cend()도 있다. 보통 end()만 써도 되지만, 읽기전용임을 명시하는 cend()가 더 명확하고 안전하다. 반복문에서 복사와 참조auto (복사)for (auto x : v) 매 반복마다vector 원소 → 새 변수 복사..

C++ 기초 오답노트 / 기능 정리

1. int, float, double, bool 중 자바와 크기가 다를 수 있는 타입은?정답은 int 야! 🔴자바는 int가 항상 4바이트로 고정이야. JVM이 보장해줘.근데 C++은 int 크기가 플랫폼/컴파일러마다 달라질 수 있어.// 32비트 시스템 → int = 4바이트// 64비트 시스템 → int = 4 or 8바이트 (컴파일러마다 다름)// 확인하는 법std::cout 자바 개발자가 C++ 처음 쓸 때 자주 빠지는 함정이야. 크기를 보장받고 싶으면 int32_t, int64_t 같은 고정 크기 타입을 써. 언리얼도 이 이유 때문에 int32, uint8 같은 자체 타입을 써. 9. C++에서 bool 타입의 출력값은?std::cout std::cout true; // 1 std:..