Unreal 강의

2일차 (12/12)

루인엘다 2023. 12. 12. 07:55
게임 업계에서 개발자로 일하려면 배워야하는 프로그래밍 언어

대부분 C++을 사용한다. 그 외가 있다면 C#(Unity)정도.

  • 언리얼 = C++
  • Unity = C++로 만들어진 엔진에 mono(라이브러리)라는 C#을 C++코드로 변형해주는 기능의 번역기가 달려있다.
  • 그 외 자체 엔진 = C++ 
C++을 사용하는 이유

C++을 주로 사용하는 이유는 응답속도가 빨라서이다. 

 

세대가 높아질수록 편의성과 더 빨리 만들 수 있는 생산성은 올라가지만 하드웨어에 직접 간섭할 수 있는 권한은 잃어버린다.

 

보다시피 low level일수록 보이는 코드라인은 많아진다. 하지만 고급언어는 결국 기계어로 번역된다.

높은 세대의 언어일수록 기계어로 번역되면 코드라인이 더 많다. 그래서 절대로 속도면에서는 높은 세대의 언어가 low level에 가까운 언어들을 따라잡을 수 없다.

다른 프로그램들의 경우 응답속도가 조금 떨어지더라도 사용자가 불편하지 않지만 게임의 경우 응답속도에 민감한 사용자들이 대다수이다.

그래서 속력이 더 빠를 가능성이 매우 높은 C++이 주력이 되었다.

C++보다 low level인 C를 사용하지 않는 이유

게임은 큰 프로젝트이기 때문에 생산성이 매우 부족한 C는 사용하지 않는다.

C로 생산성을 갖추려면 밑에서부터 다 만들어야된다.(ex) 함수 등)

언어의 생산성은 무엇을 통해서 증가했는가?

기계가 아닌 인간을 위한 직관적인 문법일수록 증가한다.

C++의 역사

C++은 비야네 스트롭스트룹이 만든 프로그래밍 언어이다.

그가 C++을 만든 이유는 그의 생각에 당시 인텔에서 C교육을 통해 프로그래머들이 쏟아지면서 C를 제대로 사용하지 못하는 저급한 프로그래머들이 너무 많아졌다. 다들 수준이 너무 좋지 못하다고 생각한 그는 C보다는 느리지만 생산성이 좋고 사용하기 편한 C++을 만들었다.

C++이란?

성능과 생산성 사이에서 외줄타는 언어. 이 오묘한 벨런스 때문에 속력과 성능이 다 중요한 게임업계에서 사용하게 되었다.

그리고 따라쟁이. 예를 들면 JAVA에서 이런게 있데, 하면 어느샌가 C++에서 생길 때가 있다.


프로그램이란?

xxxx.exe가 프로그램이다.

그리고 xxxx.exe를 만드는 사람이 프로그래머이다.

 

Visual Studio는 exe파일을 만드는 것을 도와주는 프로그램.

게임 프로젝트

프로젝트는 프로그램과 다른 것.

예를 들면 Lol을 만든다고 할 때 현대 게임 프로젝트는 Lol.exe 라는게 끝이 아니다. 유지보수와 여러가지 도움을 주는 다른 .exe들도 만들어내야 한다.

그래서 다음과 같이 솔루션을 만들게 된다.

  • Lol프로젝트 => 비주얼스튜디오에서는 솔루션이라고 한다.
    • LolItemEditor.exe => Lol 게임내 Item을 만들고 데이터화시키는 exe 파일 => 프로젝트
    • LolCampEditor.exe => Lol 게임내 캐릭터를 만들고 데이터화시키는 exe 파일 => 프로젝트
    • Lol.exe => 그렇게 만들어진 Item과 캐릭터를 조작해서 실제 게임을 하는 게임 클라이언트파일 => 프로젝트

솔루션 파일만 있으면 Visual Studio를 켤 수 있다.

솔루션은 관리를 도와주는 것이지 exe파일을 만들어내지는 않는다.

솔루션이란 exe파일을 생성할 수 있는 Visual Studio의 프로젝트를 n개 모을수 있는 단위다.

프로그램을 만들기 위해서는 솔루션 아래 프로젝트를 추가해야한다.

 

프로젝트에는 여러 종류가 있다.

이 과정에서는 두개의 프로젝트 유형만 사용할 것이다.

위 그림의 상단에 있는 빈 프로젝트와 콘솔 앱만을 사용할 것이다.

제로베이스

