C#은 컴파일 시간에 정적으로 형식화되므로 변수가 선언된 후에는 해당 형식을 변수의 형식으로 암시적으로 변환할 수 없는 한 다시 선언하거나 다른 형식의 값을 할당할 수 없습니다. 예를 들어 string
를 int
로 암시적으로 변환할 수 없습니다. 따라서 i
를 int
로 선언한 후에는, 다음 코드에서 보이는 것처럼 문자열 "Hello"를 할당할 수 없습니다.
int i;
// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";
그러나 경우에 따라 다른 형식의 변수 또는 메서드 매개 변수에 값을 복사해야 할 수 있습니다. 예를 들어 매개 변수가 형식화된 메서드에 전달해야 하는 정수 변수가 double
있을 수 있습니다. 또는 인터페이스 형식의 변수에 클래스 변수를 할당해야 할 수도 있습니다. 이러한 종류의 작업을 형식 변환이라고 합니다. C#에서는 다음과 같은 종류의 변환을 수행할 수 있습니다.
암시적 변환: 변환이 항상 성공하고 데이터가 손실되지 않으므로 특별한 구문이 필요하지 않습니다. 예를 들어 더 작은 정수 형식에서 더 큰 정수 형식으로의 변환, 파생 클래스에서 기본 클래스로의 변환 및 범위 변환이 있습니다.
명시적 변환(캐스트): 명시적 변환에는 캐스트 식이 필요합니다. 변환에서 정보가 손실되거나 다른 이유로 변환에 성공하지 못할 수 있는 경우 캐스팅이 필요합니다. 일반적인 예로는 정밀도가 낮거나 범위가 작은 형식으로의 숫자 변환과 기본 클래스 인스턴스를 파생 클래스로 변환하는 것이 포함됩니다.
사용자 정의 변환: 사용자 정의 변환은 기본 클래스 파생 클래스 관계가 없는 사용자 지정 형식 간에 명시적 및 암시적 변환을 사용하도록 정의할 수 있는 특수 메서드를 사용합니다. 자세한 내용은 사용자 정의 변환 연산자를 참조하세요.
도우미 클래스를 사용한 변환: 정수 및 개체, 16진수 문자열 및 바이트 배열과 System.DateTime 같은 호환되지 않는 형식 간에 변환하려면 클래스, System.BitConverter 클래스 및 System.Convert 기본 제공 숫자 형식의 메서드(예:
Parse
)를 사용할 Int32.Parse 수 있습니다. 자세한 내용은 다음 문서를 참조하세요.
암시적 변환
기본 제공 숫자 형식의 경우 저장할 값이 잘리거나 반올림되지 않고 변수에 맞을 수 있는 경우 암시적 변환을 수행할 수 있습니다. 정수 계열 형식의 경우 이 제한은 원본 형식의 범위가 대상 형식에 대한 범위의 적절한 하위 집합임을 의미합니다. 예를 들어 long (64비트 정수) 형식의 변수는 int (32비트 정수)가 저장할 수 있는 모든 값을 저장할 수 있습니다. 다음 예제에서 컴파일러는 오른쪽의 num
값을 형식 long
으로 암시적으로 변환한 후 할당합니다 bigNum
.
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
모든 암시적 숫자 변환의 전체 목록은 기본 제공 숫자 변환 문서의 암시적 숫자 변환 섹션을 참조하세요.
참조 형식의 경우 암시적 변환은 항상 클래스에서 직접 또는 간접 기본 클래스 또는 인터페이스 중 하나로 존재합니다. 파생 클래스는 항상 기본 클래스의 모든 멤버를 포함하므로 특별한 구문이 필요하지 않습니다.
Derived d = new Derived();
// Always OK.
Base b = d;
명시적 변환
그러나 정보가 손실될 위험 없이 변환을 수행할 수 없는 경우 컴파일러는 캐스트라고 하는 명시적 변환을 수행해야 합니다. 형 변환은 명시적으로 변환을 수행하는 방법입니다. 데이터 손실이 발생할 수 있거나 런타임에 캐스트가 실패할 수 있음을 인식하고 있음을 나타냅니다. 캐스트를 수행하려면 변환할 식 앞에 대상 형식을 괄호로 지정합니다. 다음 프로그램은 int에 double 을 캐스팅 합니다. 프로그램이 캐스트 없이 컴파일되지 않습니다.
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234
지원되는 명시적 숫자 변환의 전체 목록은 기본 제공 숫자 변환 문서의 명시적 숫자 변환 섹션을 참조하세요.
참조 형식의 경우 기본 형식에서 파생 형식으로 변환해야 하는 경우 명시적 캐스트가 필요합니다.
참조 형식 간의 캐스트 작업은 기본 개체의 런타임 형식을 변경하지 않습니다. 해당 개체에 대한 참조로 사용되는 값의 형식만 변경합니다. 자세한 내용은 다형성을 참조하세요.
런타임에 형식 변환 예외
일부 참조 형식 변환에서 컴파일러는 캐스트가 유효한지 여부를 확인할 수 없습니다. 올바로 컴파일된 캐스트 작업이 런타임에 실패할 수 있습니다. 다음 예제와 같이, 런타임에 실패하는 형식 캐스트는 InvalidCastException를 발생시킵니다.
Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time
인수 a
를 Reptile
로 명시적으로 캐스팅하면 이것은 위험한 가정이 됩니다. 가정을 하지 않고 형식을 확인하는 것이 더 안전합니다. C#에서는 실제로 캐스트를 수행하기 전에 호환성을 테스트할 수 있는 연산자를 제공합니다 is
. 자세한 내용은 패턴 일치 및 as 및 is 연산자를 사용하여 안전하게 캐스팅하는 방법을 참조하세요.
C# 언어 사양
자세한 내용은 C# 언어 사양의 변환 섹션을 참조하세요.
참고하십시오
.NET