Post

C# 사용자 정의 형변환

implicit explicit

Git Source


사용자 정의 형변환 🎈

implicit, explicit 두 가지 모두 C# 4.0 부터 제공하는 연산자이다.


implicit : 별도의 캐스팅 없이 컴파일러가 알아서 변환하는 것, 반환에 의한 값 손실이 없을 때 사용한다.

1
2
3
4
5
6
7
8
9
10
class Time
{
    public int Hour { get; set; }

    public int Minute { get; set; }

    public int Second { get; set; }

    public static implicit operator int(Time time) => time.Hour * 3600 + time.Minute * 60 + time.Second;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
{
    var time = new Time()
    {
        Hour = 5,
        Minute = 30,
        Second = 15,
    };

    int totalSec = time;

    Console.WriteLine($"Sec : {totalSec}");
}
  • int totalSec = time 과 같이 별도의 캐스팅 없이도 대입이 가능하다.

explicit : 값 손실이 발생할 수 있어, 캐스팅에 의해서만 반환이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Meter
{
    public float M { get; set; }

    public Meter(float m) => M = m;

    public static implicit operator string(Meter m) => $"{m.M}m";

    public static explicit operator Centimeter(Meter m) => new Centimeter(m.M * 100);
}

class Centimeter
{
    public float Cm { get; set; }

    public Centimeter(float cm) => Cm = cm;

    public static implicit operator string(Centimeter c) => $"{c.Cm}cm";

    public static explicit operator Meter(Centimeter c) => new Meter(c.Cm / 100);
}
1
2
3
4
5
6
7
8
9
10
static void Main(string[] args)
{
    var meter = new Meter(5.5f);

    Console.WriteLine(meter);

    var centimeter = (Centimeter)meter;

    Console.WriteLine(centimeter);  
}
  • var centimeter = (Centimeter)meter와 같이 클래스가 다르더라도 explicit을 이용하면 클래스 간 캐스팅이 가능하다.

result

This post is licensed under CC BY 4.0 by the author.