TIL 2025.01.02 기록
0. 개요
마침내 25년도의 첫 수업이 찾아왔다.
24년에서 25년으로 넘어오며 아쉬운 감정은 많이 들지만.. 하루가 크게 바뀐 것은 없어서 여러가지 생각이드는 날이었다..
아무튼 오늘한 일정에 대해서 소개를 해보자면..
1. 알고리즘 특강 듣기
2. C++ 강의듣기(STL & 객체지향 프로그래밍)
3. 이번주 마지막 과제 작성하기
4. 플랫포머 게임 추가 구현하기
5. 이전 과제 피드백 & 전수면담 받기
이렇게 진행했다.
뭔가 C++이나 알고리즘은 깊게 찾아보면서 공부하지는 않았고, 대부분 언리얼을 만지면서 시간을 보냈다.
언리얼에 다시 손이 많이가게된 이유가 있는데,
1/1에 친척 동생들이 방문했어서 내가 만든 플랫포머 게임을 시켜봤다.
사실.. 그렇게 오랜시간 작업한 프로젝트도 아니었고, 블루프린트로만 만들었어서.. 크게 기대는 안했었다.
특히 나는 다양한 함정을 만들어보고, 다양한 기능들을 사용해보자..! 가 중점이었어서..
게임 플레이는 재미있을까?, 난이도는 적당할까?, 혹시나 버그는 없을까? 등등 다양한 걱정이 있었다.
하지만 동생들이 플레이하는걸 지켜보니, 내가 의도했던대로, 모든 기능들이 잘 작동하고, 또 이런 아웃풋들을 즐기는 동생들을 보니 너무 보람차고, 뿌듯했었다.
난이도는 보통으로 게임을 못하는 사람도 깰 수 있고, 잘하는 사람도 시간이 걸리게 만들어진 것 같았다. 클리어 시간이 평균적으로 20분 걸렸던거 같다.. 한 경우엔 2시간이긴 하지만..
아무튼 동생들이 게임을 플레이해 보면서 추가하면 좋을거 같은 부분, 수정해야할 부분, 맵 구조는 어떤지 등등 다양한 피드백을 해주었다.
때문에 다시 플랫포머 게임 만들기에 조금 손길이 많이 갔던 것 같다.
올해 첫날부터 이런 경험을 얻을 수 있었어서 너무 행복했었다..
내가 지금까지 해오고, 쌓아온 것들이 조금이나마 빛을 본 기분이었다.
또한, 다른 사람들이 직접 플레이하는 것을 보고, 피드백을 받는게 얼마나 재밌고, 기쁘고, 꼭 필요한 것인지 많이 깨달을 수 있었다. ㅎㅎ
1. 강의를 들으면서 추가로 알게된 것 & 궁금한 것 질문했던 것
STL
내부적으로 메모리를 효율적으로 관리해준다.
ㄴ> 해당 부분은 조금 더 찾아봐야 하지만, 단순히 메모리 할당, 반환만 해주는게 아닌것 같았다.
SOILD 원칙
ㄴ> 인터페이스를 활용해서 확장에는 열려있고, 수정에는 닫혀있는 설계를 해야한다는 원칙이다.
ㄴ> 이전에도 정리했던 적이 있는데, 결국 SOILD 원칙을 크게 보면 위처럼 설명할 수 있을 것 같다.
실제 업무에서 템플릿이 어떻게 사용될까?
언리얼의 경우 대부분 상속 관계로 클래스들이 잘 짜여져 있어서 템플릿을 크게 사용할 일이 많이 있지는 않을 것 같다고 하셨다.
사실 나도 템플릿이 어디에 쓰일지 감이 잘 안왔던게, 언리얼 클래스 구조는 깔끔하게 잘 짜여져있어서 액터단에서는 크게 사용할 일이 없을것 같았기 때문이다.
대신에 이런 경우엔 잘 활용할 수 있다고 하는데, 어떤 경우냐면
델리게이트를 관리하는 유틸함수를 만들때 등등 뭔가 우리가 직접 구현해 사용해야하는 유틸 시스템을 구현할 때는 템플릿을 괜찮게 사용할 수 있을 것 같다.
=> 언리얼 리플렉션에 포함이 안되어있는데, 만들어 사용해야할 때.
크게 본다면, 결국 템플릿은 공통된 것을 구현할 때 확장성이 필요한 부분이 있다면 설계해 사용하는 것이다..(로 생각한다.)
2. 배열 만들기 & 정렬 과제 피드백
1. 변수명 영어 철자 틀림.
ㄴ> 이전 프로젝트 때에도 영어 철자 때문에 한번 이야기가 나왔었는데.. 여전히 같은 실수를 해서 부끄럽기도 하고, 슬프다... ㅠ
2. 스네이크 표기법에서 파스칼 표기법으로 코딩스타일을 바꾸는것도 추천한다.
ㄴ> 언리얼 소스 코드도.. 스네이크 표기법으로 작성한 코드들이 있던데.. 근데 파스칼이 요즘 많이 쓰는 코딩 스타일인것 같긴했다..
ㄴ> 그리고 다른 친구한테도 들었던 내용중 하나라 한번 천천히 바꿔봐야겠다.
3. 나누기 연산을 할때 예외처리 생각하기
ㄴ> 미처 생각하지 못했었는데, 나누기를 할때 분모에 0을 넣을 수 있도록 해서 오류가 발생할 가능성이 있는 코드를 짰었다..
ㄴ> 항상 이런 작은 것들을 잘 체크하는 습관을 들여야할 것 같다.. (결과는 엄청 크니까.. ㅠ)
4. 입력을 받을 때 원하는 자료형이 들어오지 않으면 다시 입력 받도록 수정하기
ㄴ> 단순 과제 제출로만 생각했어서 여러가지 상황마다 예외를 크게 생각하지 않고 구현했었다.
ㄴ> 아무리 단순 과제라도 프로그래머인 만큼 실제 사용할 프로그램을 만든다 생각하고, 예외처리는 확실히 신경쓰는게 좋을 것 같았다.
5. 특정값을 입력 받아야만 프로그램이 종료되게 하기
ㄴ> 4.번과 마찬가지로 실제 프로그램이라면 특정 입력을 받아 프로그램이 종료되어야 하기에.. 이런식으로 설계했음 좋았을 것 같다.
ㄴ> 마치 WinApi나 DirectX 포플 처럼..
6. pointer를 사용할 때는 항상 null 가드 해주기
ㄴ> delete를 해줄땐 null 가드를 해주었지만, new로 할당받은 주소를 사용할 때엔 굳이 null가드를 안해주었었다.
ㄴ> 에초에 코드도 짧거니와 그 사이에 nullptr이 들어갈 일은 아에 없게 만들었기 때문이었다.
ㄴ> 하지만 크게 본다면, 그리고 나중에 협업을 할때를 생각하면 null가드는 신경써서 해주는게 좋을 것 같았다.
3. 블루 프린트를 이용해 퍼즐 구현하기
<퍼즐 종류>
1. 알맞은 색상 버튼에 큐브 올리기
총 5가지의 색상이 있고, 알맞은 큐브를 버튼 위에 올려두게 되면 다음 버튼색상의 큐브가 생성된다.
그렇게 다음 색상들을 쭉 진행하다보면, 미로 탈출구 문앞에 도달하게 되고, 마지막 버튼에 큐브를 올려두게 될 경우 문이 열린다.
또한 현재 진행 상황을 확인할 수 있도록, 문 옆에 다이얼을 만들어 눌리 버튼마다 해당 색상이 밝혀지도록 만들어두었다.
ㄴ> 나중에 UI도 만들게 된다면 UI로도 표시하면 좋을 것 같다.
2. 레이저 퍼즐
레이저가 한 지점에서 쏴지고, 거울을 회전해 레이저를 반사시키고, 다양한 블럭들을 활용해 레이저가 갈라지거나 꺾이면서 목표 지점에 연결되도록 하는 퍼즐을 구현하고자 한다.
<구현한 기능>
1. 그래버 추가
ㄴ 큐브를 옮길 수 있도록 물체를 집을 수 있는 그랩 기능을 만들어 주었다.
ㄴ 원래는 큐브를 집어 드는 애니메이션도 만들어보려 시도했지만, 어우.. 이건 너무 욕심히 과한것 같아서 우선은 후순위로 미루었다.
2. 버튼 만들기
ㄴ Tag를 설정해 Tag가 맞는 큐브를 올려두어야지만 동작하도록 구현했다.
3. 열리는 문 만들기
ㄴ 액터 레퍼런스들을 이용해 기능들을 연결해주었다..
ㄴ 이런 방법말고 다른 좋은 방법이 있을것 같은데.. 고민해봐야겠다.
ㄴ 애초에 C++로 하는게 훨씬 편했을거 같다.. ㅠ BP..
4. 레이저 구현하기
ㄴ이전처럼 단순 형광봉을 이용해 만든 레이저가 아니라 좀 더 괜찮은 레이저를 만드는 것을 목표로 했다.
ㄴ 아직 레이저 구현중이다.. 레이저의 경우 스포너, 레이저, 타겟까지 구현했다.
ㄴ 내일은 기능적으로 연결해 퍼즐을 완성하는걸 목표로 해볼 생각이다.
<참고 영상>
4. 마무리