숫자를 0부터 새는 것은 프로그래머의 기본

프로젝트명 등에 숫자를 사용할 때 0 1 2 3 4 5 보다는 000 001 002 003 004 005으로 만드는 것을 선호. 이전에는 이렇게 해야 정렬이 되었기 때문.

 


 

F5를 누르면 컴파일을 시작하여 exe파일을 생성

제대로된 프로그래머는 F5를 누르면 하단의 출력창을 확인해야한다.

남에게 질문할 때는 에러를 상대에게 보내면서 질문하는 것이 예의


일반적으로 지주얼 스튜디오에서 프로젝트 파일은 한번에 1개씩 실행되는 것을 원칙으로 한다.

프로젝트 명이 굵은 글씨의 프로젝트를 시작 프로젝트라고 하며 F5를 누르면 해당 프로젝트부터 실행된다.

시작프로젝트를 변경해서 exe를 생성할 프로젝트를 변경할 수 있다.

변경 후 F5를 눌러보면 기존의 이미 빌드된 프로그램 위치에 새로운 프로그램이 생성되어있다.

오른쪽의 메뉴를 누르면 Git창을 다시 열 수 있다.

코드란?

C++을 문법을 지켜서 어떠한 프로그램을 만드는 언어

아래의 내용이 문법이 정확하다면 F5를 눌렀을 시 컴파일 과정을 통해서 exe파일이 만들어진다.

전처리기

컴파일은 4가지 단계를 가진다. 그 중 첫번째는 전처리기이다.

전처리기를 이해하려면 전처리문을 이해해야하는데 전처리문은 컴파일이 되기전에 처리된다고 해서 전처리라고 한다. 이런 전처리 구문들을 전처리문이라 부른다.

  • 실제적인 코드와는 관련이 없는 것
    • //(한줄 주석) /* */(범위 주석) <= 주석
    • 설명, 첨삭, 메모 등의 역할
    • 전처리기는 이것이 실제 exe에 들어갈 내용이 아니라는 것을 알고 있어서 다 지워버린다.
    • 주석의 단축키 => Ctrl + K + C
  • 코드로 치환되어야하는 것
    • #include 등
    • 보통 코드로 치환되거나 의미를 가지는 전처리문은 #이 붙는다.

!include 스샷 사용

iostream => 확장자가 없어도 파일이다. 확장자는 인간이 구분하기 편하기 위해 넣는 것이다.

커서를 올리고 Ctrl + Shift + G를 누르면 해당 위치로 이동할 수 있다.

 

C++의 기반코드들은 윈도우가 전부 다 보관하고 있다. 그리고 그것을 Visual Studio가 사용하겠다는 설정도 이미 끝나있다.

#include

코드 치환 혹은 코드 복붙.


 

int main()은 프로그램이 시작되면 여기서 부터 시작한다고 약속한 것이다. (사실 main이 아니게 바꿀 수는 있다. 하지만 바꾸지 않는 것이 암묵적인 룰)

이 main함수를 다른 용어로 진입점이라고 말한다.

 

컴파일러를 이해하기 위해 main함수를 바꾸어보았다.

여기서 알 수 있는 것은 main의 본명이 main이 아니라 int__cdec invoke_main(void) ghrdms ?invoke_main@@YaHXZ이다.

우리가 main이라는 코드를 치면 컴파일러에서 어셈블러로 보낼 때 네임맹글링이라는 작업을 통해 본명으로 바꾸는 작업을 한다.

 

컴파일 과정을 통해 나온 exe를 더블클릭하면 깜빡이듯이 켜졋다가 사라지는데, 이것으로 Visual Studio가 F5를 누르면 이 과정을 해주고 있음을 알 수 있다.

하드에 있는 프로그램을 실행하면 램에서 프로세스가 된다. 그리고 코드를 실행하고 코드의 끝에 도달하면 램의 프로세스의 메모리를 삭제한다.

 

 

 

 

 

 

  • 프로그래밍의 첫번째 원칙 프로그래밍에 공짜는 없다. 모든건 비용을 지불해야한다. 여기서 지불 단위는 다음과 같다.

 

 

exe 파일의 크기
사용중인 메모리

67kb의 프로그램을 실행했는데 메모리에선 512kb를 사용중인 것을 볼 수 있다.

그 이유는 프로그램은 '내가 켜지면 ~~를 할거야'라는 식의 계획이지만 프로세스는 '여기 ~~가 있어'라는 결과물이기 때문이다.

