오진이 블로그

[제프리 리처의 CLR via C#] 모든 타입은 System.Object를 상속한다 본문

Development/C#

[제프리 리처의 CLR via C#] 모든 타입은 System.Object를 상속한다

오늘도 진이 2021. 4. 2. 17:16

2부. 타입 설계

4장. 타입의 기초

  • 타입들을 다루기 위한 기본적인 사항
  • 공용 언어 런타임
  • 모든 타입들 간의 최소 공통 분모
  • 타입 안정성, 네임스페이스, 어셈블리, 그리고 어떤 객체를 다른 객체 타입으로 캐스팅(Casting) 하는 방법
  • 타입, 객체, 스레드, 스택, 그리고 관리되는 힙이 실행 시점에 어떻게 한데 어우러져 시스템을 형상하는지에 대한 설명
  • 모든 타입은 System.Object를 상속한다
    • 모든 타입들은 궁극적으로 System.Object 타입으로부터 파생되는(Derived) 것으로 하고 있다.
    • CLR은 모든 객체들을 반드시 new 연산자에 의하여 만들도록 하고 있다.
    • new 연산자가 하는 일
      1. 할당하려는 타입과 별도의 인스턴스가 없는 System.Object 타입을 포함한 그 위의 모든 기본 타입들에서 정의된 모든 인스턴스 필드들을 메모리에 할당하기 위한 바이트 수를 계산한다. 힙상의 모든 객체에는 별도의 추가적인 멤버로, 타입 객체 포인터(Type Object Pointer)와 동기화 블록 인덱스(Sync Block Index)가 추가되며 CLR에 의해 객체를 관리하기 위하여 사용된다. 이 추가 멤버들을 위한 바이트는 객체의 실제 크기에 포함된다.
      1. 지정된 타입의 할당에 필요한 바이트의 수만큼 관리되는 힙으로부터 객체를 위하여 메모리를 할당하며, 처음 할당할 때에는 모든 바이트를 0으로 초기화한다.
      1. 객체의 타입 객체 포인터와 동기화 블록 인덱스 멤버를 초기화한다.
      1. 클래스 타입의 인스턴스 생성자와 인수가 new 연산자에서 서술한 대로 전달된다. 각각의 호출되는 생성자는 타입에 의하여 정의된 인스턴스 필드들을 초기화해야 한다. 호출되는 생성자는 상속 관계에 따라 거슬러 올라가 종국에는 System.Object의 생성자를 부르게 되며, 이 생성자는 하는 일 없이 반환된다.
    • new 연산자에 의하여 모든 작업이 실행되면, 새로 만들어진 객체의 참조(또는 포인터)를 반환한다.
    • new 연산자에 대응되는 delete 연산자는 존재하지 않으며 명시적으로 객체의 메모리를 할당 해제할 방법이 없다.
    • 가비지 컬렉션 기반의 메모리 관리를 사용하기 때문에 사용되지 않는 객체들을 자동으로 추적하고 이러한 객체들의 메모리를 해지하여 사용 가능한 메모리 공간을 회수하는 일을 자동으로 처리한다.
Comments