51
3.
4.
5.
C#의 타입 캐스팅(Type Casting)은 데이터 형식을 변환하는 작업을 말합니다. 캐스팅은 크게 두 가지 유형으로 나뉩니다:
- 암시적(Implicit) 캐스팅
- 작은 데이터 타입을 큰 데이터 타입으로 변환할 때 자동으로 수행됩니다.
- 데이터 손실이 없으므로 별도의 명시가 필요 없습니다.
- 명시적(Explicit) 캐스팅
- 큰 데이터 타입을 작은 데이터 타입으로 변환하거나, 호환되지 않는 타입 간의 변환이 필요할 때 수행됩니다.
- 데이터 손실 가능성이 있으므로 명시적으로 변환해야 합니다.
1. 암시적 캐스팅 (Implicit Casting)
int intVal = 100;
long longVal = intVal; // int -> long (암시적 캐스팅)
float floatVal = longVal; // long -> float (암시적 캐스팅)
Console.WriteLine($"Long Value: {longVal}");
Console.WriteLine($"Float Value: {floatVal}");
- 특징: 데이터 손실이 없고, 명시적 캐스팅 구문이 필요 없습니다.
2. 명시적 캐스팅 (Explicit Casting)
double doubleVal = 123.456;
int intVal = (int)doubleVal; // double -> int (명시적 캐스팅)
Console.WriteLine($"Double Value: {doubleVal}");
Console.WriteLine($"Int Value (After Casting): {intVal}");
- 특징: 데이터 손실 가능성이 있으므로
(타입)
을 명시적으로 작성해야 합니다.
3. as
키워드를 사용한 캐스팅
as
는 참조 타입 변환에 사용됩니다. 변환이 실패하면null
을 반환합니다.
object obj = "Hello, World!";
string str = obj as string; // 참조 타입 캐스팅
if (str != null)
{
Console.WriteLine($"String Value: {str}");
}
else
{
Console.WriteLine("Casting failed.");
}
- 특징: 변환 실패 시
InvalidCastException
이 발생하지 않고null
을 반환합니다.
4. is
키워드를 사용한 타입 확인 후 캐스팅
is
는 타입 호환성을 확인하며, 변환이 가능하면 안전하게 처리할 수 있습니다.
object obj = 42;
if (obj is int intVal)
{
Console.WriteLine($"Successfully cast to int: {intVal}");
}
else
{
Console.WriteLine("Casting failed.");
}
- 특징: 타입을 확인한 후 안전하게 캐스팅합니다.
5. Convert
클래스 사용
Convert
클래스는 기본 제공되는 다양한 변환 메서드를 통해 타입 캐스팅을 수행합니다.
string strVal = "123";
int intVal = Convert.ToInt32(strVal); // 문자열 -> 정수 변환
Console.WriteLine($"Converted Int Value: {intVal}");
double doubleVal = Convert.ToDouble(intVal); // 정수 -> 실수 변환
Console.WriteLine($"Converted Double Value: {doubleVal}");
- 특징: 변환 중 유효하지 않은 값이 있으면
FormatException
이 발생합니다.
6. 사용자 정의 타입 캐스팅 (Operator Overloading)
- 사용자 정의 타입 간의 캐스팅을 구현할 수도 있습니다.
class Fahrenheit
{
public double Degrees { get; set; }
public Fahrenheit(double degrees) { Degrees = degrees; }
}
class Celsius
{
public double Degrees { get; set; }
public Celsius(double degrees) { Degrees = degrees; }
// 명시적 변환
public static explicit operator Fahrenheit(Celsius c)
{
return new Fahrenheit(c.Degrees * 9 / 5 + 32);
}
// 암시적 변환
public static implicit operator Celsius(Fahrenheit f)
{
return new Celsius((f.Degrees - 32) * 5 / 9);
}
}
Celsius c = new Celsius(0);
Fahrenheit f = (Fahrenheit)c; // 명시적 변환
Console.WriteLine($"Celsius to Fahrenheit: {f.Degrees}");
f = new Fahrenheit(100);
c = f; // 암시적 변환
Console.WriteLine($"Fahrenheit to Celsius: {c.Degrees}");
- 특징:
explicit
과implicit
키워드를 사용해 타입 간 변환을 정의합니다.
요약
- 암시적 캐스팅: 안전한 경우 자동으로 수행.
- 명시적 캐스팅: 데이터 손실 가능성이 있거나 타입이 호환되지 않을 때
(타입)
을 사용. as
와is
키워드: 참조 타입 캐스팅과 타입 확인에 유용.Convert
클래스: 다양한 타입 변환 메서드를 제공.- 사용자 정의 캐스팅: 커스텀 타입 간 변환을 구현 가능.