Day8
굳이 힙 스택이 필요하지 않으면 동적할당하지 않고 스택변수로 남긴다. 만약 스택 용량의 한계가 느껴진다면 힙 스택을 고려.
type
자식 클래스는 부모 클래스를 상속받는다. 이 때 자식 클래스는 언제나 부모 클래스로 upcasting 형변환이 가능하다.
메모리 관점: Player가 x, y, name 변수를 가지고 있을 때, Entity로 형변환하면 x, y만 쓰기로 한다.
private: int x int y char* namePlayer는 4+4+8 = 16byte 메모리를 가지고 있는데, Entity로 형변환하면 4+4 = 8byte로 줄어드는 것이다
Dependency Injection pattern
객체가 메모리를 직접 관리해야하는데, 그러지 않고 외부로부터 객체가 필요한 리소스를 주입받는 구조. -> 당연한거 아닌가? 오히려 객체가 사용하는 모든 변수를 메모리관리를 위해 가지고 있으면 불필요한 의존성을 가지게 되는 것 아닌가? '나'라는 객체에 '컴퓨터' 객체가 포함되는게 더 이상하지 않나
upcasting
int main() { Person* person1 = (Person*)(new Person()); // 원랜 형변환 해줘야하나 안전하기 때문에 생략해도 무방 Person* person2 = new Student(); Person* person3 = new PartTimeStudent(); person1->Sleep(); person2->Sleep(); person3->Sleep(); }RunTime Type Information
int main() { Person* person3 = new PartTimeStudent(); person3->Sleep(); //person3->Study(); // 오류 발생. //person3->Work(); // 오류 발생. }- 객체 포인터는 자신이 가리키는 메모리 공간에 관계 없이 기본적으로 자신의 타입에 정의된 함수 및 변수에만 접근이 가능하다.
- 즉, person3가 가리키는 메모리 공간은 PartTimeStudent이지만, person3 포인터의 타입이 Person이기 때문에 Person 클래스의 함수에만 접근이 가능한 것이다.
- C++의 RTTI는 느리다(해당 메모리 공간에 바꾸려는 타입의 자원이 존재하고 있는지 확인해야하기 때문에)
Polymorphism
virtual ~ override 키워드가 붙으면 해당 객체 아래에 vtable 메모리가 잡힌다. 또한 상속 구조 내에서 어떤 함수를 호출해야하는지 (순차)검색하는 코드가 추가된다. = 약간의 성능 저하 발생 가능, 현대에 와선 무시할 수준.
다형성을 활용해 자식 개체 만들고 소멸시킬 때
int main(){ Person* person1 = new Student("A", "B"); delete person1;}// ~Student() called 호출안됨 -> "B"만큼 메모리 누수 발생// ~Person() called위 상황을 피하려면 부모 소멸자에 virtual 키워드를 붙여주면 된다
class Person{public: virtual ~Person()}Interface
서로 다른 두 객체가 소통하는 최소 공통분모만 포함된 통로.