월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[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 전체를 지역 변수처럼 활용하는 것인가 생각이 듭니다. 질문이 너무 많은 것 같아 염치 없습니다. 궁금한 부분의 어셈블리어를 직접 확인하면 제일 좋을텐데 아직 어셈블리어가 익숙하지 않아 이렇게 질문 남겨봅니다. 감사합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
const가 메모리에 할당되지 않는다는게
const를 지역변수로 선언하면 stack영역에 할당된다는건 이해했습니다. 근데 전역변수로 사용할 경우에는 메모리가 어디에 할당될지는 컴파일러의 마음이라고 설명해주시고 메모리에 할당되지 않았다는걸 보여주셨는데 이게 궁금해서 인터넷에 찾아보니 다들 전역const에 경우에는 .rodata에 메모리가 할당된다고 설명을 하더라구요... #define의 경우에는 메모리를 쓰지않는다고하고... 약간좀 혼란이오는데 메모리에 할당될지 말지는 랜덤이라는게 맞는 말인가요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
연습문제(문자열)#2 질문있습니다.
#include <iostream> using namespace std; //문제2 문자열 복사 함수 char* StrCpy(char* dest, char* src) { int i = 0; while (src[i] != '\0') { dest[i] = src[i]; i++; } dest[i] = '\0'; return dest; } int main() { const int BUF_SIZE = 100; char a[BUF_SIZE] = "Hello"; char b[BUF_SIZE] = "World"; StrCpy(b, a); cout << b << endl; } 안녕하세요 강사님 최근 연습문제 풀다가 질문있어서 올리게 되었는데요, 3가지 질문드립니다. 질문1 함수 char* StrCpy(char* dest, char* src) 부분에서 함수 자료형이 char*이면 return을 받을때 &rest가 아닌 그냥 rest받는 이유를 알려주세요. 혼자 계속 고민하다가 도저히 모르겠어요 ㅠㅠ 질문2 함수 char* StrCpy(char* dest, char* src)에서 매개변수가 char* 되어있으면 StrCpy(b, a)가 아닌 StrCpy(&b, &a)로 받아야되는 것아닌가요? 질문3 마지막으로 cout << b << endl;에서 b를 출력하면 b[0]만 출력하는줄 알았는데 나머지 배열 전체값이 출력되는 원리 좀 알려주세요. 끝으로 제가 강사님 강의 듣고 많은 도움이 되고 있는데 c++은 사실 이번이 처음이어서 그런지 많은 어려움이 있습니다. 특히 포인터로 들어가면서 더더욱 힘들더라구요ㅜㅜ 포인터 부분 어떻게 극복하면 좋은지 약간의 조언좀 해주시면 감사하겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
lambda강의를 듣고 코딩문제에서 구현해봤는데 잘 안되네요 ㅠㅠ
struct isSpecial { bool operator()(char c) { return !((c >= 48 && c <= 57) || (c >= 97 && c <= 122) || c == '-' || c == '_' || c == '.'); } }; // auto isSpecial = [](char c) {return ((c >= 48 && c <= 57)|| (c >= 97 && c <= 122) || c == '-' || c == '_' || c == '.'); }; new_id.erase(remove_if(new_id.begin(), new_id.end(), isSpecial()), new_id.end()); new_id는 string입니다.. struct isSpecial로 remove_if에 전달하면 실행되는데 아래 lambda문법으로 isSpecial을 전달하면 "E1767 지정된 인수 목록으로 함수 "lambda []bool (char c)->bool"을(를) 호출할 수 없습니다." 라며 오류가 발생합니다 ㅠㅠ 왜이러는건가요
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
코딩테스트 준비는 언제부터 시작하면 좋을까요?
안녕하세요 루키스님 현재 Part1의 C++ 강의를 쭉 듣고있습니다 기업 공고를 찾아보니 코딩테스트를 요구하는 곳도 다수 존재하더군요 그래서 강의와 병행하며 백준이나 프로그래머스에서 코딩테스트 준비까지 같이하려는데 자료구조 알고리즘 강의까지 전부 학습한 후부터 준비하는 것이 좋을까요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
C++ 책
안녕하세요 루키스님 예전에 강의를 신청해놓고 이제서야 시간이 나서 들으려합니다.. 제가 C++ 책이 하나도 없어서 하나 구매해서 참고하면서 강의를 듣고싶은데요.. 어떤책을 살지 고민하다가 혹시 추천해주실만한 책이 있으신지해서 여쭤봅니다 .강의내용과 상관없는 질문이라 죄송합니다..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
*ptr 부분 크래쉬 이유
*ptr이 매개변수로 받을때부터 TestPtr에서 &a를 받았는데 어째서 그값이 a[100] 주소를 가르키고있고 그 상태에서*ptr=0x12341234를 넣었을떄 어떻게 크래쉬가 나는지 이해가 되지않아 이렇게 질문을드립니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
연산자 오버로딩 ++ 질문입니다.
Iterator& operator++() { _ptr++; return *this; } Iterator operator++(int) { Iterator temp = *this; _ptr++; return temp; } 넘겨주는 부분이 이해가 안돼서 질문드립니다. 전위형의 경우 return *this를 반환하고 후위형의경우에 temp에다가 *this를 넣은후 temp를 반환하는데 결국 둘의 반환타입이 같은거 아닌가요??.. 근데 왜 전위형의경우에는 반환값이 Iterator의 참조값이고 후위형의 경우는 Iterator인가요?..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
14:25 스택메모리 사용영역설정 질문 있습니다
위 체크한 부분에서 스택에 범위를 설정한다 하셨는데 이전 함수ebp를 푸쉬한다음 ebp에 esp를 넣어놓고, 매개변수와 리턴할주소값을 일단 넣은 다음 공간을 확보하는건가요? 순서가 1.이전함수bp값을 저장 2.ebp값을esp로 설정 3.esp에 사용할범위설정 맞나요? 정확히 어떤식으로 영역설정이 되는건가요?