Day9
상속 중 has-a 관계
다중상속은 위험하므로 다중상속이 필요할 때 소유 상속으로 대처한다 https://gameprogrammingpatterns.com/contents.html Actor - 여러개의 컴포넌트 소유, 소유한 컴포넌트들이 해당 클래스를 역으로 설명한다
연산자 오버로딩
- 연산자도 똑같은 함수임을 기억할 필요가 있다
Point p3 = p1 + p2;=p1.operator+(p2)
.과 -> 차이?
.은 객체에 직접 접근할 때 사용->는 포인터를 통해 멤버에 접근할 때 사용
라이브러리
결국 모듈들이 이진코드로 변환됨 함수를 실행하려면 함수의 명세가 담긴 헤더 파일은 꼭 있어야 함
.lib
실행될 때만 분리돼있고, 컴파일 단계에선 아예 exe에 합쳐진다
- 코드베이스 덩치 커지므로 메모리 부담이 됨
.dll
런타임에 동적으로 끌어와 사용하기 때문에 배포할 때도 분리돼있어야 함
- 가벼움
- 실행 중에 dll 메모리 공간에 접근해 자원을 가져와야 함
- 메모리 점프할 때마다 os의 허가를 받아야 하는 등 속도가 느림 dll 추출하기
xcopy .\Bin\x64\Debug\Engine\Engine.dll .\Library\Engine\x64\Debug\ /e /y를.bat파일로 만들기 -> 파일 호출만으로 실행가능- ...
dll이 성공적으로 링킹되려면 exe와 같은 위치에 있거나
LoadLibraryA()
static
- 전역변수에 static 붙이면
// Static.h#pragma oncestatic int variable = 0;// File1.cpp#include "Static.h"void FileOneFn(){ ++variable;}// File2.cpp#include "Static.h"void FileTwoFn(){ ++variable;}// File1, variable 1// File2, variable 1// variable 공유 안됨- 공통 전역변수를 쓰고 싶으면
extern키워드를 붙여야 한다
// Static.hextern int variable;// File1.cpp#include "Static.h"void FileOneFn(){ ++variable;}// File2.cpp#include "Static.h"void FileTwoFn(){ ++variable;}// File1, variable 2// File2, variable 2// variable 공유됨- 지역 변수를 static 붙이면
void IncreaseCount(){ static int count = 0; ++count;}int main(){ IncreaseCount(); IncreaseCount(); IncreaseCount();}// Count: 1// Count: 2// Count: 3- 클래스에서 static 변수 쓸 때
class Person{private: char* name; int age; static int count; // static 멤버 변수 선언. }; // static 멤버 변수 초기화. // static 변수는 객체에 종속되지 않기 때문에 따로 초기화를 진행해야 한다. int Person::count = 1;- static 멤버의 특징
- main 함수가 호출되기 전에 메모리 공간(데이터 영역)에 올라가서 초기화된다. 따라서 public으로 선언이 된다면 객체 생성 이전에도 접근이 가능하다.
- 객체의 멤버로 존재하는 것이 아니다. 다만, 선언되어 있는 클래스 내에서 직접 접근할 수 있는 권한이 부여된다. (Person 안에서
Person::생략 가능) - 객체에 멤버로 존재하지 않기 때문에 생성자에서 초기화할 수 없다. 따라서 별도의 static 멤버 초기화 문법을 사용해 초기화를 진행해야 한다.