이때 main의 역할은 프로세스를 시작한다는 행동이다. C++에서 이러한 행동은 함수라는 문법이라고 하고 때문에 main을 main 진입점 함수, 줄여서 main 함수라고 부른다.

행동은 C++에서 다음과 같은 문법을 지키도록 설계되어 있다.

  • (행동의 결과) (행동의 이름) (행동의 필요조건)
  • 리턴값             이름               인자
  • int                     main              ()
  • { 행동의 시작
  •       행동의 내용
  • } 행동의 끝

함수

함수 = 행동 = 내가 구현하고 싶은 일

함수의 이름과 함수들을 통해 프로그래밍을 통해 무엇을 만들고 싶은지 알 수 있는 것이 좋다.

프로세스가 시작하고 행동으로 표현하기 위해 함수로 만들어야한다.

 

리턴값

void = 아무것도 리턴하지 않겠다. (이 일이 벌어질 뿐이다.)

int = 정수형을 리턴하겠다. (이 일이 벌어지면 숫자가 1개 생긴다.)


변수

예를 들어 몬스터 1마리와 플레이어 1명이 싸우는 것을 표현하고 싶다.

이떄 싸움을 게임에서는 수치로 표현한다.

공격력 = 상태 = 변수

싸운다 = 행동 = 함수

 

이떄 중요한 점은 변수를 함수의 바깥에 놓는지 함수의 내부에 놓는지에 따라 문법이 약간 달라진다.

 

우선 함수의 내부에 놓을 경우

int Atk = 10; 이라고 할 경우

  • int =>자료형
  • Atk => 변수명
  • = => 연산자
  • 10 => 리터럴값
  • ;  =>

램의 프로세스의 구조
스택영역이 어떻게 사용되는지

10은 상수라고 하고 코드 영역에 올라갑니다.

 

int Atk = 10;

이것을 풀어 설명하자면 

  • 스택영역을 만들어라.
  • 스택영억에 Atk라는 공간을 만들어라.
  • Atk라는 공간에 넣어줄 10이라는 값을 코드영역에서 가져와라.
  • 코드영역에  존재하는 대입연산자와 연산 코드를 가져와라.
  • Cpu에서 Atk라는 좌측 메모리와 10이라는 우측메모리를 보내고 복사 연산자를 보내서 Atk라는 공간에 10이라는 값을 집어넣어라.

이렇게 설명할 수 있다.

 

스택영역에 실행할 것이 없다면 실행이 종료된다.

 

자료형

자료형은 크기와 타입의 의미를 가진다.

int의 경우 크기(4byte), 타입(정수)이다.

 

변수명

변수명은 위치를 의미한다.

램에서 어디에 존재하는 메모리가 사용되는지이다.

나중에 결국 위치한 곳을 뜻하는 숫자로 변한다. => 변수명은 바이트 번지라는게 되는 것.

  • 프로그래밍의 두번째 원칙 모든건 숫자로 변해야 한다.

프로그램의 번지는 실행된 후 뒤쪽으로는 늘어날 수 있어도 앞쪽으로는 늘어나지 못한다.

C++은 메모리 단위로 접근하는게 기본이다.


프로그래밍 시에 주의할 점
  • 에러를 잘 확인하거나 출력결과를 잘 확인하는 습관이 필요하다.
  • 프로젝트가 어느정도 진행되었으면 자주 커밋을 해야한다. 보통 2시간에 한번은 하는 것이 좋고 커밋은 웬만하면 에러가 안나는 상태로 커밋해야 한다.
  • 윈도우 단축키를 아는 것은 기본이다. 특히 메이저한 단축키들은 모르면 안된다.
  • 커뮤니케이션이란 명확한 이론적 설명, 논리적인 문법의 해석을 언제 누가 어느 부분을 물어보던 이야기 할 수 있어야한다.
  • C++에 대해 보충 공부를 할 때 우선시해야하는 사이트는
    • CPlusPlus.com
    • msdn(마이크로소프트 개발자 네트워크)
    • 위키백과 혹은 C++파워 유저 블로그 순이다. 블로그의 경우 날짜를 꼭 확인하자.

단축키
  • 주석의 단축키 => Ctrl + K + C
  • 코드에 커서를 올리고 Ctrl + Shift + G를 누르면 해당 위치로 이동할 수 있다.
  • 드래그 후 Alt + 위or아래 키 입력 시 드래그한 코드를 상하로 이동할 수 있다.