형식 테스트 및 캐스트 연산자(C# 참조)Type-testing and cast operators (C# reference)

다음 연산자를 사용하여 형식 검사 또는 형식 변환을 수행할 수 있습니다.You can use the following operators to perform type checking or type conversion:

is 연산자is operator

is 연산자는 식 결과의 런타임 형식이 지정된 형식과 호환되는지 확인합니다.The is operator checks if the runtime type of an expression result is compatible with a given type. C# 7.0부터, is 연산자는 식 결과에 패턴이 있는지도 테스트합니다.Starting with C# 7.0, the is operator also tests an expression result against a pattern.

형식 테스트 is 연산자가 포함된 식의 양식은 다음과 같습니다.The expression with the type-testing is operator has the following form

E is T

여기서 E는 값을 반환하는 식이고, T는 형식 또는 형식 매개 변수의 이름입니다.where E is an expression that returns a value and T is the name of a type or a type parameter. E은 무명 메서드 또는 람다 식일 수 없습니다.E cannot be an anonymous method or a lambda expression.

E is T 식은 E의 결과가 null이 아니고 참조 변환, boxing 변환 또는 unboxing 변환을 통해 T 형식으로 변환될 수 있는 경우 true를 반환하고, 변환될 수 없으면 false를 반환합니다.The E is T expression returns true if the result of E is non-null and can be converted to type T by a reference conversion, a boxing conversion, or an unboxing conversion; otherwise, it returns false. is 연산자는 사용자 정의 변환을 고려하지 않습니다.The is operator doesn't consider user-defined conversions.

다음 예제에서는 식 결과의 런타임 형식이 지정된 형식에서 파생되는 경우, 즉 형식 간에 참조 변환이 있는 경우 is 연산자가 true를 반환하는 것을 보여 줍니다.The following example demonstrates that the is operator returns true if the runtime type of an expression result derives from a given type, that is, there exists a reference conversion between types:

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
    }
}

다음 예제에서는 is 연산자가 boxing 및 unboxing 변환은 고려하지만 숫자 변환을 고려하지 않는 것을 보여 줍니다.The next example shows that the is operator takes into account boxing and unboxing conversions but doesn't consider numeric conversions:

int i = 27;
Console.WriteLine(i is System.IFormattable);  // output: True

object iBoxed = i;
Console.WriteLine(iBoxed is int);  // output: True
Console.WriteLine(iBoxed is long);  // output: False

C# 변환에 대한 자세한 내용은 C# 언어 사양변환 장을 참조하세요.For information about C# conversions, see the Conversions chapter of the C# language specification.

패턴 일치를 사용한 형식 테스트Type testing with pattern matching

C# 7.0부터, is 연산자는 식 결과에 패턴이 있는지도 테스트합니다.Starting with C# 7.0, the is operator also tests an expression result against a pattern. 특히, 다음 형태의 양식 패턴을 지원합니다.In particular, it supports the type pattern in the following form:

E is T v

여기서 E는 값을 반환하는 식이고, T는 형식 또는 형식 매개 변수의 이름이며, vT 형식의 새 로컬 변수입니다.where E is an expression that returns a value, T is the name of a type or a type parameter, and v is a new local variable of type T. E의 결과가 null이 아니고 참조, boxing 또는 unboxing 변환을 통해 T로 변환될 수 있는 경우 E is T v 식이 true를 반환하고 E 결과의 변환된 값이 v 변수에 할당됩니다.If the result of E is non-null and can be converted to T by a reference, boxing, or unboxing conversion, the E is T v expression returns true and the converted value of the result of E is assigned to variable v.

다음 예제에서는 형식 패턴과 is 연산자를 사용하는 방법을 보여 줍니다.The following example demonstrates the usage of the is operator with the type pattern:

int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
    Console.WriteLine(a + b);  // output 30
}

형식 패턴 및 기타 지원되는 패턴에 대한 자세한 내용은 is를 사용한 패턴 일치를 참조하세요.For more information about the type pattern and other supported patterns, see Pattern matching with is.

as 연산자as operator

as 연산자는 식의 결과를 지정된 참조 또는 nullable 값 형식으로 명시적으로 변환합니다.The as operator explicitly converts the result of an expression to a given reference or nullable value type. 변환할 수 없는 경우 as 연산자가 null을 반환합니다.If the conversion is not possible, the as operator returns null. 캐스트 연산자 ()와 달리, as 연산자는 예외를 throw하지 않습니다.Unlike the cast operator (), the as operator never throws an exception.

다음 형태의 식이 있다고 가정합니다.The expression of the form

E as T

여기서 E는 값을 반환하는 식이고, T는 형식 또는 형식 매개 변수의 이름입니다. 이 식은 다음과 동일한 결과를 생성합니다.where E is an expression that returns a value and T is the name of a type or a type parameter, produces the same result as

E is T ? (T)(E) : (T)null

단, E가 한 번만 계산됩니다.except that E is only evaluated once.

as 연산자는 참조, nullable, boxing 및 unboxing 변환만 고려합니다.The as operator considers only reference, nullable, boxing, and unboxing conversions. as 연산자를 사용하여 사용자 정의 변환을 수행할 수는 없습니다.You cannot use the as operator to perform a user-defined conversion. 사용자 정의 변환을 수행하려면 캐스트 연산자 ()를 사용합니다.To do that, use the cast operator ().

