클래스 인스턴스화
클래스 인스턴스화 (Class Instantiation)
클래스는 반드시 생성자 중 하나를 통해 만들어야 해요(생성자는 여러 개일 수 있어요). 기억할 점은 클래스는 힙에 있는 객체를 가리키는 포인터라는 거예요. 어떤 클래스의 변수를 선언하면 컴파일러는 전체 객체가 아니라 이 포인터만을 위한 공간을 할당합니다. 클래스의 생성자는 힙에서 초기화된 인스턴스를 가리키는 포인터를 돌려줘요. 그래서 어떤 클래스의 인스턴스를 초기화하려면 이렇게 하면 됩니다.
본문
ClassVar := ClassType.ConstructorName;
new와 dispose의 확장 구문으로는 클래스 인스턴스를 만들거나 파괴할 수 없어요. 그 구문은 객체(object) 전용이거든요. 생성자를 호출하면 가상 클래스 메서드 NewInstance가 호출되는데, 기본 구현에서는 GetMem을 호출해 클래스 인스턴스 데이터를 담을 충분한 공간을 할당한 뒤 메모리를 0으로 만듭니다. 그 다음 생성자 코드가 실행되고, 생성자는 Self에 자신의 데이터 포인터를 담고 있어요.
몇 가지 알아두면 좋은 점이 있어요.
{$PackRecords }지시어는 클래스에도 영향을 줘요. 각 필드의 메모리 정렬이 이 지시어의 값에 따라 달라집니다.- 객체와 레코드에서처럼 packed 클래스도 선언할 수 있어요. 객체나 레코드와 같은 효과인데, 요소를 1바이트 경계(가능한 한 빽빽하게)로 정렬한다는 뜻이에요.
SizeOf(class)는SizeOf(Pointer)와 같은 값을 돌려줘요. 클래스가 객체를 가리키는 포인터이기 때문이죠. 클래스 인스턴스 데이터의 크기를 얻으려면TObject.InstanceSize메서드를 쓰세요.- 생성자 실행 중 예외가 발생하면 소멸자가 자동으로 호출돼요.