월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
[지역적 가치와 가치 강좌 질문]
6분 56초 처럼 왜 제 컴퓨터 내에서는 erc 레지스터가 존재하지 않을까요?? 선생님처럼 똑같이 작성했는데 말입니다..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
잉 [충고]편, 강의와 다름
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 강의에서는 int result = MultiplyBy(b, a); 부분을 어셈블리로 조사를 한다면, push부분이 나와야 하지만 나타나지 않고 대부분 어셈블리적힌 부분이 다른 거 같은데 왜 다른지 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터계산
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. #include <iostream>using namespace std; int main(void){ int number = 1; int* ptr = &number; cout << &ptr << endl; cout << ptr << endl; cout << *ptr << endl; //*ptr += 1; //*ptr++; cout << *ptr << endl; }/* *ptr++;008D19AB mov eax,dword ptr [ptr]008D19AE add eax,4008D19B1 mov dword ptr [ptr],eax *ptr += 1;006419AB mov eax,dword ptr [ptr] 006419AE mov ecx,dword ptr [eax] 006419B0 add ecx,1 006419B3 mov edx,dword ptr [ptr] 006419B6 mov dword ptr [edx],ecx */ 궁금증이 생겨 여러 실험하면서, 어셈블리를 구경해봤습니다. ++, +=1 은 동일하게 1을 더할 때 사용한다고 배웠는데, 위와 같은 차이가 발생한 이유는 무엇인지 궁금합니다. (강의서 설명해주신 것처럼 1증가니까, 바구니 크기만큼 해서 4가 증가한 것으로는 이미 이해를 했습니다. ) (연산자 우선순위 상 문제가 있을 수도 있을 것으로 생각하여, 찾아봤습니다. *가 1순위, ++은 그 다음, +=은 제일 마지막이었습니다. 어떠한 경우든 *가 선이기 때문에 ++, += 의 영향은 없을 것이로 판단하였습니다. 이 생각에 오류가 있는지 궁금합니다.) 2. 저것의 결과는 *ptr++의 경우, -858993460이라는 수가 나왔는데, 이 이유를 잘 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
생성자 질문(타입 변환 생성자)
opertor를 공부하면서 생성자 부분이 궁금해서 테스트를 해보았는데 class Player{public : int m_iHp; int m_iAttack; int m_iDefense; public: Player() : m_iHp(100), m_iAttack(20), m_iDefense(5) { cout << "Player 기본 생성자!" << endl; } Player(int id) : m_iHp(200), m_iAttack(40), m_iDefense(10) { cout << "Player ID 받는 버젼 생성자!" << endl; } ~Player() { cout << "Player 소멸자!" << endl; }}; class Knight : public Player{public: int m_iStat; public: Knight() : m_iStat(10) { cout << "Knight 기본 생성자!" << endl; } Knight(int id) : Player(id), m_iStat(20) { cout << "Knight id 받는 버젼 생성자!" << endl; } ~Knight() { cout << "Knight 소멸자!" << endl; } }; int main(){ Knight k1; k1 = 3; return 0;} 현재 Knight k1을 만들게 되면은 콘솔창에 출력문이 이렇게 찍혀 햇갈리는 부분이 있어서 질문드립니다. 메모리를 확인해보니 k1의 주소(0x000000718D0FF688)는 이런값으로 안에 데이터들이 스택에 자리를 차지하게되어있었습니다. 이후 k1 = 3; 를 하게되면 Knight k1의 스택에 있는 주소가 가르키는 값들이 변경이 되는데 이는, 타입 변환 생성자(기타 생성자)를 통해 만들어진 객체를 만들어서 "암시적 형변환"으로 만들어진 객체를 대입연산자로 k1의 주소에 멤버 변수 하나하나를 다 덮어 쓴 형태인거같더라구요 즉, 정리하자면 1) Knight k1; 을 하는 순간은 스택에 기본 생성자를 호출 한 상태로 올라간다. 2) k1 = 3 하였을 경우, 컴파일러가 암시적 형변환으로 인자를 하나를 받는 Knight의 타입 변환 생성자(기타 생성자)를 호출한뒤 k1의 주소에 '=' 연산자를 통해 멤버 변수 하나하나를 덮어쓴다. (얕은 복사) 여기서 궁금한점이 소멸자를 출력하는 문장이 두줄에 걸쳐서 나오는게 아니라 이런식으로 4줄에 걸쳐서 나오는데 이게 분명히 암시적 형변환으로 생성한 객체를 생성하고 기본생성자로 만든 k1에 멤버 변수들을 덮어썻다고 생각해서 스택에는 Knight의 객체가 하나밖에 없는 상태로 봤는데 콘솔창을 확인하면 k1뿐만 아니라 k1 = 3을 하였을 때의 3에 해당하는 객체도 어딘가에 존재를 하는거 같은데 3이라는 정수를 컴파일러가 타입변환 생성자로 받아들여서 인자를 하나만 받는 Knight객체를 만들어서 '=' 연산자를 통해 k1에다가 멤버 변수를 다 덮어 씌우는데 정수 3을통해서 만들어진 객체도 스택에 올라간 다음에 값만 k1이라는 객체에 덮어 씌우는건가요..?? 맞는말인가요..???
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
C++과 C#의 클래스 객체 선언
(1. C# 문법입니다) public class Parent { protected virtual void Print() { Console.WriteLine("Parent Prnt!"); } public void CallFunc() { Print(); } } public class Child : Parent { protected override void Print() { Console.WriteLine("In Child!"); base.Print(); //Console.WriteLine("Child Prnt!"); } public void CallFunc() { Print(); } } 이런 클래스가 있다고 가정을 할때 C#에서는 Child c1 = new Child(); 이렇게 힙에 실제 객체를 올리고 new 연산자를 통해 (객체를 생성하고 생성자를 호출하는 키워드인 new연산자 사용) 힙에 올라간뒤 c1이 그곳을 가르키는 형태가 되어야 Child클래스 내에 있는 함수들을 사용할 수가 있는데 C++같은 경우에는 main 함수내에 Knight k1; 만 이렇게 선언해주어도 실제 설계도의 함수들을 사용할 수 있더라구요 이 이유가 그냥 C++는 C#과의 문법 차이로 C++에서는 객체를 만들때 new연산자를 사용하지 않고 Main 함수 내에서 Knight k1;만 해주면 클래스(실체) 스택에 올라가고 그냥 그녀석의 객체인 k1도 스택에 올라가는 것이고, C++에서 Knight* k2 = new Knight();를 해주어야 C#과 비슷한 형태인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
iterator 질문
안녕하세요 강사님 여기 코드에서 iterator begin() 이 부분이 어떻게 시작점 주소를 뱉어 줄 수 있엇나요? 질문하기 전에 종단점을 찍고 f11을 누르면서 찬찬히 살펴 봣는데 iterator부분의 생성자가 호출 되면서 빠져나오는데 이때 생성자에서 포인터 초기값을 해줘서 그런건가요? 만약에 이게 맞다면 iterator 클래스 생성자에서 초기화할 맴버변수가 많을때는 특정 값을 뱉어내기 힘들지 않나요??
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
생성자 소멸자와 관련해서 궁금한 것이 있습니다
루키스님 덕분에 어려웠던 c++ 공부에 흥미를 가지고 열심히 공부중인 학생입니다. 생성자와 소멸자에 관련한 영상을 보고 궁금증이 생겨 질문을 남기게 되었습니다! 첫번째 질문입니다) 클래스 내부에 생성자를 만들지 않는다면, 암시적으로 기본 생성자와 복사 생성자가 자동으로 만들어지는 것으로 알고있습니다. 그런데 생성자를 아무거나 하나 이상 만들면, 기본 생성자는 자동으로 만들어지지 않는데, 복사 생성자는 기본 생성자와 달리 다른 생성자의 유무와는 관계없이 자동으로 만들어 지는 것인지? 아니면 복사 생성자도 기본 생성자 처럼 아무 생성자가 하나 이상 있다면 자동으로 만들어지지 않는지 궁금합니다. 두번째 질문입니다) 강의를 보니 굳이 소멸자를 작성하지 않고 클래스를 만드시는 것을 봤는데, 그렇다면 클래스 내부에서 소멸자를 굳이 작성하지 않아도 자동으로 소멸자가 만들어지는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
11분 SetMessage 질문
main() { const char* msg = "Hello"; retrun 0; } Hello 라는 문자열이 수정이 불가능 한 이유로는 rodata영역에 들어가기 때문에 수정이 불가능하고 또한 const가 *이전에 붙어있어서 주소로 접근하여 값을 수정하는 것이 불가능하다. (msg라는 포인터 변수의 데이터(가르키는 주소는 수정이 가능하다) 그리고 SetMessage함수에 msg의 주소(값을)를 const char* a로 넘겨주고 a = "Bye"; 로 선언 및 초기화를 해주었을 경우 a는 const char* a 즉, a가 가르키는 값(주소)의 값(데이터 == Hello라는 문자열)수정이 불가능 한 것이지 a라는 포인터 변수가 담고있는 값부분(주소값)을 수정하는 게 불가능 한 것이 아니다. 따라서 SetMessage 함수가 호출되면 a라는 포인터 변수에 처음에 msg의 값에 담긴 "Hello"라는 문자열의 첫번째 주소값이 a에 담기기는 하지만, a = "Bye"로 인해 데이터 영역에 있는 "Bye"의 첫번째 주소가 a라는 포인터 변수의 값에 할당된다. 그리고 a라는 포인터 변수는 스택메모리에 쌓인다. SetMessage함수 호출이 종료되고 나면 a 포인터 변수 메모리 공간은 해제된다. (함수 호출이 종료되면 사용할 수 없는 포인터 변수이다) 제가 이해한것이 맞나요?? (추가로 SetMessage 함수에서 데이터 영역에 Bye"라는 문자열을 데이터 영역에 메모리만 추가를 하고, a가 가르키는 값은 해제가 되니까 결론적으로는 데이터 영역의 메모리만 잡아먹고 아무것도 안한셈이 되는 것인가요?)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
virtual을 붙이는 여부
안녕하세요 강사님 질문이 있습니다. 전에 다항성 수업에서 virtual 함수구현 할때 부모 클래스와 자식 클래스 가상함수에도 virtual 둘다 붙여 주셨고 마지막 text rpg에서도 Player와 Game 클래스에 소멸자에 virtual 을 붙여 주었습니다. 근데 이번에는 Player에만 virtual을 붙여 주셨는데요 그 이유가 뭔가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
스마트포인터 강의 질문입니당
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1번 질문 일단 강의에서 shared_ptr 간단하게 구현하셨다고 들었습니다 SharedPtr 구현부에서 void operator=(const SharedPtr& sptr) { _ptr = sptr._ptr; _block = sptr._block; if (_ptr != nullptr) { _block->_refCount++; cout << "RefCount : " << _block->_refCount << '\n'; } }복사대입연산자에서 질문입니다SharedPtr<Knight> k1(new Knight());SharedPtr<Knight> k2(new Knight());k1=k2; 할때 _ptr = sptr._ptr;_block = sptr._block 를 먼저해버리면 k1이 가지고 있는 값 처리가 안될거 같은데간단하게 보여주실려고 k1이 가리키고 있는 knight 객체나 refblock 처리 부분을 생략하신거죠?2번 질문shared_ptr을 쓸때 Ref 블럭 최초 생성되는 시기가 궁금합니다제가 생각하기에첫번째 생성자 호출할때Knight* k=new Knight(); shared_ptr<Knight> k1(k); 할때 block을 생성할 거 같고두번째는 shared_ptr<Knight> k1 = make_shared<Knight>(); 복사 생성자를 통해서 make로 만들어진 블럭을 연결할거 같습니다혹시 이거 말고도 블럭이 생성되는 case가 있나요?3번 질문shared_ptr<Knight> k1 = make_shared<Knight>(); //끝나기 전 연결끊기 k1->_target = nullptr; 이거는 nullptr 인자를 받는 shared_ptr 임시객체를 만들어서 이동대입연산자로 처리하나요?아직 c++이 미숙해서 그런지라이브러리 헤더파일 볼려고했는데 잘 안 읽히네요...
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
쎅..쎽로우 월드 21:36
const char* str = "Hello World"; 에서 문자열은 .rodata역영에 들어기기 때문에 수정이 불가능 한 것은 알겠습니다. 그런데 char test2[] = "Hello World";의 경우에는 왜 readOnly data영역에 들어가지 않았기 때문에 Test함수를 통해서 Hello World가 Xello World 로 수정이 가능하다는 것까지는 알겠습니다. 그렇다면 test2[] 배열의 "Hello World';는 초기화를 해주면 1) test2의 문자열은 스택에 들어가는 것인가요? 포인터변수로 가르키면 리터럴이 데이터 영역에 들어가고 배열로 초기화를 해주면 스택에 들어가고.. 2) 문자열 데이터의 메모리위치? 들어갈 메모리의 기준이 헷갈립니다...
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수객체론 해결을 하지 못하고 함수 포인터를 사용해야만 하는 상황이 있을까요?
함수 포인터와 함수 객체에 대해서 강의를 들었습니다. 강사님께서 함수 포인터에겐 진행상황을 저장할수 없다는 단점이 있어, 클래스를 이용해 함수 객체를 이용하면 단점이 보완가능하다고 설명해주시고, 함수 객체 또한 매게 변수로 사용이 가능한걸로 아는데, 그렇다면 함수포인터는 함수 객체로 대체해서 쓰면 가능하지 않나요? 아니라면 함수 객체로만 해결이 가능한 그런 상황이 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
몫과 나머지 print하기
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 몫은 al로, 나머지는 ah로 가는 것까지는 알겠습니다. 그런데 mov al, ah를 하는 이유가 궁금합니다. (PRINT_DEC ah를 하는 경우, 오류가 발생하는데, 왜 오류가 발생하는지 궁금합니다.)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
동적바인딩으로 동적할당 질문입니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 나이트의 갯수를 입력값으로 받고 싶어서 처음 Player* p=new Knight[num]; 순간 되는줄 알고 하다가 생각해보니 아주 위험한 짓이더군요 이 코드 뉘앙스처럼 만들고싶으면Player** p=new Player*[num];해서 for문으로 하나씩 넣던가아니면벡터를 쓰는 방법 밖에 없겠죠?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
초기화된 여부
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요 초기화 된 데이터는 section .data로 초기화 되지 않은 데이터는 section .bss에 넣는다는 것은 알겠는데, 초기화 되었다 라는 것이 어떠한 의미인지 잘 모르겠습니다. (초기화되었다는 게 위에서 이미 그 변수를 선언해주는 것임은 알고 있는데, 어셈블러에서 초기화되었는지에 대한 여부를 어떻게 확인하는지 잘 모르겠습니다.)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
달팽이 연습문제 풀다가 문득 질문드립니다!
안녕하세요! 열심히 공부중인 초보 학생입니다. 달팽이 연습 문제를 풀다가 <iomaip> 에 대해 기억이 안나면 구글링을 하면 된다고 하셨는데, 회사 면접 시험 도중 구글링이 가능 할까요? 상당히 무거운 분위기와 환경에서 시험을 치를것 같은데, 위와 같은 사소한 기능들이 기억이 나지 않을까 걱정됩니다. 혹여 위와 같은 구글링이 안된다면 유용한 기능들이 있는 헤더들을 외워두고 가야할까요??
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
부동소수점의 지수 부분
안녕하세요 실수를 표현하는 방법 중 지수 부분이 조금 관심이 가서 인터넷을 찾아봤는데 00000000과 11111111은 사용이 안되어서 00000001 ~ 11111110까지 활용이 가능하다고 하더군요.. 여기까지는 그렇구나 했는데 이게 10진수로는 -126 ~ 127이라고 해서 많이 헷갈립니다... 1바이트인 char의 경우에는 -128 ~ 127까지가 표현범위인 것으로 알고 있고 00000001 ~ 11111110이면 -127 ~ 126이 되어야된다고 생각하고 있었거든요 중요한 부분인지는 잘 모르겠지만 순수하게 궁금합니다... p.s. 새로운 내용들을 공부할 때마다 예전에 배웠던 내용들 중 잘 사용하지 않는 부분들은 자꾸만 잊어버리는데(ex - bitflag) 좋은 방법이 있을까요?;;
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Release 는 무엇인가요?
강의를 잠깐 보면서 따라하다가 비주얼 스튜디오 맨위에 32비트 64비트 바꿔주는 아이콘 옆에 Debug라는 아이가 있길래 클릭 해 봤더니 밑에 Release 라는 아이도 있었습니다. Release는 무엇인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
SASM SAVE
SASM 사용할때 파일 저장 안하고 그냥 실행 하면 오류뜨나요? 왠만하면 저장하고 실행하는게 나은가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
구조체 패딩 관련 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. struct Padding { char a; //1 long long b; //8 short c; //2 int d; //4 char e; //1 long long f; //8 char g; //1 }; 디폴트 패킹 값으로 설정되어있고 32bit 환경과 64bit 환경에서 둘다 테스트해봤습니다. 처음에 디폴트 패킹값이 8이라고 알고있어서8byte 단위로 끊어서 c , d , e 변수가 하나의 8byte 단위로 들어갈거라고 생각해서 sizeof(Padding)이 40byte라고 생각했는데결과는 48byte가 나왔습니다그래서 메모리 뷰를 확인해 본 결과 0x000000837FB1F948 03 00 cc cc ..?? 0x000000837FB1F94C 04 00 00 00 .... 0x000000837FB1F950 05 cc cc cc .???0x000000837FB1F954 cc cc cc cc ???? short c 랑 int d가 8byte 차지하고char e 혼자 8byte를 차지하더라고요왜 굳이 8byte단위로 처리 가능한데short c / int d / char e 를 하나의 8byte로 처리하지 않고 오히려 4byte씩 끊어서 처리하는 느낌이 들었는데 이런 현상에 대해서 궁금합니다