[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Rookiss님 답변에서 궁금한 점이 생겼습니다. 은닉성 답변에서 void main() { Knight k; int& hp = k.GetHp(); //< 일단 문제는 없음 } 이런 표현을 써주셨습니다. 제가 항상 헷갈리던게 반환형이 참조형이면 뭐가 반환되는가가 헷갈렸습니다. 예를 들어, class Knight { public: int _hp; int& GetHp() { return _hp; } }; int main() { Knight k; k._hp = 100; int a = k.GetHp(); int& b = k.GetHp(); return0; } 이런식으로 되어 있을 때 a와 b에서 일어나는 일의 차이를 잘 모르겠습니다 위 코드를 디스어셈블리로 살펴보면 int a = k.GetHp(); 00A71939 lea ecx,[k] 00A7193C call Knight::GetHp (0A710B9h) 00A71941 mov eax,dword ptr [eax] 00A71943 mov dword ptr [a],eax int& b = k.GetHp(); 00A71946 lea ecx,[k] 00A71949 call Knight::GetHp (0A710B9h) 00A7194E mov dword ptr [b],eax ==> 이 실행문이 a에 하나 더 있는 걸 제외하고는 차이가 없습니다. 00A71941 mov eax,dword ptr [eax] 1. 참조값을 반환 한다는게 뭘 반환해 준다는 건가요? - 예전 참조기초 강의에서 int* pointer = &number; 00BA2A59 lea eax,[number] 00BA2A5C mov dword ptr [pointer],eax *pointer = 2; 00BA2A5F mov eax,dword ptr [pointer] 00BA2A62 mov dword ptr [eax],2 int& reference = number; 00BA2A68 lea eax,[number] 00BA2A6B mov dword ptr [reference],eax 이 어셈블리를 통해 int*로 선언된 변수나 int&로 선언된 변수 모두 number의 주소를 담는 바구니라는 것을 확인했습니다. 위와 같은 사실로 제가 생각해 봤을 때, -> 제 생각 : 반환형이 int& 라면-> 참조값 &, 포인터처럼 주소를 담는 바구니는 돌려준다 -> 그 바구니를 따라가다보면 나오는 데이터는 int형이다. int a = k.GetHp()의 뜻 -> 바구니를 따라가다보면 나오는 int형 데이터를 복사해서 a라는 바구니에 대입해주겠다. int& b = k.GetHp()의 뜻 -> 00A7194E mov dword ptr [b],eax 여기서 eax가 return시 [_hp의 주소]를 가지고 있다는 것을 확인했습니다. (008550C9 call Knight::GetHp (08510B9h) 를 F11로 들어가 확인해봤습니다) 즉 b는 _hp의 주소를 가지는 변수이다 -> 그런데 왜 메모리에서 &b를 찍으면 b의 주소에 _hp의 주소가 뜨는게 아니고 100이라는 값이 정확히 뜰까? -> C++에서는 참조라는게 그렇게 작동하니까 결국 리턴 값이 참조형으로 되어있으면 리턴되는 변수의 주소값이 넘어오는 것이다. 위와 같은 결론이 맞는 생각인지 궁금합니다.
안녕하세요 . 강의를 듣던 도중 저도 다시 한번 코드를 복기해보다가 코드 상 오류가 있는 것은 아니고 흐름에 대해 궁금한 점이 있어 질문드립니다. 일단 제가 기억하기로는 saga와 reducer는 비동기적으로 작동하는 구조입니다. 제로초님 코드에서 PostForm에서는 reducer에서 addPost를 불러와서 request 액션을 전달해주고 그 request가 reducer와 saga로 보내주는 방식이라면, CommentForm에는 reducer에서 선언해놓은 addComment를 거치지 않고 바로 request액션을 전달해주어 Component에서 바로 saga와 reducer로 보내주는 구조를 갖고 있는 것을 보았습니다. 1. 이렇게 dispatch가 이렇게 action을 보내주면 바로 reducer가 처리하게 되는데 /reducers/post.js에 있는 addPost와 addComment의 존재 이유가 단지 가시성때문인가요? 2. 혹시 성능적으로는 크게 차이 없을것같지만 그런쪽에 이슈가 있을까요? reducer의 addPost는 사용하고 왜 reducer의addComment는 왜 사용하지 않았는지 궁금합니다. 3. dispatch에서 해당 데이터를 묶어서 보내는데 addPost처럼 보내기위해서 저는 아래 코드와 같이 데이터를 이렇게 묶어서 보내봤는데 더 좋은 방법이 있을까요? const onSubmitComment = useCallback( () => { const data ={ content: commentText, postId: post.id, userId: id } dispatch(addComment(data)); }, [commentText, id]); 어 사실 더 헷갈렸었는데 질문을 쓰면서 정리하다보니 어느정도 이해가 간 것 같습니다.. 감사합니다
강사님 정말 감사합니다. 2번째 완강했습니다. 2번 들으니 확실히 이해되는것들이 훨씬 많았었어요. 강사님의 유튜브 채널에 올라와있는 mern-stack 헤로쿠 deploy 영상을 보고 저도 배포를 해봤습니다. 빌드 success 까지 잘되서 열어보면 index.js 에 작성한 Hello World 만 뜹니다.. 깃을 지우고 다시 해보기도하고 client에서 npm run build 도 여러번 해보고 해봐도 계속 이렇게만 뜨네요.. index.js 에 if (process.env.NODE_ENV === "production") ... 구문도 잘 넣어줬습니다. 무엇이 문제일까요.. 아래는 boiler plate 깃허브 주소입니다! https://github.com/yongmon01/review-project 혼자 도저히 해결이 안되서 질문드립니다 ㅠㅠ
이전강의에서 부터 좀 의문이 가던 건데 유니티 문서를 찾아보니까 더 헷갈려서요 지금 구조가 InputManger.OnUpdate() - 키보드/마우스가 눌러졌는지 감지 (Input.anyKey 혹은 Input.GetMousebuttonDown을 사용) 각 Input마다 정의된 Action을 Invoke 각 Action을 구독하고 있는 함수들에게 Event 발생을 알림 (현재로선, PlaterController.cs의 OnKeyBoard(), OnMouseClicked) 거기다 Manager.cs에서 각 매니저들의 인스턴스를 들고 있고 Manager.cs의 Update() 속에서 _input.OnUpdate()를 불러주도록 되어있습니다 이런 구조랑 설명에 대해서 이해는 가거든요 나중에 디버그 할 때나 기능을 추가할 때, 딱 필요한 부분만 찾아서 거기서만 작업해주겠구나 하는 느낌은 드는데 100% 납득이 안갑니다 굳이 이렇게까지 많이 쪼개야 하나 하고요 아직 기능이 많이 추가 된게 아니라서 이렇게 쪼개는 단계가 너무 많아 보여서 그런걸까요?
main>java>com.gamja.gamja 패키지 안에 HelloController.java를 다음과 같이 작성하고 package.com.gamja.gamja; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @RestController public class HelloController { @RequestMapping("/") public String index() { return "Hello, world!"; } } 같은 패키지 안에 있는 기본 제공되는 GamjaApplication을 실행했을 때 (프로젝트 명이 Gamja입니다.) package com.gamja.gamja; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GamjaApplication { public static void main(String[] args) { SpringApplication.run(GamjaApplication.class, args); } } HelloController.java에 있는 return값이 locahost:8080에 출력되는 것은 이유가 뭔가요? GamjaApplication 클래스와 생성된 HelloController클래스 간의 연관성이 궁금합니다 ㅠㅠ
안녕하세요 백기선님, 13분 40초즈음 부터 나오는 설명에 대해 좀 더 궁금해서 문의드립니다. 인스턴스 필드 타입으로 옵셔널을 쓰면 더 명확해서 null 체크에도 도움이 되겠다 싶었는데요, 강의에서는 사용하지 말 것을 추천하셔서요. 어떤 이유로 도메인 설계에 좋지 않은 것인지, 구체적인 회피 방법(말씀해주신 델리게이션을 실제로 구현하는 방법도 궁금합니다) 은 무엇인지 궁금합니다. 감사합니다.
프로그래밍 전공인데.. 빅데이터가 하고싶어서 R을 공부중이에요. ADsP도 준비하고있구요. 조금 놀랬던건, 자격증 준비하는 책에도 그렇고 인터넷 강의들도 그렇고 다소 붕뜬 느낌이 있었어요 (기초를 안알려주는?..) 그래서 이렇게 기초이론부터 알려주는 강의를 찾고있었는데 드디어 찾은거 같아서 너무 기쁘네요ㅠㅜㅜㅠㅜ 아 참 질문은, 이 강의를 다 듣고나면 어떤 강의를 듣는게 좋을까요? 추가로 수리통계학을 독학을 할까하는데 도움이 될만한 자료가 있을까요?? 좋은 강의 감사합니다.
안녕하세요 강사님. 강의 잘 보고 있습니다. redux-saga 적용 중 코딩을 마치고 저장 후 실행해 보니 다음과 같은 오류가 발생하여 이미지 첨부해 드립니다. 코드는 아래와 같습니다. https://github.com/wkdgus1164/zerocho-next/tree/redux-saga/prepare/front 제가 작성했던 코드에서 발생하는 에러이면 오타를 찾아볼 텐데 제가 작성한 코드가 아닌 것 같아서 상세한 내용 없이 질문 올려드리는 점 너무 죄송합니다 ㅜㅜ.
키보드 조작하는 부분까지 강의를 따라 만들어둔 상태입니다. (스코어 부분 시작 직전까지, 약 37분 45초까지) * 키보드 동작을 넣기전에는 4x4 셀을 그린 후 두 곳에 랜덤하게 숫자2를 표현하였습니다. * 키보드 동작까지 완료 후 4x4 셀을 그린 후 아무런 타일이 생성되지 않고 있습니다. 키보드 동작시에 에러도 없습니다. 강의 진행 중 아무런 에러도 발생하지 않고 코드를 역추적해가며 살펴봐도 어디 부분에서 잘못을 했는지 찾아지지가 않습니다 ㅠㅠ 도움이 필요합니다! * 깃에 올려둔 코드 주소입니다( https://github.com/Doha-Dev/game2048.git )
안녕하세요:) scanf도 getchar() 처럼 입력 받은 것을 버퍼에 넣어놓는다고 하셨는데요. getchar은 띄어쓰기도 하나의 문자로 입력 받는 것을 볼 수 있었습니다. 예를 들면 ab c를 입력 했을 때 a/b/ /c 이렇게 네 개가 입력이 되듯이 말이죠. 그렇다면 scanf도 scanf("%d %d", &rows, &cols); while (getchar() != '\n') continue; 에서 예를 들어, 5 2라고 입력 받았다면 5/ /2 이렇게 띄어쓰기를 포함해 세 개를 입력 받게 될텐데요. 이때는 띄어쓰기가 두번째 %d로 들어가지 않고 띄어쓰기를 무시하고 2가 대신 들어갑니다. 이전의 다른 분 질문 답변에서 "scanf는 %c 로 받지 않는 이상은 whitespace를 무시합니다. " 라고 하셔서 무시한다는 것은 알았습니다. 그런데 이와 같이 무시하는 것이 입력받은 것과 scanf에서 입력받은 %(자료형)이 서로 맞지 않을 경우, whitespace 뿐만 아니라 모두 무시하는 것인가요? 아니면 특별히 whitespace만 무시하는 것인지 궁금합니다. 감사합니다!
The bean 'holoman', defined in class path resource [me/whiteship/HolomanConfiguration.class], could not be registered. A bean with that name has already been defined in com.example.myautoconfigapply.MyautoconfigapplyApplication and overriding is disabled. 라고 에러가 뜨는데요.. Bean생성하는 함수가 재정의 되어서 안되는거 같아서 자동설정 적용하는 프로젝트의 Bean생성 함수명을 바꿔주니까 강의내용대로 값은 자동설정파일대로 나오지만 에러는 안뜨고 잘되긴하네요.. 제 스프링부트 버전이 재정의가 안되는건가요?