2 minute read

implicit(암시적 변환) 과 explicit(명시적 변환)


C#에서 implicit(암시적 변환) 과 explicit(명시적 변환) 은 사용자 정의 타입 변환을 구현할 때 사용됩니다. 이 개념을 정확히 이해하면 사용자 정의 클래스를 보다 안전하고 직관적으로 변환할 수 있습니다.

Image

✔ 예제: 기본형 변환

int x = 10;
double y = x;  // 암시적 변환 (int → double)

double a = 9.7;
int b = (int)a;  // 명시적 변환 (double → int, 소수점 손실 발생)

위 코드에서 int → double 변환은 데이터 손실이 없으므로 자동(implicit) 변환되지만, double → int 변환은 소수점이 손실될 수 있어 명시적(explicit) 변환이 필요합니다.

사용자 정의 타입에서 implicit 변환


암시적 변환(implicit) 은 데이터 손실 없이 안전한 경우 사용됩니다. 이 경우, 명시적 캐스트 없이 자연스럽게 변환할 수 있습니다.

✔ 예제: Dollar → Euro 변환 (안전한 변환)

using System;

class Dollar
{
    public double Amount { get; }

    public Dollar(double amount)
    {
        Amount = amount;
    }

    // 암시적 변환: Dollar → Euro (1 Dollar = 0.9 Euro)
    public static implicit operator Euro(Dollar d)
    {
        return new Euro(d.Amount * 0.9);
    }
}

class Euro
{
    public double Amount { get; }

    public Euro(double amount)
    {
        Amount = amount;
    }

    public override string ToString()
    {
        return $"{Amount} EUR";
    }
}

class Program
{
    static void Main()
    {
        Dollar usd = new Dollar(10);  
        Euro eur = usd;  // 암시적 변환 (캐스트 연산자 필요 없음)
        
        Console.WriteLine(eur);  // "9 EUR"
    }
}

✔ Dollar → Euro 변환은 데이터 손실이 없으므로 implicit 변환을 사용했습니다.
✔ usd 객체를 Euro로 변환할 때 명시적인 (Euro)usd 캐스트 없이 자동 변환 됩니다.

사용자 정의 타입에서 explicit 변환


명시적 변환(explicit) 은 데이터 손실이 발생할 가능성이 있거나 의미적 차이가 있는 경우 사용됩니다. 이 경우, 캐스트 연산자가 반드시 필요 합니다.

✔ 예제: Kilometer → Meter 변환 (단위 차이 있음)

using System;

class Kilometer
{
    public double Value { get; }

    public Kilometer(double km)
    {
        Value = km;
    }

    // 명시적 변환: Kilometer → Meter (1 km = 1000 m)
    public static explicit operator Meter(Kilometer km)
    {
        return new Meter(km.Value * 1000);
    }
}

class Meter
{
    public double Value { get; }

    public Meter(double m)
    {
        Value = m;
    }

    public override string ToString()
    {
        return $"{Value} m";
    }
}

class Program
{
    static void Main()
    {
        Kilometer km = new Kilometer(3);  
        // Meter m = km;  // ❌ 오류 발생 (암시적 변환 불가능)
        Meter m = (Meter)km;  // ✅ 명시적 캐스트 필요

        Console.WriteLine(m);  // "3000 m"
    }
}

✔ Kilometer → Meter 변환은 데이터가 커질 수 있기 때문에 명시적 변환이 필요합니다.
✔ (Meter)km 와 같이 명시적으로 캐스트 연산자를 사용해야 변환 가능 합니다.

implicit vs explicit 비교


Image

주의할 점


✅ 암시적 변환이 너무 남발되면 원치 않는 변환이 발생할 수 있음
✅ 명시적 변환을 무조건 강요하면 코드가 복잡해질 수 있음
✅ 변환 연산자를 오버로딩할 때 implicit과 explicit을 적절히 사용해야 유지보수성이 좋아짐

정리


1️⃣ 암시적 변환(implicit)

  • 안전한 변환일 때 사용
  • Dollar → Euro 같은 변환에 적합

2️⃣ 명시적 변환(explicit)

  • 데이터 손실 가능성이 있는 경우 사용
  • double → int, Kilometer → Meter 같은 변환에 적합

3️⃣ implicit과 explicit을 적절히 사용하면 코드의 가독성과 안전성이 높아짐

Top