월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
char 배열 질문있습니다!
우선 선생님의 너무 질 좋은 강의에 시간 가는 줄 모르고 재밌게 배우고 있어서 감사말씀 드리고 싶습니다!배열이름이 해당 배열의 첫번째 인덱스의 주소값이라면 char 배열도 주소값이 나와야 하는게 아닌가요? 왜 int와 다르게 주소값이 아닌 그 주소 안에 있는 Data가 나오는건지 궁금합니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
혹시 _data안에 T()이게 뭔지 알려주실수 있나요?
T() 템플릿뒤에 붙은 ()이게 어떤 기능을 하나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
12분 8초에 스택 유효범위에 대해서 질문있습니다
강의 12분 8초에 esp 레지스터의 주소값을 메모리에 검색해서 볼 때 esp 밑으로는(esp보다 높은 주소) 스택의 유효범위라고 말씀하셨는데 스택의 유효범위라는 것이 OS가 정해놓은 전체 스택범위를 말하는 건가요? 스택은 높은주소에서 낮은 주소로 쌓이는 걸로 알고 있는데 저기 esp 위로의 값들은 어차피 안쓸 값들인데 왜 있는건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
23분 23초에 main함수내에서 크래시가 나는 부분에서 질문있습니다
제가 이해한바로는push 1push 2call MAX 를 하고MAX 함수에서 pop rbp를 하기 전까지를 다음과 같다고 생각했습니다여기서 pop이 막히는데요22분 29초에 설명을 보면 pop을 하게 되면 이전 rbp로 돌아간다고 하셨는데 rsp는 RET을 가르키게 되고 rbp는 이전 bp값을 가르키는 걸로 말씀하셨더라구요 이게 그냥 pop이라는 instruction이 그렇게 하는걸로 이해하면 될까요?그렇다면 pop은 무조건 rbp는 이전 bp값으로 돌아가고 rsp는 RET로 돌아가게 하는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
정렬 함수 질문입니다.
void Sort(int numbers[], int count) { // numbers[0]을 numbers[1] [2] [3] [4] [5]랑 비교 그다음 [1]을 [2] [3] [4] [5] 랑 비교 ..... for (int i = 0; i < count; i++) { for (int j = count - 1; j > i; j--) { if (numbers[i] > numbers[j]) { Swap(numbers[i], numbers[j]); } } cout << " " << numbers[i]; } cout << endl; } 저의 경우 best를 정의하지 않았는데 일단 제대로 작동 했습니다.best가 없다면 나중에 코드를 고쳤을 때 문제 되는 부분이 생기는 건가요?아니면 가독성의 차이만 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터, 배열 관련 질문
이 부분에서 dest[j] = '\0';까지는 dest에 HelloWORLD라는 값이 저장되는데 return dest로 넘어가는 순간 Hello로 바뀌어서 왜 그런지 모르겠습니다.. 그리고 char* StrCat으로 함수를 만들지 말고 void StrCat으로 해도 똑같이 작동하나요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Value(값)으로 리턴하는 함수의 리턴 값을 받을때에 대한 질문드립니다.
안녕하세요, 추석 잘 보내고 계신가요?다름이 아니라, 여쭤볼 것이 있어서,제가 UE4 C++을 코딩하면서여러 습관들이 있는데, 그 중 하나가 제가 거의 포인터가 아닌 참조를 선호하고,Data를 Write가 아닌 Read일때 const 참조로 도배를해버리는데, 심지어 불가피하게 포인터를 사용할 경우예를들어,Human* const human = 객체 주소;이렇게 const 를 중간에 박아서, 어셈블리어를 까볼때참조형이랑 같게 한다든지const Human* const human = 객체 주소;이런식으로 하면 const Human& human = 객체;와 동의어라고 생각하여 const Human* const human;이런식으로 사용합니다. 첫번째 질문 ]함수의 매개변수 / 함수의 반환값을 받을 때데이터가 순전히 Read용도로 사용할 경우그냥 습관적으로 const 자료형& 을 사용합니다.이런 습관이 맞는지에 대해서 여쭤봅니다. 함수 내부에 지역 변수를 리턴하는 값을 const 참조형으로 받는게 좋은지일반적으로 Value로 받는게 좋은지에 대해서 여쭤봅니다. 물론 함수 지역 변수를 리턴하는 것을 그냥 참조로 받으면 해당 줄이 끝나면 리턴을 하는 함수의 CallStack 에서해당 함수 프레임이 pop 되면서 사라지기 때문에 VC가 잡아주어 빨간줄이 나겠지만, 그냥 참조가 아닌 저는const 참조로 받는게 습관입니다. vector<Human> GetHumanVector(){vector<Human> HumanVector = '동적할당 해서 배열 값 세팅 전부하고'return HumanVector; // 지역 변수 동적 배열을 리턴}int main(){const vector<Human>& HumanVec = GetHumanVector(); // 1번째 경우 : 저의 스타일const vector<Human> HumanVec = GetHumanVector(); // 2번째 경우 : 값으로 Receive 하는 것} 1번째 경우와 2번째 경우, 저는 1번째 경우를 사용하는데 2번째 경우로 저렇게 받아버리면 값 복사가 되면서GetHumanVector(); 이 const vector<Human> HumanVec 전달 해줄때 순간적으로 메모리 사용량이 2배가 되지 않을 까 생각이 되어무조건 참조로 받는 것이 옳다라고 생각합니다.만약에 저 배열의 크기가 500MB라고 가정을 해봤을때2번째 경우처럼 값으로 받을 경우 컴파일러가 해당 줄을 실행을하고 값을 전달을 할때 1GB가 메모리가 사용될 것이다.라고 어디서 선생님이었나 책이었나 본 것 같아서메모리 효율적 사용이라는이러한 당위성으로 인해 저는습관적으로 저렇게 사용하는데 혹시 제 기억이 틀린건지적어놓은 공책이 있었는데 없어지고 검색을 해봐도딱히 비슷한 예제가 안올라와서R.V.O 리턴 값 최적화 정도로 함수 리턴할떄 값으로 리턴해도 된다. 이 정도 내용 밖에 없네요1) const vector<Human>& HumanVec = : const 참조로 받는 게 좋을지2) const vector<Human> HumanVec = : const로 받는게 좋을지 선생님의 의견은 어떠신지요 두번째 질문 ]혹시 1)을 사용할때 간헐적으로 버그가날 수 있나요?저는 없다고 보는데 일단 참조는 컴파일 타임에 생성과 동시에 초기화가 되고, 일단 const로 받아서 빌드 돌릴때는 문제가 없는데런타임때 버그가 날 확률이 조금이라도 있을까요???
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
구구단 이중 for 문 쓰기 vs if 문 쓰기
구구단 해설에서 이중 for문을 쓰셨는데저는 이렇게 풀었습니다 int A = 1; int B = 2; for (int i = 0; i < 72; i++) { cout << B << "*" << A << "="<< A*B<< endl; A++; if (A == 10) { B++; A = 1; } } 제가 쓴 것이 A 와 B 변수를 더 써서 혹시나 메모리를 더 쓴다거나 문제가 있을까요?개인적으로 for 문을 두번씩 쓰는게 너무 어렵고 if문을 쓰니깐 이해가 더 잘되는데 for문을 꼭 써야하는 상황이 아니라면 if문을 써도 상관 없는 건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
cout 관련 질문 드립니다
뭔가 비트연산 파트와는 별개의 질문이긴 하지만 비트연산 실습을 연습해보다가 잘 이해가 안가서 질문드립니다unsigned char flag = 0;unsigned defaultState = 1;flag = ((flag || defaultState) << 3);printf("%d\n", flag);위와 같이 C스타일로 출력하면 8로 값이 잘 나오는데cout << flag << endl;이렇게 C++스타일로 찍으면 값이 빈칸으로 아무것도 안나오는 이유가 혹시 뭔지 여쭤봐도 될까요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
어셈블리어 [] 관련...
어셈블리어 연습을 하다가 [변수], [레지스터] 관련 내용이 이해가 잘 안되어서https://stackoverflow.com/questions/39474332/assembly-difference-between-var-and-var에 관련 내용이 있어서 참고를 하였습니다그런데 여기에서 어셈블리어의 [변수] == c에서의 *변수라는내용이 있는데 이게 왜 이런 것인지 이해가 잘 안 됩니다 엄밀히 말하자면 어셈블리어 프로그램으로 계속 실험을 하니[레지스터] == *레지스터인 것은 이해가 되었는데[변수] == (*변수)가 아닌 (변수)가 맞는 것 같아헷갈립니다... p.s. 레지스터에 값을 이동시킬 때 동일한 값이어도 해당값이 주소값인지 변수의 값인지 컴파일러가 알고 스스로 구분하나요?ex) a = 0x30203020 &a = 0x30203020
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
로또에서 srand 질문입니다.
로또만들때 Choose함수 안에 srand(time(0)); 를 넣을시메인에서 Choose함수를 여러번 호출하면 같은값이 나오는데메인에 처음에 srand(time(0));를 넣으면 다른값이 나옵니다! 차이가 뭔지 모르겠어서 질문드립니다.
- 미해결[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 클래스를 벡터보다 아래 선언을 한뒤이렇게 전방선언할 경우 에러가 나는데 원인을 모르겠습니다..