다음 예제에서는 as 연산자의 사용법을 보여 줍니다.The following example demonstrates the usage of the as operator:

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
}

참고

앞의 예제와 같이, as 식의 결과를 null과 비교하여 변환에 성공했는지 확인해야 합니다.As the preceding example shows, you need to compare the result of the as expression with null to check if the conversion is successful. C# 7.0부터, is 연산자를 사용하여 변환에 성공하는지 테스트하고, 성공한 경우 해당 결과를 새 변수에 할당할 수 있습니다.Starting with C# 7.0, you can use the is operator both to test if the conversion succeeds and, if it succeeds, assign its result to a new variable.

캐스트 연산자 ()Cast operator ()

(T)E 형태의 캐스트 식은 E 식의 결과를 T 형식으로 명시적으로 변환합니다.A cast expression of the form (T)E performs an explicit conversion of the result of expression E to type T. E 형식에서 T 형식으로의 명시적 변환이 없는 경우 컴파일 시간 오류가 발생합니다.If no explicit conversion exists from the type of E to type T, a compile-time error occurs. 런타임에 명시적 변환이 실패하고 캐스트 식이 예외를 throw할 수도 있습니다.At run time, an explicit conversion might not succeed and a cast expression might throw an exception.

다음 예제에서는 명시적 숫자 및 참조 변환을 보여 줍니다.The following example demonstrates explicit numeric and reference conversions:

double x = 1234.7;
int a = (int)x;
Console.WriteLine(a);   // output: 1234

IEnumerable<int> numbers = new int[] { 10, 20, 30 };
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count);  // output: 3
Console.WriteLine(list[1]);  // output: 20

지원되는 명시적 변환에 대한 자세한 내용은 C# 언어 사양명시적 변환 섹션을 참조하세요.For information about supported explicit conversions, see the Explicit conversions section of the C# language specification. 사용자 지정 명시적 또는 암시적 형식 변환을 정의하는 방법에 대한 자세한 내용은 사용자 정의 변환 연산자를 참조하세요.For information about how to define a custom explicit or implicit type conversion, see User-defined conversion operators.

다른 () 용도Other usages of ()

메서드 또는 대리자를 호출하는 경우에도 괄호를 사용합니다.You also use parentheses to call a method or invoke a delegate.

괄호를 사용하여 식에서 연산을 계산하는 순서를 조정하기도 합니다.Other use of parentheses is to adjust the order in which to evaluate operations in an expression. 자세한 내용은 C# 연산자를 참조하세요.For more information, see C# operators.

typeof 연산자typeof operator

typeof 연산자는 형식의 System.Type 인스턴스를 가져옵니다.The typeof operator obtains the System.Type instance for a type. typeof 연산자의 인수는 다음 예제와 같이 형식 또는 형식 매개 변수의 이름이어야 합니다.The argument to the typeof operator must be the name of a type or a type parameter, as the following example shows:

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]

바인딩되지 않은 제네릭 형식과 typeof 연산자를 사용할 수도 있습니다.You also can use the typeof operator with unbound generic types. 바인딩되지 않은 제네릭 형식의 이름에는 형식 매개 변수 개수보다 하나 더 적은 적절한 개수의 쉼표가 포함되어야 합니다.The name of an unbound generic type must contain the appropriate number of commas, which is one less than the number of type parameters. 다음 예제에서는 바인딩되지 않은 제네릭 형식과 typeof 연산자를 사용하는 방법을 보여 줍니다.The following example shows the usage of the typeof operator with an unbound generic type:

Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]

식은 typeof 연산자의 인수가 될 수 없습니다.An expression cannot be an argument of the typeof operator. 식 결과의 런타임 형식에 대한 System.Type 인스턴스를 가져오려면 Object.GetType 메서드를 사용합니다.To get the System.Type instance for the runtime type of the expression result, use the Object.GetType method.

typeof 연산자를 사용한 형식 테스트Type testing with the typeof operator

typeof 연산자를 사용하여 식 결과의 런타임 형식이 지정된 형식과 정확히 일치하는지 확인합니다.Use the typeof operator to check if the runtime type of the expression result exactly matches a given type. 다음 예제에서는 typeof 연산자와 is 연산자를 사용한 형식 검사의 차이점을 보여 줍니다.The following example demonstrates the difference between type checking performed with the typeof operator and the is operator:

public class Animal { }

public class Giraffe : Animal { }

public static class TypeOfExample
{
    public static void Main()
    {
        object b = new Giraffe();
        Console.WriteLine(b is Animal);  // output: True
        Console.WriteLine(b.GetType() == typeof(Animal));  // output: False

        Console.WriteLine(b is Giraffe);  // output: True
        Console.WriteLine(b.GetType() == typeof(Giraffe));  // output: True
    }
}

연산자 오버로드 가능성Operator overloadability

is, astypeof 연산자는 오버로드할 수 없습니다.The is, as, and typeof operators are not overloadable.

사용자 정의 형식은 () 연산자를 오버로드할 수 없지만, 캐스트 식에서 수행할 수 있는 사용자 지정 형식 변환을 정의할 수 있습니다.A user-defined type cannot overload the () operator, but can define custom type conversions that can be performed by a cast expression. 자세한 내용은 사용자 정의 변환 연산자를 참조하세요.For more information, see User-defined conversion operators.

C# 언어 사양C# language specification

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.For more information, see the following sections of the C# language specification:

참고 항목See also