C#에서 서로 다른 데이터 형식 간에 값을 변환해야 할 때 Convert.ChangeType() 메서드는 매우 유용한 도구입니다. 이 메서드는 지정된 형식(Type)의 객체를 반환하며, 반환되는 객체의 값은 원래 객체와 동일합니다.
Convert.ChangeType() 메서드란?
ChangeType() 메서드는 런타임에 형식이 결정되는 상황에서 특히 유용합니다. 예를 들어, 문자열로 입력된 숫자를 실제 숫자 형식으로 변환하거나, 제네릭 코드에서 동적으로 형식을 변경해야 할 때 사용할 수 있습니다.
메서드의 기본 구문은 다음과 같습니다.
public static object? ChangeType (object? value, TypeCode conversionType);
첫 번째 매개변수인 value에는 변환할 객체를, 두 번째 매개변수인 conversionType에는 변환하고자 하는 대상 형식을 TypeCode 열거형 또는 Type 객체로 전달합니다.
예제: double을 int로 변환하기
실제 동작을 확인하기 위해 간단한 예제를 살펴보겠습니다. 먼저 double 형식의 변수가 하나 있다고 가정해 보겠습니다.
double val = -3.456;
이제 ChangeType 메서드를 사용하여 이 값을 정수형(Int32)으로 변환해 보겠습니다.
num = (int)Convert.ChangeType(val, TypeCode.Int32);
ChangeType() 메서드는 object 형식을 반환하기 때문에, 원하는 구체적인 형식으로 명시적 캐스팅(casting)을 해주어야 한다는 점에 유의하세요.
전체 코드
using System;
public class Demo {
public static void Main() {
double val = -3.456;
int num = (int)Convert.ChangeType(val, TypeCode.Int32);
Console.WriteLine("{0} converted to an Int32: {1}", val, num);
}
}실행 결과
-3.456 converted to an Int32: -3
실행 결과를 보면 -3.456이 Int32 형식의 -3으로 변환된 것을 확인할 수 있습니다. 소수점 이하 값은 잘리고(truncation), 반올림되지 않는다는 점도 함께 기억해 두면 좋습니다.
참고 사항
ChangeType() 메서드를 사용할 때는 몇 가지 주의할 점이 있습니다. 첫째, 변환이 불가능한 경우 InvalidCastException이 발생할 수 있으므로 try-catch 블록으로 감싸는 것이 안전합니다. 둘째, null 값을 전달하면 대상 형식의 기본값(default)이 반환됩니다. 셋째, IConvertible 인터페이스를 구현하지 않은 사용자 정의 클래스는 변환에 실패할 수 있습니다.