본문 바로가기
프로그래밍/C#

C# is, as, typeof(), GetType() Type-testing 연산자에 대해서

by bantomak 2023. 4. 12.

is 연산자

is 연산자는 식 결과의 런타임 형식이 지정된 형식과 호환되는지 확인합니다. 결과값으로 true, false를 반환합니다.

Java에서는 동일한 기능을 제공하는 instanceof를 사용한다.

 

Syntax

expression is type

 

public class Base { }

public class Derived : Base { }

public static class IsOperatorExample
{
    public static void Main()
    {
        object b = new Base();
        Console.WriteLine(b is Base);  // output: True
        Console.WriteLine(b is Derived);  // output: False

        object d = new Derived();
        Console.WriteLine(d is Base);  // output: True
        Console.WriteLine(d is Derived); // output: True
    }
}

 

as 연산자

as 연산자는 식의 결과를 지정된 참조 또는 nullable 값 형식으로 명시적으로 변환합니다. 반환할 수 없는 경우 as 연산자는 null을 반환합니다. () 캐스트 식과 달리 as 연산자는 예외를 throw하지 않습니다. 결과값으로 해당 type으로 변환해서 반환합니다.

 

Syntax

expression as type

 

IEnumerable<int> numbers = new[] { 10, 20, 30 };
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
    Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]);  // output: 40
}

 

typeof 연산자

typeof 연산자는 컴파일 타임에 해당 타입을 반환합니다. 인자로 Type 그 자체를 받아서 인자의 표시된 타입을 반환합니다.

 

Syntax

System.Type type = typeof(int);

 

void PrintType<T>() => Console.WriteLine(typeof(T));

Console.WriteLine(typeof(List<string>));
PrintType<int>();
PrintType<System.Int32>();
PrintType<Dictionary<int, char>>();
// Output:
// System.Collections.Generic.List`1[System.String]
// System.Int32
// System.Int32
// System.Collections.Generic.Dictionary`2[System.Int32,System.Char]

 

GetType()

GetType() 메소드는 해당 인스턴스의 타입을 반환합니다. 다른 연산자들과 달리 GetType()은 메소드입니다.

System.Object에 정의된 메서드이므로 모든 .NET 형식을 나타내는 객체는 GetType() 메소드를 이용하여 Type을 반환 할 수 있습니다.

 

Syntax

public Type GetType ();

 

using System;

public class MyBaseClass {
}

public class MyDerivedClass: MyBaseClass {
}

public class Test
{
   public static void Main()
   {
      MyBaseClass myBase = new MyBaseClass();
      MyDerivedClass myDerived = new MyDerivedClass();
      object o = myDerived;
      MyBaseClass b = myDerived;

      Console.WriteLine("mybase: Type is {0}", myBase.GetType());
      Console.WriteLine("myDerived: Type is {0}", myDerived.GetType());
      Console.WriteLine("object o = myDerived: Type is {0}", o.GetType());
      Console.WriteLine("MyBaseClass b = myDerived: Type is {0}", b.GetType());
   }
}
// The example displays the following output:
//    mybase: Type is MyBaseClass
//    myDerived: Type is MyDerivedClass
//    object o = myDerived: Type is MyDerivedClass
//    MyBaseClass b = myDerived: Type is MyDerivedClass

 

함께 읽으면 좋은 글

 

Effective C# Item 3 : 캐스트보다는 is, as가 좋다

캐스트보다는 is, as가 좋다 C#은 정적 타이핑을 수행하는 언어다. 따라서 타입 불일치가 발생하더라도 컴파일러가 이를 걸러주기 때문에 런타임에 타입 검사를 자주 수행할 필요가 없다. 하지만

jettstream.tistory.com

댓글