티스토리 뷰

안녕하세요. 구스입니다.
요새 C#을 다시 재정리 하는 김에 관련 내용을 계속 업데이트 하네요.

오늘은 특정 클래스의 타입을 알아보는 방법에 대해서 이야기 해볼까 하는데요. 특정 어셈블리에서 보유하고 있는 타입의 상세 정보를 알기 위해서는 어떻게 해야 할까요?

예를 한번 생각해봅시다. 

Employee라는 클래스가 있다고 가정을 해봅시다. 특정 어셈블리 A에서 어셈블리 B에 포함되어 있는 Employee의 Instance(인스턴스)를 사용하고 있습니다. 개발자는 이러한 Instance를 사용하기 위해서는 어셈블리 B를 가져와야 하며(Load), 이를 통해서 Employee 클래스가 가지고 있는 멤버, 함수, 속성등을 사용할 수 있습니다.

 

또한 Employee 클래스를 생성하여 Instance화 한뒤 이에 대한 Employee에 포함된 함수를 사용할 수도 있습니다. Employee에 대한 상세 내용을 알기 위해서 C# 개발자들은 typeof와 GetType() 함수를 사용하고 있습니다.

그래서 이 글에서는 typeof와 GetType() 함수의 차이점에 대해서 생각을 해볼까 합니다.

 

1. typeof 키워드

 

 

typeof 키워드는 클래스 자체의 타입을 가져옵니다.
따라서 아래와 같이 구현이 된다면 t1은 Employee 클래스 자체가 되는 것이죠. 


System.Type t1= typeof(Employee); // Employee 자체가 타입으로 리턴됨

 

2. GetType()

 

 

하지만 GetType() 함수의 경우는 어떨까요?


일반적으로 GetType() 함수는 Object의 인스턴스에 대한 함수입니다. 이는 런타임 시 생성되는 인스턴스의 타입을 가져오게 되는 것입니다. 


즉 New 키워드를 통해서 생성된 특정 클래스의 Instance가 리턴이 된다는 것이죠. 따라서 2개의 인스턴스(이 글에서는 x,y)가 동일한 런타임 형식을 갖는다면 Object.ReferenceEquals(x.GetType(),y.GetType())의 경우 True를 반환합니다. 


Employee employee= new Employee();

System.Type t2= employee.GetType(); // Employee라는 클래스로 생성된 employee라는 Instance가 리턴됨

 

아래의 예제를 통해서 typeof와 GetType() 함수의 차이점에 대해서 명확히 이해해보도록 합시다.

 

class Animal { }

class Dog : Animal { }

 

void PrintTypes(Animal a) {

print(a.GetType() == typeof(Animal)) // false

print(a is Animal) // true

print(a.GetType() == typeof(Dog)) // true

}

 

Dog spot = new Dog();

PrintTypes(spot);

 

위의 코드에서는 Animal이라는 클래스와 Animal을 상속받은 클래스 Dog 클래스가 있습니다.
PrintType이라는 함수를 통해서 GetType가 typeof의 차이를 명확히 보여줍니다.

Dog 클래스를 통해서 spot이라는 Instance를 생성합니다.
그리고 이 spot Instance를 PrintType 함수의 매개변수로 전달합니다. spot은 Dog의 인스턴스입니다.

함수의 인자가 Animal이라고 해도, 따라서 첫번째 a.GetType()가 Animal의 GetType가는 다르죠. 따라서 False가 리턴이 됩니다.


함수의 인자가 Animal이고 Dog는 Animal을 상속받고 있기 때문에 is 키워드에서는 True가 리턴이 됩니다.


마지막으로 spot의 타입과 Dog의 타입은 동일하므로 True가 리턴이 됩니다.

 

이 글에서는 GetType() 함수와 typeof 키워드의 차이점에 대해서 알아보았습니다.

그럼 이만 줄이겠습니다.

이 글이 도움이 되셨으면, 아래의 하트를 눌러주세요.


댓글