[이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해] 섹션 0 ~ 2 정리글
섹션 0~2 정리
본 강의는 인프런에 있는 이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해로 유료 강의이기 때문에 강의 내용 그대로를 업로드 하지 못해 무엇을 배웠는지만 간략하게 기재하겠습니다.
여기는 뭘 배웠는지만 간단히 정리하고 개인 노션에는 꼼꼼히 공부한 내용 정리했습니다!!
이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해 강의 - 인프런
섹션 0
섹션 0에서는 언리얼 프로그래밍이 게임 개발자에게 있어 어떠한 가치가 있는 지, 왜 공부를 해야 하는 지에 대해 배웠습니다.
자체 엔진을 쓰던 모 회사도 언리얼 엔진이 버전 업 하면서 언리얼으로 넘어간다는 사례를 들면서 언리얼 엔진을 잘 다룰 줄 아는 개발자의 수요가 늘어날 것을 예측할 수 있었는데 여기서 중요한 것은 실력이 있는 언리얼 개발자가 되어야 한다는 얘기입니다.
언리얼은 C++를 사용하기에 ‘(일반)C++만 알면 언리얼 개발할 수 있는거 아니야?’라고 생각하는 사람이 있겠지만 아시다시피 일반 C++는 오래 전에 나온 객체 지향 언어로 성능적인 면에서는 우수하지만 후발 객체 지향 언어(Java,C#)에 비해 안정성은 보장 못해 현재까지 개선 하고 있지만 관리하기 힘든 어려움이 있습니다.
그래서 언리얼은 C++에 새로운 규칙들을 추가해 자신들만의 C++(언리얼 C++)를 만들었고 우리는 사실상 일반 C++과 언리얼 C++ 두 가지를 완벽하게 이해해서 게임 콘텐츠를 제작해야 한다!
그래서 실력있는 언리얼 개발자가 되기 위해 파트 1에서는 언리얼 C++의 내부 동작 원리를 보고 실습하며 공부해보자
섹션 1
1강
1강에서는 언리얼 엔진의 설치, 에디터 설정, 비주얼 스튜디오 설정 등의 작업을 거쳐 실습 할 준비를 했습니다.
C++ 클래스 생성(GameInstance) 후 프로젝트 세팅, 언리얼 엔진 컴파일 시 주의 사항(헤더 파일 고칠 경우 에디터 끄고 빌드, 소스 파일만 변경했을 경우 에디터에서 라이브 코딩)을 배웠습니다.
GameInstance를 부모 클래스로 해서 자식 클래스를 만들고 부모 클래스에 있는 가상 함수를 오버라이드해서 재구현하는 경우 많이 하는 실수를 방지하는 방법을 배웠습니다.
언리얼 에디터에서 매크로를 사용해 로그를 남기는 법, 로그 카테고리 별 보기를 배웠습니다
2강
2강에서는 언리얼 C++의 코딩 규칙(표준)을 언리얼 공식 문서를 보며 다뤘습니다.
코딩 표준이 무엇인지, 왜 지켜야 하는지, 어떻게 지켜야 하는지를 보고 문서를 보았습니다.
언리얼 C++의 명명 규칙, 다양한 접두사 사용, 언리얼 C++에서 쓰는 타입이 일반 C++와 다른 이유, Const의 중요성, 최신 C++ 문법 등 이 외에도 다양한 코딩 규칙들이 있는데 공식 문서를 통해 이해하면 편하겠습니다.
3강
3강에서는 언리얼 C++의 기본 타입과 문자열에 대해 알아보겠습니다.
언리얼 C++가 일반 C++의 기본 타입을 안 쓰고 새로 기본 타입을 지정한 이유를 알아봤는데 강사님이 하신 말을 통해 유추한 바로는 게임 개발 시에는 명확한 데이터 타입이 성능 향상에 도움이 되는데 int 타입이 플랫폼 별로 다를 수 있기에 애매 모호함이 있어서 그런 것 같습니다.
언리얼 C++의 여러 타입들을 보며 어떨 때 사용하고, bool 타입 선언할 때 주의할 점을 알아봤습니다.
언리얼 C++에서 사용하는 문자열도 따로 지정되어 있는데 그 배경과 이유를 설명 들었고 이제 어떻게 처리하는 지를 공식 문서(캐릭터 인코딩)를 통해 알아보았습니다.
실습을 통해 TCHAR 타입, FString 타입을 만나봤고 어떻게 사용하는 지도 로그를 출력해보며 확인했습니다.
다음 FString 클래스의 공식 문서를 보며 FString이 어떤 클래스인지, TEXT 매크로를 사용해 FString으로 변환하는 과정, FCString은 무엇인지에 대해 알아보았습니다.
그 후 FName은 무엇인지, 어떤 특징이 있는지, 언제 쓰는지를 배우고 공식 문서를 통해 자세히 살펴보았습니다.
4강
4강에서는 언리얼 오브젝트에 대해 배웠습니다.
게임 프로그래밍에서의 C++의 사용, C++의 단점과 Java,C#의 등장으로 바뀐 점을 알아보았고 모던 객체 지향 설계의 5가지 원칙, 후발 언어들이 보완한 새로운 기능을 보며 언리얼 엔진이 이를 어떻게 받아들였는지 간략히 알아봤습니다.
그래서 언리얼 오브젝트라는 언리얼 C++만의 독특한 객체 시스템이 등장했는데, 공식 문서를 통해 자세히 알아봤습니다.
언리얼 오브젝트의 생성과 CDO, 리플렉션 등 여러 중요한 특징을 배웠고 언리얼 오브젝트를 생성하고 헤더 파일에 있는 include 문, 여러 매크로,특히 GENERATED_BODY가 어떻게 작동하는지를 배웠습니다. 언리얼 헤더 툴이 무엇을 하는지도 알면 좋을 것 같아요.
5강
5강에서는 리플렉션을 처음 만나봤습니다.
리플렉션이 무엇인지, 언리얼 엔진에서 어떻게 리플렉션을 할 수 있는지(매크로를 통해 UHT가 소스 코드 생성), UPROPERTY 매크로가 하는 일을 배웠습니다.
언리얼 오브젝트의 변수와 함수를 관리하는 매크로는 무엇인지, 언리얼 오브젝트를 생성할 때는 NewObject API를 사용해야 합니다.
언리얼 클래스 정보에 CDO라고 하는 클래스의 기본 값을 보관하는 객체가 있는데 CDO의 용도, 이를 얻어오는 함수를 배웠습니다.
언리얼 오브젝트를 처리하는 공식 문서도 살펴보았는데, 직렬화나 메모리 관리 등 언리얼 오브젝트를 사용하면 좋은 점들을 봤습니다.
이후 실습을 통해 클래스 리플렉션, CDO 사용 방법, 생성 과정을 배웠습니다.
6강
6강에서는 5강에서 하던 리플렉션 실습을 이어나갔습니다.
클래스를 상속받고 사용할 때 헤더 파일, 소스 파일에서의 include 문의 규칙과 NewObject 함수를 이용해 언리얼 오브젝트를 생성하는 법을 배웠습니다.
위에서 만든 객체의 프로퍼티를 조회하는 법을 Getter, Setter 함수로 얻어오는 법, 언리얼 엔진이 제공하는 리플렉션 시스템을 이용해 얻어오는 법을 사용해봤습니다.
변수 뿐만 아니라 함수도 리플렉션을 이용해 호출해봤습니다.
섹션 2
7강
7강에서는 언리얼 C++ 인터페이스를 다뤘습니다.
인터페이스가 무엇인지, 언제 활용하는지를 배웠고 언리얼 C++ 인터페이스만의 특징을 배웠습니다.
언리얼 C++에서 인터페이스를 생성하면 클래스가 두 개 생성되고, 각 클래스마다 용도가 다릅니다
그리고 Java와 C#과 달리 인터페이스의 구현이 가능하다는 점도 있습니다.
8강
8강에서는 컴포지션에 대해 배웠습니다.
컴포지션이 무엇인지, 객체 지향 설계에서 컴포지션이 필요한 이유를 배웠습니다.
실습 예제를 통해 컴포지션을 구현해봤습니다.
컴포지션을 구현하는 방법은 CDO에 언리얼 오브젝트를 미리 생성하거나 빈 포인터만 두고 런타임에 생성하는 두 가지 방법을 배웠고 실습에선 후자를 선택해 구현했습니다.
컴포지션에서는 포함하냐 포함되냐에 따라 쓰는 용어가 있습니다.
9강
9강에서는 객체 간 느슨한 결합을 가능케 하는 델리게이트에 대해 다뤘습니다.
강한 결합과 느슨한 결합 각각에 대해 그리고 느슨한 결합으로 구현할 시 장점이 있습니다.
느슨한 결합을 구현하기 위해 함수를 다루는 방법을 생각해봤습니다.
공식 문서를 통해 델리게이트를 자세히 보고 델리게이트의 선언, 종류(1대 몇인지, 에디터 연동 할 것인지 등), 바인딩, 실행에 대해 알아봤습니다.
발행 구독 디자인 패턴의 설명, 구현 시 장점을 설명했습니다.
언리얼에서 델리게이트 선언 시 고려할 점을 보고 매크로를 어떻게 해서 선언해야 할지 배웠습니다.
그리고 실습을 통해 델리게이트를 통해 이벤트를 발행하고 구독하는 방법을 배웠습니다.