- 모든 타입은 System.Object를 상속한다.

class Derived {
	...
}
class Derived : System.Object {
	...
}

위의 두 Class는 같은 코드이다. 이와 같은 약속으로 모든 타입은 System.Object의 public 메서드, protected 메서드를 그냥 사용할 수 있고, override 하여 사용할 수도 있다.

아래 표는 System.Object의 메서드 표이다.

Public 메서드 설명
Equals 인수 인스턴스와 동일한 값을 가지는 경우 true 아니면 false 를 반환 한다.
ToString 현재 타입의 전체 이름을 문자열로 반환한다.
override하여 객체의 상태  또는 테스트 코드 등으로 사용하는데 현재 스레드와 연결된 CaltureInfo의 설정에 따라 적절한 지역 설정을 반영하여 반환하는 것이 좋다고 한다.
GetHashCode 객체의 값으로부터 해시 코드를 만들어 반환한다. Dictionary와 같이 해시 테이블 컬렉션에서 해당 객체를 사용하기 위해서는 override하여 해시 키값의 유일성을 만족하는 함수를 작성 해야한다. 
GetType GetType 메서드를 호출하기 위하여 사용된 객체의 타입을 설명하는 Type이라는 타입으로 부터 파생된 객체의 인스턴스를 반환한다. 여기서 반환되는 Type객체는 객체의 타입의 관한 메타데이터를 가지고 있으며 이를 사용하기 위해 Reflection 클래스들과 함께 활용할 수 있다. 비가상 메서드이며 이는 타입에 대한 정보를 속이거나 잘못 전달하여 타입 안정성을 위반하지 않도록 예방한 것이다. 
Protected 메서드 설명
MemberwiseClone 비가상 메서드로 현재 인스턴스와 동일한 타입, 동일한 값을 모드 재할당하여 생성된 인스턴의 포인터를 반환한다.
그냥 Clone 기능이라 보면 편하다.
Finalize GC가 해당 객체는 더이상 어디에서도 참조 되지 않고 사용하지 않는다고 판단하고 이 객체에 대한 메모리 공간을 회수하는 요청이 들어왔을때 호출 된다. 비관리 리소스를 가지고 있는 객체일 경우 재정의 해야한다.   

- 값 타입을 제외한 참조 타입은 모드 new 연산자를 통해 생성한다.

Employee e = new Employee("Hong")

위와 같은 명령어가 발생하면 CLR은 아래와 같은 순서로 진행시킨다.

1. 할당하려는 타입(System.Object를 포함)하여 정의된 모든 필드들을 메모리에 할당하기 위한 바이트 수를 계산한다.

2. 별도의 타입 객체 포인터(Type Object Pointer)와 동기화 블록 인덱스(Sync Block Index)가 추가되며 이는 CLR에 의해 객체를 관리하기 위해 사용되며 추가된 멤버 값들은 실제 객체의 크기에 포함된다.

더보기

🎫계산된 Byte의 수

System.Object 필드

Emplyee 필드

Type Object Pointer

Sync Block Index

3. 계산된 Byte의 수만큼 관리되는 힙으로부터 객체를 위하여 메모리를 할당하며, 처음 할당할 때에는 모든 Byte를 0으로 초기화한다.

4. 타입 객체 포인터, 블록 인덱스 멤버를 초기화한다.

5. 생성자와 인수(Hong)가 Employee 생성자 중 일치하는 인수 형태를 지닌 생성자가 실행된다. 위와 같은 경우는 Emplyee(string strNmae)이 되겠다. 상속받은 객체가 있다면 상속받은 Super Class의 생성자부터 실행되겠다.

6. 특이하게도 생성자의 마지막은 System.Object의 생성자를 부르게 되며, 이 생성자는 하는 일 없이 반환된다.

7. 모든 작업이 끝나면 생성된 객체의 포인터를 반환한다.

 

C#의 객체를 사용하는 우리는 알게 모르게 객체의 포인터를 다룬 것이다. 

그래서 일반적인 함수에 인수가 객체일 경우 Call by Reference를 사용하게 됐다.

 

결론

- 모든 타입은 System.Object를 상속받는다.

- new 연산자는 모든 초기화를 완료한 후 객체의 포인터를 반환시킨다.

 

'Program > C#' 카테고리의 다른 글

const 상수  (1) 2020.12.20
값타입의 박싱과 언박싱  (1) 2020.12.14
값 타입, 참조 타입  (0) 2020.12.13
네임스페이스와 어셈블리  (1) 2020.12.05
타입에 대하여2  (0) 2020.12.02

+ Recent posts