Home C# [C#] 타입 캐스팅(as, is, convert 등)

[C#] 타입 캐스팅(as, is, convert 등)

by DUBUKIMCH

C#의 타입 캐스팅(Type Casting)은 데이터 형식을 변환하는 작업을 말합니다. 캐스팅은 크게 두 가지 유형으로 나뉩니다:

  1. 암시적(Implicit) 캐스팅
    • 작은 데이터 타입을 큰 데이터 타입으로 변환할 때 자동으로 수행됩니다.
    • 데이터 손실이 없으므로 별도의 명시가 필요 없습니다.
  2. 명시적(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 클래스: 다양한 타입 변환 메서드를 제공.
  • 사용자 정의 캐스팅: 커스텀 타입 간 변환을 구현 가능.

You may also like

Leave a Comment

error: Content is protected !!