목록2021/12 (15)
KoreanFoodie's Study

이득우님의 "이득우의 언리얼 C++ 게임 개발의 정석" 책을 따라가며 실습한 내용을 정리한 포스팅입니다. 실습에 필요한 자료들은 이 링크에서, 제가 작업한 예제 소스 완성본은 여기에서 찾아보실 수 있습니다. (저는 언리얼 4.27.2 버전 기준으로 작업하였습니다) C++ 클래스 만들기 먼저, 가장 기본적인 C++ 클래스를 만들어 보자. 파일->New C++ Class를 선택하고, 모든 클래스를 표시한 뒤 Object를 선택한다. Object는 대화상자에 만들지만, C++ 코드에서 생성할 C++클래스는 UObject이며 대문자 U가 선행된다는 점을 참고로 알아두자. C++ 프로젝트를 열면, 다음과 같은 다섯지가 프로젝트의 빌드 구성을 볼 수 있다. 각 특징은 다음과 같다. DebugGame : 자세한 디버..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! C++ 스타일의 캐스팅 기존의 C 언어에서는 컴파일러가 알아서 캐스팅하는 암시적(implicit) 캐스팅과, 프로그래머가 직접 캐스팅하라고 지정하는 명시적(explicit) 캐스팅이 있었다. 하지만 C++에서는 다음과 같은 4가지의 캐스팅을 제공하고 있다. 1. static_cast : 우리가 흔히 생각하는, 언어적 차원에서 지원하는 일반적인 타입 변환 2. const_cast : 객체의 상수성(const)를 없애는 타입 변환. 쉽게 말해 const int가 int로 바뀐다. 3. dynamic_cast : 파생 클래스 사이에서의 다운캐스팅 4. reinterpret_cast : 위..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! friend 키워드 클래스 내부에서 다른 클래스나 함수들을 friend로 정의할 수 있는데, friend로 정의된 클래스나 함수들은 원래 클래스의 private로 정의된 변수나 함수들에 접근할 수 있다. class A { private: void DoSth() {}; int a; friend class B; friend void func(); } class B { public: void b() { A a; a.DoSth(); a.a = 1; } } void func() { A aa; aa.a= 2; a.DoSth(); } 위에서 friend로 지정된 클래스 B와 함수 func( )는..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! MyString의 '==' 연산자 오버로딩 이미 MyString class에서 compare함수를 만들었다면, 연산자 오버로딩은 간단히 구현할 수 있다. bool MyString::operator==(const MyString& str) { return !compare(str); } 대입 연산자 함수 복소수를 구현한 Complex 클래스에서 '=' 연산자 함수를 구현한다고 해 보자. Complex& Complex::operator=(const Complex& c) { real = c.real; img = c.img; return *this; } 왜 참조자(Complex &)로 값을 ..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! explicit 키워드 explicit 키워드는, 간단히 말해 암시적 형 변환을 허용하지 않을 때 붙여주는 키워드이다. 예를 들어, 이전에 만들었던 MyString 클래스에 다음과 같은 생성자와 함수를 추가한다고 가정해 보자. MyString::MyString(int capacity) { string_length = 0; string_content = new char[capacity]; memory_capacity = capacity; } void MyString::DoSomething(MyString s) {}; 만약, explicit이 없다면, 다음과 같은 호출은 정상적으로 작동..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 문자열 클래스 기존 C언어에서는 문자열의 마지막에 널 값('\0')을 삽입했다. C++에서는 표준 라이브러리로 string 클래스를 제공하고 있으므로, char* 대신 string을 사용하자! 직접 String Class를 만들어 보는 것은 좋은 연습이 된다. 필요 명세는 다음과 같다. 변수 : 문자열 길이, 문자열 내용, 사용하는 메모리 크기 메소드 : 생성자, 소멸자, insert, erase, find, reserve, assign, compare 더보기에 예제 코드를 넣어 놓았다. 더보기 모두의 코드에서 제시한 MyString 클래스 코드 예시 : #include // str..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 생성자의 초기화 리스트(initializer list) 간단한 예시 코드를 보자. class Test { int a; int b; Test(); } Test::Test() : a(1), b(2) {} 위의 예시에서, (생성자 이름) : var1(arg1), var2(arg2) ... 같은 형식을 써 주면, 생성자 호출과 동시에 멤버 변수들을 초기화해줄 수 있다. "동시에"라는 개념이 중요하다. 초기화 리스트를 사용하지 않으면 생성을 먼저 하고 그 다음에 대입을 수행하게 된다. 따라서, 초기화 리스트는 int a = 10; 와 같고, 일반 버전의 생성자는 int a; a = 10; 처..

모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 소멸자 클래스 생성자에서 만들어 준 자원은 객체가 소멸할 때 반드시 해제되어야 메모리 누수(memory leak)이 일어나지 않는다. #include class Marine { char* name; public: Marine(); Marine(const char* marine_name); ~Marine(); }; Marine::Marine() { name = NULL; } Marine::Marine(const char* marine_name) { name = new char[strlen(marine_name) + 1]; strcpy(name, marine_name); } Marine..

함수의 오버로딩 (function overloading) 함수의 오버로딩은, 인자로 들어오는 변수의 타입에 따라 이름이 같은 함수들 중 적합한 함수를 호출해 주는 것을 의미한다. 이때, 인자를 찾는 과정은 다음과 같다. 1 단계 : 자신과 타입이 일치하는 함수를 찾는다. 2단계 : 정확히 일치하는 타입이 없는 경우, 아래와 같은 형변환을 통해 일치하는 함수를 찾는다. Char, unsigned char, short 는 int로 변환된다. Unsinged Short는 int의 크기에 따라 int 혹은 unsigned int로 변환된다. Float는 double로 변환된다. Enum은 int로 변환된다. 3단계 : 위와 같이 변환해도 일치하는 것이 없다면 아래의 좀 더 포괄적인 형변환이 일어난다. 임의의 숫..

객체란? 객체는 인스턴스 변수(instance variable)과 인스턴스 메소드(instance method)로 이루어져 있다. 클래스 클래스는 객체를 찍어내는 '설계도'이다. 클래스 내부의 변수와 함수를 각각 멤버 변수(member variable)과 멤버 함수(member function)이라고 부른다. 멤버 변수와 함수는 접근 지정자를 설정할 수 있다. public : 외부에서 접근 가능 protected : 상속된 클래스만 접근 가능 private : 외부에서 접근 불가능 사실 C++에서 클래스와 구조체의 유일한 차이는 바로 접근 지정자에 있다!