[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
루카스님 강의 외에도 홍정모님 c++강의도 보는데요 일단 강의는 완강하고 이해 안가는 부분은 3~4번 돌려보고 그랬는데 사실 완강을 해서 문법은 어느정도 안다고 생각은 하는데 문법을 제대로 사용할 수 있냐라고 하면 아니라고 생각해요.. 공부하고 다음으로 넘어가는 기준을 어떻게 새워야 하는지 모르겠습니다.. 제가 c++ -> 다렉12 -> 언리얼 순으로 공부해서 게임하나 출시해보고 취업할 생각이거든요.. "이 정도면 c++ 기초 수준은 된다 이제 다렉으로 넘어가도 되겠다!"가 어느 정도일까요.. 머리가 나빠 언어공부를 오래해서 그런지 사실 점점 흥미도 떨어지고 빨리 구현하고 움직이는걸 보고싶고.. 괜히 조바심에 대충하고 넘어가서 나중에 이상한 버릇이 생기거나 할까봐 무서워요.. c++언어 완강을 하고 다렉으로 넘어가도 될지.. c++에 기초는 넘겼다는 기준이 뭘지.. 이럴떈 어떻게 해야될까요? ㅠ
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
덕분에 c++강의 잘 듣고 있지만 요즘 고민이 있어서, 한가지 여쭤보고자 합니다. 이전에 '포인터' 때문에 많이 애를 먹었는데, '클래스' 파트로 들어오고나니 더 힘들더군요 ㅜㅜ 이부분이 지루하고 많이들 어렵다고 하지만, 막상 처음 겪게 되니 요즘 공부하면서 멘탈에 금이가기 시작 하더군요... 혹시 이런 어려운 파트들은 어떻게 극복할 수 있는지 팁좀 알려 주실 수 있을까요?
scanf함수를 이용해서 char 배열에 문자를 받아오게 되는데 선생님 강의에서 보통 char 배열을 for문으로 돌 때 '\0' null 문자를 이용하는 걸 배웠습니다. 근데 만약에 char arr[5]인 배열에 'abcde'를 scanf로 입력받는다면 어떻게 될지 궁금해서 프로그래밍을 해보니까 정상적으로 for문을 수행했습니다. 이런 경우엔 배열의 크기가 5인데 null 문자는 어디에 저장된 것일지, 어떻게 for문을 인식하고 수행한 것인지 궁금합니다.
안녕하세요! 강사님! 우선... 좋은 강의 열심히 듣고 있습니다! 저는 지금은 c언어 밖에 제대로 모르는 상태고 c++은 얕게 아는 상태인데, 그래서 이 강좌를 시작할 때, 이 강좌이름이 c/c++ 이라고 되어 있어서, c++을 잘 모르는데 들어도 되나 되게 걱정했었거든요 근데 막상 들어보니까 그냥 c언어만 알아도 아무 문제가 없더라고요 그래서 그런데, 미래에 코딩테스트를 응시할 때, 언어를 하나 선택하게 된다면, c언어를 선택하나 c++을 선택하나 큰 차이가 없는건가요??
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
일단 엄청난 뉴비입니다..ㅠㅠ 별것 아닌것 같아보이는데 구글링을 아무리 해봐도 해결이 안되서 질문드립니다. 저도 레지스터와 메모리를 SASM에서 변수를 찾아보고 싶은데 (선생님 강의 초반부 레지스터쪽) SASM에서 show memory, show register 부분이 활성화가 안되어있습니다. SASM에서 한줄 한줄 디버깅을 하는것도 안됩니다. (구글링 해보니 이게 해결되면 show memory , show register가 활성화 될것 같더라구요.) 디버그를 누르면 소스코드 처음부터 끝까지 디버그 하고 끝났다고 표시됩니다. LG 그램 , 윈도우 10 사용자에요. 사진 한장 남깁니다. 강의 진도 나가고 싶은데 따라할 수가 없어서 슬퍼요.
강의의 코드에서 113번째 줄에 있는 visited[turn % 2][nx] = visited[(turn + 1) % 2][x] + 1; 거리를 구하는 것이 아니고 방문 여부를 파악하는 것이기 때문에 visited[turn%2][nx] = 1; 로 풀어도 된다고 생각하는 데 이것이 맞을까요? 만약에 아니라면 어떤 이유인지 궁금합니다!
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
유니코드 관련해 질문이 있습니다! UTF16 방식이 2바이트에 각종 문자를 할당하는 것이라면, 한글에도 문자 하나하나에 2바이트 크기의 어떤 고유한 데이터가 할당되어 있는 것이라고 이해했습니다. 그런데 이러면 굳이 왜 locale("kor")을 해야하는 것인지 의문이 듭니다. wchar_t와 L을 쓰면, 이 데이터가 유니코드이면서 utf16 방식임을 충분히 알려준 것 아닐까요..? 그러면 데이터를 보고 이것이 한글임을 바로 알 수 있지 않나요??
따배씨를 듣고 곧바로 C++을 듣고 있습니다. 실험을 해보다 신기한 결과가 나오는데 해석이 되지 않아 질문을 남깁니다. add 함수는 add.header 파일에서 선언을 하고 add.cpp 파일에서 body를 정의하였습니다. global.h 내에 정의되어 있는 함수 print_global()은 header 파일에 Body를 정의하였습니다. 이 함수로 에러를 발생시킬 것이며 header guard가 잘 작동하는지 확인하기 위해 실험할 것입니다. global.h 함수에서 #pragma once와 #ifndef-#define으로 헤더가드를 만들면 서로 다른 cpp파일이 호출하여도 에러가 발생하지 않을거라 예상하고 실행하였습니다. // add.h #pragma once #ifndef __ADD #define __ADD int add(int a, int b); // Forward declaration, Prototype #endif // add.cpp #include "global.h" int add(int a, int b) // Definition { print_global(); return a + b; } // global.h #pragma once #ifndef __GLOBAL #define __GLOBAL #include <iostream> void print_global() { std::cout << __func__ << "is executed!" << std::endl; } #endif // !__GLOBAL // main.cpp #include "add.h" #include "global.h" int main() { print_global(); std::cout << add(1, 2) << std::endl; } 링크에러는 add.obj에서 발생하였습니다. header guard가 있어서 링크 에러가 발생하지 않아야 할 거 같은데 무슨일인지 이해가 되지 않습니다. add.cpp 파일을 지우고 add.h 헤더파일안에 함수의 Body를 넣으면 링크에러가 발생하지 않습니다. #pragma once #ifndef __ADD #define __ADD #include "global.h" int add(int a, int b) // Definition { print_global(); return a + b; } #endif 따라서 header guard가 header 파일 내부에서 정의되었더라도 cpp파일에서 #include 전처리 지시자를 사용해서 해당 header를 복사-붙여넣기 해버리면 header guard가 무용지물이 되어버린다는 가정을 세웠습니다. 제 가정이 맞나요? cpp파일에서 header guard는 작동하지 않는다는 가정이 맞나요? 왜 그런지 잘 모르겠습니다. header 파일은 link 없이 #include 전처리지시자로 동작하지만 cpp 파일은 obj로 만들어 linker가 연결해주기 때문에 전처리지시자가 아무 역할을 하지 못하는거 같습니다.
지금까지 공부한 내용을 바탕으로 보면 객체는 생성된 괄호 안에서만 존재하고 괄호를 벗어나면 사라진다 라고 배웠습니다. 익명객체는 줄이끝나면 바로 없어지고요 근데 드는의문점이 있는데요 위의 코드에서처럼 객체의 소멸시점에 대해 실험해봤는데 실행결과만 보면 객체의 매개변수등의 정보들이 메모리에 여전히 저장되어 있는것처럼 나옵니다. 저 값들은 말그대로 os에 반납된 메모리라 언젠간 다른 데이터로 인하여 덮어질 예정인 값들이 맞죠? 저 mon1 이라는 객체는 말그대로 없어진것이 맞는지 궁금합니다. 만약에 없어진 것이 맞다면 예를들어 mon1 안에 Position2D 타입의 객체를 생성하는 구문이 있을때 이 생성된 객체도 없어지는것이 맞죠?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
class Marine { public: // 특정 마린 객체에 종속적 int _hp; void TakeDamage(int damage) { _hp -= damage; } static void SetAttack() { s_attack = 100; } // 특정 마린 객체와 무관 // 마린이라는 '클래스' 자체와 연관 static int s_attack; // 설게도 상으로만 존재 }; int GenerateId() { // 생명주기 : 프로그램 시작/종료 (메모리에 항상 올라가 있음) // 가시범위 : // 정적 지역 객체 static int s_id = 1; return s_id++; } 강의에서 나오는 Marine클래스와 GenerateId()함수입니다. 강의 중 GenerateId()함수를 여러번 부를 경우 정적 지역 객체인 s_id가 계속해서 1로 초기화 되는 것이 아닌, 처음 함수를 부를 때만 1으로 초기화 되고 그 다음부터는 ++만 연산해서 1, 2, 3, ... 과같이 s_id가 계속해서 증가하는 모습을 보였습니다. 그래서 저는 Marine클래스의 SetAttack()도 처음에만 100으로 세팅해주는것인가? 라는 생각이 들어 Marine::SetAttack(); cout << m1.s_attack << endl; Marine::s_attack = 7; cout << m1.s_attack << endl; Marine::SetAttack(); cout << m1.s_attack << endl; 이렇게 실행해 보았으나, 출력이 100 7 100으로 다시 초기화가 된 것을 확인하였습니다. 왜 SetAttack()은 부를때마다 초기화가 진행되고 GenerateId()는 그렇지 않은 것인가요?
안녕하세요. 항상 좋은 강의 감사드립니다. 실습을 진행 중 궁금한 사항이 있어 질문을 올리게 되었습니다. #include <iostream> #include <limits> short s = std::numeric_limits<short>::max(); cout << "max + 1: " << ss + 1 << endl; cout << "max + 2: " << ss + 2 << endl; s += 1; cout << "max + 1: " << ss << endl; 위 코드를 출력하면 다음과 같이 출력됩니다. max + 1: 32768 max + 2: 32769 max + 1: -32768 수의 최대 범위가 넘어갔는데도, 출력을 할 때 더 큰 수가 출력이 되는 이유가 변수에 저장을 안해서 그런 것 인가요? L-value와 R-value와 관계가 있는 것인지 궁금합니다. 감사합니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
맥 사용자인데 부트캠프로 윈도우로 변경 후 강의를 듣고있습니다! 원래대로 맥북을 이용해서 듣고싶은데 강의 자체도 윈도우고, 검색을 해보니 맥은 VS로 C++은 지원 하지 않는다고 봐서 VScode를 이용해야 한다던데, 엄연히 VS와 VScode는 다른걸로 알고있어서 그냥 윈도우 상태로 강의를 듣는게 낫겠죠?? 언리얼엔진까지 공부할려고 하는데 그냥 윈도우로 가는게 좋을지 조언 부탁드립니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이미 주소를 가지고 있으면 지우는것이기때문에 if(m_ptr) delete m_ptr ; 이 맞지않나요? if(!m_ptr) delete m_ptr 하면 m_ptr이 nullptr일때 지우는게 아닌가 해서 질문드립니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Pet() Pet(const Pet&) Pet() Pet(const Pet&) ~Pet() ~Pet() ~Pet() 깊은 복사 구현후 실행하면 생성자 4번, 소멸자 3번 출력되는데 Knight knight3; 때 생성된 Pet()이 knight3 = knight 때 복사 대입 연산자에서 생성된 pet으로 대체 되잖아요. 그래서 하나의 pet이 소멸이 안된 건가요? 이정도 데이터 누수는 괜찮은 건가요? 이것도 관리해 줘야 하나요?