월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
PrintStatInfo(const char* name,const StatInfo& info) 부분 오류
함수 선언 부분에서void PrintStatInfo(const char* name, const StatInfo& info);부분에서 빌드를 하면 "확인 할 수 없는 외부참조 입니다"라는 오류가 뜨면서 되지 않습니다.혹시나 해서 const를 지우고 StatInfo& info만 했을때는 정상적으로 실행이 돼서 const 부분이 문제인거 같은데 어떤 이유로 이런건가요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
스택 관련 어셈블리어에서
스택 관련 어셈블리어에서 mov와 push가 컴파일러에 따라 다르게 나올 뿐 동일한 기능을 하는 것이라면main 함수 스택프레임의 지역변수 a,b에 대한 mov 어셈블리어를 실행했을 때에는 esp에 변화가 없었지만MultiplyBy 함수 스택프레임의 매개변수 a, b에 대한 push 어셈블리어를 실행했을 때에는 esp에 변화가 생겼었는데 왜 그런지 궁금합니다;; 그리고 1개 함수의 스택프레임에는 매개변수 + 반환 주소값 + 이전 함수 ebp + 지역변수가 들어가는 것으로 알고 있습니다그런데 막상 sub esp, ...을 통해서 해당 함수가 사용할 스택프레임의 영역을 정할 때에는 이미 4개 요소 중 3개가 이미 저장된 상태 같은데 왜 이렇게 되는 것인지 모르겠습니다(매개변수와 반환 주소값은 이전 함수에서 세팅을 해준다고 하더라도 일단은 해당 함수의 스택 프레임에 속할 텐데)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
스마트 포인터 질문 23:00
use after free, 댕글링 문제 스마트 포인터를 통해 메모리 오염 막을 수 있는거 알겠습니다.그런데 지금 k2가 {} 지나면 유효하지 않은데k2의 데이터자체는 사용할 수 없을 텐데...굳이 또 k1->Attack()을 호출할 필요가 있는것인가요..??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
중요한건 아니지만...PRINT 관련 질문드립니다
강의에 나온 b데이터 (section .data 에 b times 5 dw 1) 를 모두 출력해보는 연습문제에서 PRINT_HEX 2, [b+ecx]는각각 1 / 100 / 1 / 100 / 1 으로 출력되어서 100이 나오는 이유까지는 이해가 됐는데 PRINT_DEC 2, [b+ecx] 라고 하면각각 1 / 256 / 1 / 256 / 1 이 출력되는데 256이 나오는 이유를 잘 모르겠어서 질문드립니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
전위 연산자 질문
class RefCountBlock{public :int _refCount = 1;};template <typename T>class SharedPtr{public :SharedPtr() { } // 이대로 놔두면 nullptr로 아무것도 안하는 존재가 된다.SharedPtr(T* ptr):_ptr(ptr){if (_ptr != nullptr){_block = new RefCountBlock();cout << "RefCount : " << block->refCount << endl;}}SharedPtr(const SharedPtr& sptr):ptr(sptr.ptr),block(sptr.block){if (_ptr != nullptr){block->++refCount;cout << "RecCout : " << block->refCount << endl;}}void operator = (const SharedPtr& sptr){ptr = sptr.ptr;block = sptr.block;if (_ptr != nullptr){block->++refCount;cout << "RecCout : " << block->refCount << endl;}}~SharedPtr(){if (_ptr != nullptr){block->--refCount;cout << "RefCount : " << block->refCount << endl;if (_block->_refCount == 0){delete _ptr;delete _block;cout << "Delete Data" << endl;}}}public :T* _ptr;RefCountBlock* _block;};지금 이런 상태에서 제가 미미하지만 조금의 성능향상을 위해서(후위연산자 버젼은 어차피 임시객체를 만들어서 반환하고 삭제되기 때문에)block->++refCount값을 이렇게 '전위 연산자'로 증가시켜주었는데, 이게 지금 id_expression이라는 에러가 나더라구요...후위연산자로 해줄 경우에는 에러가없고...그래서 제가 "아 SharedPtr이라는 클래스를 만들고 거기에 해당하는 연산자 오버라이딩을 안해주어서 그랬구나! "라고 생각했다가.. 연산자 오버라이딩 문제는 아닌거같다라고 판단이 들었습니다.전위연산자(++)를 오버라이딩 안해주었다면 후위연산자도 오버라이딩이 안되어 block->refCount++; 도 동작하지 않을 것인데... 라고 생각했습니다.그래서 분명 _refCount는 기본자료형인 int자료형이라 전위, 후위 다 지원을 분명히 하는데 왜_block이라는 포인터를 통해서 접근해서 바로 전위 연산자를 사용할 수 없는 것인가요??_block->(++_refCount) 의 경우에도 같은 에라가 납니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
cout 를 사용해도 한글이 잘 나오는데 wcout를 사용하는 이유가 있나요?
cout << "한글테스트" << endl;로 입력해도 한글이 잘 나오는데wcout.imbue(locale("kor"));wcout << wch << endl;로 하는 이유가 궁금합니다.변수에 한글을 넣어서 사용하려면 저렇게 사용해야 하는건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
안녕하세요! vecotr<pair<int,int>> map
면접을 보다가 면접질문 중 map 과 정렬된 vector<pair<>> 비교하여 설명 하시오 라는 문제가 나왔습니다.답변을 map 는 레드블랙트리기반의 중복이 허용되지않고 key 로 오름차순 정렬되어있으며,안에 데이터는 pair 로 되어있다. vector<pair<>> 연속적인 메모리 구조를 가지고 있으며 랜덤엑세스가 가능하며, sort 시 pair<> 의 first 값의로 기본 정렬한다. 라고 답변을 했습니다.답변을 들으시더니 면접관님께서 "정렬된" 이라는 키워드를 중점으로 다시 생각해보라고 하셨는데 답변을 못했습니다.어떤의도로 문제를 내신지 알 수 있을까요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
추후 강의 일정 관련 문의
안녕하십니까 선생님입문자를 위한 UE5 강의를 최근에 올리시면서강의소개에 게임프로그래머 취업의 정석 시리즈도 연재를 준비하신다고 하셨는데혹시 게임프로그래머 취업 시리즈의 1편이 대략 언제쯤 나올지 말씀해주실 수 있을까요?유동적이시겠지만 공부 및 수강 계획 짜는데 도움이 되어 대략이라도 알려주시면 감사하겠습니다 꾸벅
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
29분 30초 typedef 질문
29분 30초에서 typedef Iterator<T> iterator로 타입을 재정의 해주셨는데현재 코드에서는 Iterator 클래스가 Vector클래스보다 위에 있기 때문에클래스 '전방 선언'은 하지 않으신거고template <typename T>의 모든 T에 대한 재정의를 iterator로 한다는 의미로 typedef Iterator<T> iterator 로 해주신간가요?만약 template <typename T> class Iterator {};가 template <typename T> class Vector {};보다 선언위치가 밑에 있었다면typedef부분을class Iterator;라고 먼저 '전방 선언'해준다음에typedef Iterator<T> iterator;로 해주어야 하나요?현재 Iterator 클래스를 벡터보다 아래 선언을 한뒤이렇게 전방선언할 경우 에러가 나는데 원인을 모르겠습니다..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
static 멤버 변수 질문
현재 초기화 한 정적, 전역 변수는 Data영역에 올라가고초기화 하지 않은 정적, 전역 변수는 Bss영역에 올라간다고하는것 까지는 이해가 되었습니다.그런데 클래스안의 정적 멤버 변수의 경우class Knight{private:static int _test;};int Knight::_test = 0;이렇게 클래스 밖에서 초기화를 해주어야 링크 오류가 안나는거 같더라구요 구글리을 해보아도 그냥 밖에다 선언해라 그래야 링크 오류가 안난다고 하는데저는 궁금한게 C++11문법을 사용해도 클래스 내부에서 초기화가 불가능 하더라구요이거는 당연히 '정적'이기 때문에 접근만 Knight를 통해서 가능한 것이지 데이터는 실제로 데이터영역에 올라가 있기 때문, 또한 클래스에 딱하나만 존재를 하는 것이라 이해를 해서 (객체를 또 여러개 생성할 수 있는데 그때마다 초기화가 되면안되니까 등등의 이유로) 클래스 내부에서는 초기화를 하면 안되는 것은 이해 하였습니다.그런데 정적 멤버 변수의 경우 초기화를 안하면 BSS에 올라가고초기화를 해주면 DATA영역에 올라가야 하는것 아닌가요?왜 클래스 외부에서 초기화를 해주지 않으면 링크 오류가 뜨나요..??(구글링 해보아도 그냥 클래스 객체 전부가 공유하니까 초기화를 해주어야 한다. 이정도 인거같아서 뭔가 답답한 부분이 있는거 같습니다..ㅠ)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
임시 객체 질문
swap함수를 설명하시면서 임시벡터라는 말이 나왔는데 임시 벡터라는 말이 class Knight{public: Knight() { cout << "Knight()" << endl; }public: int _a = 10;}; int main(){ Knight k1; // 스택에 생성 int value = Knight()._a; // 임시 객체? return 0;} 이런 클래스가 있을 경우 main함수안에서 Knight k1; 해주면 Knight의 객체가 스택에 생성된 것이고 다시 main함수 내에서 int value = Knight()._a; 를 해준다는 말이 객체라는 것이 어떤 클래스와 같은 '설계도'의 오브젝트)객체)인데 이 객체를 만들면 설계도의 '생성자' 함수가 호출이 된다. 질문1. 생성자 함수를 호출을 어떻게든 한다면은 '객체'를 만들 수 있다는 말인가요? 이말이 맞다면 public:을 열러있는 Knight의 생성자를 강제?로 호출하여 객체를 만드는데 그 객체의 멤버 변수인 _a를 value에 대입해준다. 근데 Knight() 생성자만 호출하고 다른 객체 변수에(Knight타입의 변수) 할당하지 않아서 사용되지 않는 메모리라 컴파일러가 알아서 소멸자를 호출 시키기 때문에 '임시객체'라고 하는 것인가요? 강의에서는 그냥 벡터이기때문에 임시 벡터라고 한간가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
비트연산 시 unsigned...
부호를 없애야 >>를 해도 부호비트가 따라오지 않는다고 하셨는데 부호가 있는 경우(ex - 1100 0010)에 >>1을 실헝해본 결과 2로 나누어지는 것에 큰 이상은 없는 것 같았습니다...다른 이유가 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
functor질문 T질문
template <typename T> Item* FindItem(Item items[], itemCount, T selector) 이렇게 FindItem 의 시그니처가 구성이 되어있는데 T라는게 현재 어떠한 타입이든 올 수 있는 상황인데 Functor가 아니라 그냥 클래스를 만들어 놓고 저기다가 넣어주거나(operator ()를 오버로딩 하지 않은 클래스라던가) 그냥 일반 변수를 넣어주어도 일단은 통과가 되지 않나요?(컴파일 단계에서 에러가 나겠지만) (이런식으로) 그래서 궁금한게 C#에서는 제네렉 타입에 조건을 where로 걸어 줄수 있는데 현재 C#처럼 FindItem의 T타입을 class라고 c#처럼 where을 걸어 줄수는 없나요? ex) 신입이 왔는데 사진처럼 FindItem 마지막 인자에다가 기본 자료형 변수를 넣는 경우를 대비해서...
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
텍스트RPG #3 31:48 질문
EnterBattle(playerInfo, &monsterInfo[index]); 부분에 monsterInfo[index]는 배열이기 때문에 &는 없더라도 포인터와 상호적으로 주고받을 수 있기 때문에 오류가 안나야 된다고 생각하는데, 왜 오류가 발생하는지 모르겠스빈다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
nullptr 관련 질문
시드값을 정할 때, srand((unsigned) time(nullptr));라고 하였는데, 0 대신 nullptr을 쓴 이유가 있을까요? nullptr은 포인터와 함께 쓰여져야 하는 것 아닌가요???
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
8번 질문
당연히 보고 라이프 사이클이 생각나기는 했습니다. 그런데 스위치문을 빠져나와 delete p를 하면서 Archer의 소멸자 부분에서 스택에 잡혀있는 pet을 delete할려고하여 크래쉬가 나는 것인가요? (유효하지 않은 스텍 메모리를 delete할려고하여 생기는 문제인가요?) 아니면 delete라는 키워드는 힙메모리만 해제를 하는 키워드 이기 때문에 _pet이 가르키고있는 곳을 힙인지 아닌지 구별하고 힙이 아니라면 바로 크래쉬를 내는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
정렬 함수 만들기 관련 질문
정렬 함수 만드는 과정에서 Swap부분을 이용하는 대신 저는 참조를 사용하여 변형하고 싶었습니다. 보이는 사진처럼 진행하였으나 올바른 값이 나오지 않는데 왜 그런지 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
dynamic_cast 질문 18분
dynamic_cast가 상속관계에서 무조건 장점만 있는게 아니라고 하시면서 설명을 해주셨는데 타입변환 3 : 포인터에서 원래는 C스타일로 형변환 해주었다면 ItemType에 따라서 static_cast를 해주면 dynamic_cast를 사용하는 것보다 빠르다고 하셨는데 가삼함수 테이블 주소를 찾아서 그 주소에 맞게 형변환을 하는 것보다 사진처럼 if문과같은 코드들이 있는데 이러한 코드들을 거쳐서 static_cast을 하는것이 dynamic_cast보다 동작 방식이 더 빠른 것인가요? 왜 type따라서 미리 분류하여 static_cast를 하는것이 더 빠른가요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
17:50 포인터 배열 질문
int arr[3] = {}; 이것은 정수형 배열이라 전체 크기는 12바이트 이고 0번째 주소값을 4바이트로 크기를 할당한 것. int* arr2[3] = {}; 이것은 포인터 배열(정수형) 이고 0번째 주소부터 접근을 하면 그곳에는 정수형으로 해석할 주소값이 들어가있다라는 의미.(어떠한 정수형 데이터의 주소값이 있을 것.) 이렇듯 배열도 배열의 자료형 == 타입(크기)과 들어올 데이터의 자료형 == 타입(크기)이 일치 해야 하는데 이해가 안가는 부분이 현재 - Itme 클래스 크기sizeof(Item) = _itemType(4), _ ItemDbid(4), _dummy(4096) => 4104Byte - Weapon 클래스 크기sizeof(Weapon) = sizeof(Item) + _damage(4) => 4108Byte - Armor 클래스 크기sizeof(Weapon) = sizeof(Item) + _defense(4) => 4108Byte 이상태에서 rand값에 따라 switch 분기를 하여 1이 나왔을 경우 Item[0] = new Weapon를 해주게 되는데 이럴경우 아까 포인터 배열과 똑같이 해석을 하면 "0번째 주소부터 접근을 하면 그곳에는 Itme으로 해석할 주소값이 들어가있다라는 의미." 파생 클래스의 메모리 구조는 직렬형태라 [Item클래스 시작 주소값] [Weapon클래스 시작 주소값] 형태라 Weapon을 동적할당하여 Item 포인터 배열에 데이터를 넣을 수 있는 것 까지는 이해하였습니다. 그런데 4108바이트 짜리를 4104바이트로 해석을 한다는 의미이니 Item[0]->_damage = 10; 이렇게 값을 접근을 못하는것 아닌가요? (Weapon클래스의 _damage 부분이 짤렷으니) (추가적으로 접근을 한다면은 다른 메모리를 침범할 수 있는 메모리 오염이 발생) 그래서 타입변환 5 강의에서 다시 for 문안에서 nullptr체크를 해준다음에 ItemType에 따라서 (Weapon*)item; 이렇게 형변환하여 Weapon의 멤버 변수에도 접근을 할 수 있게 해준 것인가여요? 아니면 제가 아예 다르게 이해를 하고있는것인지 여쭤보고 싶습니다 :)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Wrong variable or address: "a"오류
안녕하세요 수강 중인 학생입니다. 8분 50초 즈음부터 시작하는 메모리 확인을 하다가 발견한 부분입니다. Address부분을 체크하지 않고 Value값을 확인하면 Wrong variable or address: "a"라는 오류가 뜹니다 체크를 하면 값이 확인이 되긴하는데 왜 저런 오류가 뜨는걸까요?