프로젝트공부아이디어
    • 2월
    • 1월
  • 30

    26. 1. 30.

  • 29

    26. 1. 29.

  • Day9

    26. 1. 27.

  • Day8

    26. 1. 26.

  • Day5

    26. 1. 23.

  • Day1

    26. 1. 22.

  • Day2

    26. 1. 22.

  • Day3

    26. 1. 22.

  • Day4

    26. 1. 22.

로딩 중...

Day8

2026. 1. 26.

굳이 힙 스택이 필요하지 않으면 동적할당하지 않고 스택변수로 남긴다. 만약 스택 용량의 한계가 느껴진다면 힙 스택을 고려.

type

자식 클래스는 부모 클래스를 상속받는다. 이 때 자식 클래스는 언제나 부모 클래스로 upcasting 형변환이 가능하다.

메모리 관점: Player가 x, y, name 변수를 가지고 있을 때, Entity로 형변환하면 x, y만 쓰기로 한다.

C++
private:	int x	int y	char* name

Player는 4+4+8 = 16byte 메모리를 가지고 있는데, Entity로 형변환하면 4+4 = 8byte로 줄어드는 것이다

Dependency Injection pattern

객체가 메모리를 직접 관리해야하는데, 그러지 않고 외부로부터 객체가 필요한 리소스를 주입받는 구조. -> 당연한거 아닌가? 오히려 객체가 사용하는 모든 변수를 메모리관리를 위해 가지고 있으면 불필요한 의존성을 가지게 되는 것 아닌가? '나'라는 객체에 '컴퓨터' 객체가 포함되는게 더 이상하지 않나

upcasting

C++
int main() { 	Person* person1 = (Person*)(new Person()); // 원랜 형변환 해줘야하나 안전하기 때문에 생략해도 무방	Person* person2 = new Student();	Person* person3 = new PartTimeStudent();	person1->Sleep(); 	person2->Sleep(); 	person3->Sleep(); }

RunTime Type Information

C++
int main() { 	Person* person3 = new PartTimeStudent();	person3->Sleep(); 	//person3->Study(); // 오류 발생. 	//person3->Work(); // 오류 발생. }
  • 객체 포인터는 자신이 가리키는 메모리 공간에 관계 없이 기본적으로 자신의 타입에 정의된 함수 및 변수에만 접근이 가능하다.
  • 즉, person3가 가리키는 메모리 공간은 PartTimeStudent이지만, person3 포인터의 타입이 Person이기 때문에 Person 클래스의 함수에만 접근이 가능한 것이다.
  • C++의 RTTI는 느리다(해당 메모리 공간에 바꾸려는 타입의 자원이 존재하고 있는지 확인해야하기 때문에)

Polymorphism

virtual ~ override 키워드가 붙으면 해당 객체 아래에 vtable 메모리가 잡힌다. 또한 상속 구조 내에서 어떤 함수를 호출해야하는지 (순차)검색하는 코드가 추가된다. = 약간의 성능 저하 발생 가능, 현대에 와선 무시할 수준.

다형성을 활용해 자식 개체 만들고 소멸시킬 때

C++
int main(){	Person* person1 = new Student("A", "B");		delete person1;}// ~Student() called 호출안됨 -> "B"만큼 메모리 누수 발생// ~Person() called

위 상황을 피하려면 부모 소멸자에 virtual 키워드를 붙여주면 된다

C++
class Person{public:	virtual ~Person()}

Interface

서로 다른 두 객체가 소통하는 최소 공통분모만 포함된 통로.

왼쪽 화살표2327오른쪽 화살표