월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
맥북 사용자는 SASM을 다운로드하지 못하는데 혹시
NASM을 다운로드 해서 어떻게 설정하는지 알려주실 수 있나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
main 함수의 스택영역 세팅은 누가 해주나요?
함수가 호출될 때 그 함수의 [매개변수]와 [RET]를 이전 함수가 세팅해준다고 한다면, 가장 최초로 실행되는 함수인 main 함수의 [매개변수]와 [RET]는 누가 해주는 것인지 궁금합니다. main 함수의 이전 함수를 도대체 뭐라고 생각해야 할까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
완강했습니다!
짧은기간에 연달아 질문을 남겼는데도 일일히 다 답해주셔서 감사합니다! 사실 중간중간 질문글을 장문으로 쓰다가 지운것도 꽤 됩니다 ... 그래도 이 강의 덕분에 어디가서 C++을 모른다고는 안 할수 있을정도는 된것 같아요! 이제 오늘부터 2강 수학, dx12와 서버쪽강의를 같이 시작하려고합니다! 강의를 들으면서 강의 내용을 기반으로 저만의 게임을 만들어보려고합니다! 언리얼과 자체 서버를요! 글이 질문부분에 있는지라... 서버를 window/linux 관계없이 돌아가는 프로젝트를 만든다면 cmake프로젝트로 만들면 될련지요? 아직 자세히는 모르지만 운영체제에 종속되지 않은 C++자체의 기능? 으로 만들어가면 되지 않을까 어렴풋이 생각하고 있습니다. 아마 그부분으로 넘어가면 전보다 훨씬 질문이 많아질지도 모릅니다. 아무쪼록.. 다시한번 잘 부탁드립니다. 이렇게 좋은강의를 만들어주셔서 다시한번 감사드리고 새해 복 많이받으세요!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
제가 이해한부분이 맞는지 궁금합니다 오른값, 최적화
프로그래밍을 할때는 안전하게 할 수 밖에없는데 안전을 위해 인수로 받은 값을 함부러 할수가 없었죠. 예를들어 들어온 인수를 멋대로 nullptr로 바꿨다가 밖에서 접근하려 하면 크래시가 날테니 말이죠. 그 인수가 오른값인지 아닌지 판별할 방법이 없었으니까요 . 그래서 c++11이전에는 항상 깊은복사로 사용해 오던 많은 함수들이 넘겨받은 인자가 오른값의 경우에는 깊은복사로 동작할 필요가 없어지고 단순히 포인터만 넘겨받는식의 얕은복사로 작동하게 만들 수 있게 되면서 속도가 빨라질 수 있어졌다. 프로그래밍할때 '만약'을 위해 희생된 속도를 다시 올려줄 수 있게 됐다. 또 오른값이라는 개념으로 인해 template이나 auto같이 형식을 연역하는 부분에 있어 오른값이라는 새롭게 구분해야하는게 생겼는데 이걸 오른값전용 rvalue_template같은식으로 따로 만들지 않고 조건에 따라서는 한번에 만들 수 있게 해주고 들어온 값이 오른값인지를 std::forward() 의 반환값으로 오른값/왼값을 반환해서 판별할 수 있게 해줬다. 여기서 오른값인지 왼값인지 전달해 주는게 전달참조 라고 이해했는데 혹시 잘못된 부분이 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
이중포인터로 해결 불가능하다 하셨는데
처음에는 고민하다가 공격대상을 공격하기 직전에 대상을 확인하고 공격하는으로 해결했습니다만 (delete 코드 이후에 포인터를 받아서 썻습니다) 나중에 코드 추가등으로 인해 지금은 직전에 대상을 확인한다고 해도 그 사이에 대상 객체가 delete될수도 있겠다 싶어서 좀더 범용적인 해결방법을 위해 이중포인터로 해결을 했습니다. 전체 코드가 너무 긴 듯해 기본적으로 _target을 Player**로 들고있고 _target을 사용하는부분을 모두 (*_target)으로 수정했습니다. *Exercise_A.cpp Arrow 생성되는 구문 Arrow* arrow = new Arrow(reinterpret_cast<Player**>(&knight), archer->_attack); 이 방법이 조금 더 범용적이라 생각했던 이유는 delete를 했을때 자신이 가지고있는 포인터는 nullptr로 바꿀 수 있으나 이걸 복사해 간 다른 포인터 변수들은 초기화 되지 않기 해당 포인터 자체를 가르키는 이중포인터로 해결하면 된다 생각했습니다. 이때 포인터를 하나를 두고 해당 포인터를 참조하려고하는 모든 이중포인터는 해당 포인터를 가리키게 한 뒤 nullptr체크를 한다면 해결 가능하다 생각했는데 혹시 어떠한 경우에 문제가 발생하게 되는지 궁금합니다. 만약 이중포인터로 해결이 불가능하다면 결국 어떤 객체의 포인터는 해당 객체를 delete하는곳에서만 관리를 하고 다른곳에서는 포인터를 가져가는게 아니라 해당 객체를 관리하는곳에 말씀하시느 ID등을 이용해서 객체 접근을 시도하는것이 안전한 방법이다 라고 생각했습니다! 이 부분도 혹시 틀린부분이 있으면 지적해주시면 감사하겠습니다. 앗 추가로 이걸 고치면서 static_cast는 이중포인터는 허락 안해준다는걸 알게됬네요!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
문제 4번 질문입니다.
문제는 금방찾았는데 어떻게 고쳐야할지가 고민이더라고요. 오버플로우 문제인데 체력이 회복하는 포션이 생겼는데 최대체력을 만들어도 되는지, 한번 회복량에 제한은 있는지 확실하지 않아 일단 _hp를 __int64로 바꿨습니다. 생각하보면 코드가 문제라기보다는 과도한 테스트가 문제인거 같아보이는데요. 만약 실제 현업에서 너무 오버한 테스트로인한 오버플로우라면 코드를 고치기보다는 해당 테스트를 수정하는편인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
강의에서 어시스트 기능 질문있습니다.
14:45 쯤에 (*_target2).에서 _hp를 자동완성시켜주는데 당시 Player.h, Player,cpp 둘 다 해당 타겟인 몬스터 클래스에 대한 정보는 하나도 없는데 어떻게 몬스터 클래스 내부에 _hp가 있는지 알고 자동완성을 시켜주는지요? 이 부분말고도 그런상황이 자주 나오더군요 선생님께서 visual assist를 사용하고있다는건 초반 강의 질문중에 본것같은데 이녀석의 기능인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
캐스팅 이해
c스타일의 캐스팅은 reinterpret_cast이고 많은 형 변환중에 좀더 안전하게 쓸 수 있게 기능을 제한하고 사용자의 의도를 알수 있게 추가된?것이 const_cast와 static_cast이며 마지막으로 가상함수테이블을 이용해서 추가적인 기능으로 더욱 안전하지만 속도에 손해가 있는 dinamic_cast이다 라고 이해했는데요 혹시 틀린부분이 있나요? 물론 각각의 설명을 하자면 const_cast 상수를 뗴거나 붙여주는역할 static_cast 논리적으로 생각했을때 말이되는경우 사용가능, 단 안전은 보장해주지 않음. dinamic_cast 가상함수테이블을 이용해 실제로 형변환이 가능한지 안전까지 보장해주지만 느림. reinterpret_cast는 그냥 뭐든 변환해줌
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
실행 파일에 새겨진 메모리 주소에 대해 여쭤보고싶어요!
안녕하세요. 강사님. 다름이 아니라 어셈블리어 파트 실습을 저는 우분투에서 나름의 방법으로 수행을 하고 있습니다. gdb로 실행파일을 디버깅할 때 왼쪽편에 보면 0x00000000 과 같이 주소가 기재되어 있는데 해당 주소는 실행파일이 로드되어지는 가상 주소를 의미하는것인지요 ?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
초기화 리스트 사용에 대해서
초기화 리스트를 사용할경우에 클래스 내부 클래스의 원하는 생성자를 호출 할 수 있는 차이가 있고 클래스 내부에있는 멤버 클래스? 가 기본 생성자가 없을경우에 반드시 초기화리스트를 사용해야 하는거군요. 또 생각해보면 기본생성자가 있다고 하더라도 초기화 리스트를 사용하지 않고 생성자 내부에서 _inventory = Inventory(20); 와 같은식으로 사용할때 결국 복사생성자로 복사가 될텐데 이전 강의에서 말씀하신것처럼 Inventory 클래스의 복사 생성자게 제대로 만들어져 있지 않으면 멤버 변수들 중에 간단히 복사가 안되는것들로 인한 문제가 생길수 도 있겠네요! 그리고 말씀하신 C++11 문법에 추가된 부분은 이 초기화리스트의 다른 표현방식 혹은 문법이라고 이해하면 될까요? 마지막으로 구태여 생성자에서 초기화 하는것과 초기화리스트에서 초기화 하는것에 대해 차이를 둔 점이 예전 전역변수를 초기화 하지않으면 .bss에 위치하고 상대적으로 exe파일 크기를 적게 잡아먹는것처럼 컴파일러 내부에서 최적화하는데 어떤 이점이 있어서 나눈건가요? ----수정이요---- 다음 강의를 듣고 복사 연산자에 대해서 알게되고 다시 생성자 내부에서 초기화 하는 _inventory = Inventory(20); 위와 같은방식으로 했을때 여기서 =는 복사생성자가 아닌 복사 연산자로 작동을 하는군요? 생성자 내부에서 초기화 하려고하는건 결국 멤버내 클래스를 기본생성자로 생성하고(_inventory 생성) 추가로 뒷부분의 생성자로 생성된 임시 객체(Inventory(20))을 복사해서 넣는 식으로 작동하는군요! 그렇다면 클래스 내부의 멤버 클래스(_inventory )를 복사생성자로 생성하고 싶을때는 해당 클래스의 인수로 복사생성자로 만들고싶은 클래스를 받은 뒤 그걸 초기화리스트로 초기화 하는방법이 멤버클래스(_inventory )를 복사생성자로 생성시킬 수 있는 유일한 방법인가요? 이런식으로요 Knight(Inventory& i) : _inventory(i){}
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
중복헤더 방지에 궁금한점이 있습니다.
구지 둘중 하나만 이용하는게 아닌 둘 다 이용하면 안되나요? 둘 다 이용할 경우에는 다른 문제가 있을까요? 둘 다 이용할 경우 코드 자체는 좀더 길어지거나 지져분해 보일 수 있습니다만 버그나서 꼬일수도 있다는점과 최적화가 될수도 있다는점 둘 다 잡을수 있어 보여서요.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
class 내부 함수 선언에 대해서 궁금합니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. class Car { public: void TurnKey() { RunEngine() } void RunEngine(); } 이렇게 RunEngine이 선언되기 전에 TunrKey에서 먼저 사용되는것이 어떻게 가능한지 알고싶습니다! 일반 함수들을 사용할 때는 허용되지 않았던것으로 알고있어서 혼란이 옵니다 항상 강의 잘 듣고 있습니다 감사합니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
const 수식? 질문입니다
const char* p; 의경우 *p의 변경이 불가능한거고 const char** pp; 의 경우에는 **pp의 변경이 불가능한거죵 이때 *pp를 변경 못하게하려면 const수식 위치가 const char* const* pp 가 되어야하니 어떻게 보면 좀더 일반화 된 const의 위치는 char const* const* pp 처럼 * 바로 앞이 규칙적으로 보이는데.. 통상적으로는 TYPE앞쪽에 쓰이나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
굳이 locale을 설정해야 하는 이유가 있나요?
유니코드 관련해 질문이 있습니다! UTF16 방식이 2바이트에 각종 문자를 할당하는 것이라면, 한글에도 문자 하나하나에 2바이트 크기의 어떤 고유한 데이터가 할당되어 있는 것이라고 이해했습니다. 그런데 이러면 굳이 왜 locale("kor")을 해야하는 것인지 의문이 듭니다. wchar_t와 L을 쓰면, 이 데이터가 유니코드이면서 utf16 방식임을 충분히 알려준 것 아닐까요..? 그러면 데이터를 보고 이것이 한글임을 바로 알 수 있지 않나요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수내에서의 동적할당
여기까지 공부하다가 궁금한 점이 생겨서 여쭈어봅니다 함수내에서 new로 동적할당을 하게 된다면 어떻게 해야하나요? 만약 Item이라는 클래스의 포인터를 반환하는 함수라면 new선언 후에 리턴값으로 이 new로 선언한 것을 반환하게 된다면 delete는 어디에서 선언해야하는 걸까요? 일단 생각해본건 return후 반한된건 new로 선언한 힙에 저장된 객체의 주소일테니 함수의 이름을 delete하는 걸로 생각하고있는데 궁금해서 여쭈어봅니다 Item* Find() { Item* item = new Item(); item->a = 100; return item; } int main() { Item* it = Find(); delete it; return 0; }
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
어셈블리 코드가 좀 다릅니다.
강사님 코드에는 함수를 call 하기 전에 a, b를 스택에 push를 하는데 제꺼에는 그러한 부분이 없고 mov로 처리를 하네요. 혹시 제가 visual studio 2022 버전을 사용해서 컴파일러가 달라서 이런건가요?? 아니면 x64와 x86의 차이인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
중괄호 초기화에 대해서 질문드립니다.
축소변환 방지의 예시로 들어주신 것이 이해가 안돼서 질문드립니다. int x = 0; double y{x}; 가 통과가 안된다는게 이해가 안됩니다. int -> double 변환인데 이것은 축소 변환이 아니라 확대 변환이여서 데이터 손실이 없지 않나요?? 왜 통과가 안되는지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
이런식으로 짜봤는데
mov ax, 91 ;입력 값 mov bx, 1 ;출력 값 shl ax, 15 cmp ax, 0 je LABEL_ODD mov bx, 0 LABEL_ODD: PRINT_HEX 1, bx NEWLINE 제 생각에는 문제가 없을것 같은데 문제가 생길 수 있는 부분이 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Creature(int creatureType) : _creatureType(creatureType)
Creature(int creatureType) : _creatureType(creatureType) 생성자 상속에서 _creatureType(creatureType) 이 의미하는바가 무엇인지 알고 싶습니다. cretaure type 을 _creatureType 으로 캐스팅 해주는 것을 상속 받는다는 의미인지요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
제가 스택 프레임을 잘 이해한 것이 맞는 걸까요?
디어셈블리를 보면서 한번 쭉 따라가보았는데 제가 잘 이해한 것인지 헷갈려서 정리한 것을 올려봅니다. 스택프레임 순서 현재 매개변수 저장 이전 BP(주소)값 저장 : push rbp RDI 값 저장 : push rdi 현재 SP(주소)값 저장 : sub rsp 현재 BP(주소)값 저장 : lea rpb [rsp + n] 피호출자 매개변수 저장 : mov 형식 ptr [rsp + n] (피호출자 입장) 이전 BP(주소)값 저장. 5번 값과 똑같음 그리고 정리를 하다보니 번외로 이해하기 너무 어렵거나 궁금한 부분들이 있어서 염치 불구하고 질문 몇가지 드립니다. 1. 스택 프레임에서 RDI 레지스터는 무슨 역할을 하는 것인가요? 복사 목적지 주소 레지스터를 의미하는 것 같은데 어떤 값을 push 하는 건지 모르겠습니다. 2. 영상에서의 temp와 같은 역할을 하는 메모리가 생기는 조건 같은 것이 있는 건가요? 기본 자료형(Ex. int)을 반환하는 함수를 만들어서 어셈블리로 보니까 호출자 쪽에 따로 접근하는 매개변수는 생기지 않은 것 같아서 의문이 들었습니다. 3. 피호출자 함수가 반환한 값을 호출자 함수에서 따로 저장하지 않고 날린다면 temp가 확보하고 있는 공간은 어떻게 되는건가요? 4. 마지막입니다. 우선 질문에 앞서 코드를 보여드리겠습니다. #include <iostream> class Test { public: Test(void) { std::cout << this << " : 디폴트 생성자" << std::endl; } Test(Test&) { std::cout << this << " : 복사 생성자" << std::endl; } Test(Test&&) { std::cout << this << " : r-value 이동 생성자" << std::endl; } ~Test(void) { std::cout << this << " : 소멸자" << std::endl; } }; Test TestFunc(Test testParam) { Test local; return local; } int main(void) { std::cout << "****** 시작 ******" << std::endl; Test a; Test b = TestFunc(a); std::cout << "****** 종료 ******" << std::endl; return 0; } 실행결과 입니다. 호출자 함수에서 클래스나 구조체를 선언함과 동시에 피호출자 함수 반환값(클래스or구조체)으로 정의를 하면 어떻게 되는건가 궁금합니다. 이번 강의에서 나온 것처럼 호출자 함수의 temp에 복사된 반환값(임시객체)에 식별자를 부여하고 temp 전체를 지역 변수처럼 활용하는 것인가 생각이 듭니다. 질문이 너무 많은 것 같아 염치 없습니다. 궁금한 부분의 어셈블리어를 직접 확인하면 제일 좋을텐데 아직 어셈블리어가 익숙하지 않아 이렇게 질문 남겨봅니다. 감사합니다.