내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-10 05:15

제목

[C#] 캐스트 연산자 (implicit/explicit)


캐스트 연산자(implicit/explicit)

 - 다른 연산자와 마찬가지로 공개되어야(public) 하며 정적(static)이어야 한다.
 - 피연산자가 하나 뿐이므로 인수도 하나여야 한다.

선언 형식)
1
public static implicit(explicit) operator 변환대상(인수)


변환 대상 앞에는 변환 방식을 지정하는 키워드가 오는데 implicit(암시적) 또는 explicit(명시적) 둘 중 하나를 선택하여 지정한다.
implicit(암시적) : 별도의 캐스팅을 하지 않더라도 컴파일러가 알아서 변환하는 것을 허가한다. 변환에 의한 값 손실이 전혀 없을 때 사용한다.
explicit(명시적) : 값 손실이 발생할 수도 있으므로 캐스팅에 의해서만 변환이 가능하며 컴파일러가 임의로 변환하지 못하는 변환이다.

예) 시간과 정수를 상호 변환하는 예이다.
     시간은 시, 분, 초의 3차원으로 표현하는 타입이지만 절대 초 단위로 환살 할 수 있으므로 정수형과 변환 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Time Now = new Time(12, 30, 40);
            Now.outTime();
            int absec = Now;        // 암시적 변환
            Console.WriteLine("절대초 = {0}와 같다.", absec);
            Time Then = new Time();
            Then = (Time)12345;     // 명시적 변환
            Console.WriteLine("\"Then = (Time)12345\"의 결과");
            Then.outTime();
        }
    }
 
    class Time
    {
        public int hour, min, sec;
 
        public Time() { }
        public Time(int h, int m, int s) { hour = h; min = m; sec = s; }
 
        public void outTime()
        {
            Console.WriteLine("현재 시간은 {0}시 {1}분 {2}초이다.", hour, min, sec);
        }
        public static implicit operator int(Time t)
        {
            return t.hour * 3600 + t.min * 60 + t.sec;
        }
        public static explicit operator Time(int abs)
        {
            Time T = new Time();
            T.hour = abs / 3600;
            T.min = (abs / 60) % 60;
            T.sec = abs % 60;
            return T;
        }
    }
}

결과)
현재 시간은 12시 30분 40초이다.
절대초 = 45040와 같다.
"Then = (Time)12345"의 결과
현재 시간은 3시 25분 45초이다. 


Time 객체를 정수로 변환하는 연산자는 implicit을 붙여 암시적으로 선언했는데 이 변환은 별다른 위험없이 항상 안전하기 때문이다. 

반면 정수를 Time 객체로 변환하는 연산자는 explicit을 앞 절 명시적으로 선언했다. 왜냐하면 이 변환은 인수가 어떤 값을 가지는가에 따라 안전하지 못할 수도 있기 때문이다. 정수가 12345나 65300 정도라면 유효한 Time 객체로 변환될 수 있지만 123456789 같은 큰 값이면 시간값이 너무 커져 무효한 객체가 되기 대문이다. 특히 절대초가 음수면 황당한 결과가 나올 수도 있으므로 명시적으로만 변환을 허용한다. 

* 암시적인가 명시적인가는 그 변환이 100% 확실히 진짜로 정말로 안전한가 아닌가를 의미한다.


출처1

http://warmz.tistory.com/356

출처2