본문 바로가기
C#/책 정리

C# 정리 ) 클래스 간의 형변환

2021. 12. 5.

타입을 정의하는것은 단위 환산을 빈번하게 해야하는 프로그램에서도 유용하다.

와우의 화폐 골드 실버 코퍼를 단순히 하나의 데이터 타입으로 정의한다면 계산에 오류가 생기기 쉽다.

decimal gold = 10;
decimal silver = gold * 100;
decimal copper = silver * 100;

gold = silver; // 이런식으로 대입을 해도 오류가 발생하지 않는다

이 코드에서는 공통된타입, decimal을 통해 모든 통화를 표시가혹 있는데, 이는 나중에 유지보수를 하는 동안 중대한 버그를 발생시킬 수도 있다.

using System;

namespace Project2
{
    public class 통화
    {
        decimal money;
        public decimal Money { get { return money; } }
        public 통화(decimal money)
        {
            this.money = money;
        }
    }
    public class 코퍼 : 통화
    {
        public 코퍼(decimal money) : base(money) { }
        public override string ToString()
        {
            return Money + "코퍼";
        }
    }
    public class 실버 : 통화
    {
        public 실버(decimal money) : base(money) { }
        public override string ToString()
        {
            return Money + "실버";
        }
    }
    public class 골드 : 통화
    {
        public 골드(decimal money) : base(money) { }
        public override string ToString()
        {
            return Money + "골드";
        }
    }
    class Class1
    {
        public static void Main(String[] args)
        {
            코퍼 copper = new 코퍼(100);
            실버 silver = new 실버(100);
            골드 gold = new 골드(100);

            gold = silver; // 이곳에서 오류 발생
        }
    }
}

이렇게 한다면 타입이 다르기 때문에 컴파일 시에 오류가 발생한다.

 

100코퍼는 1실버다.

이런 연산을 연산자 오버로드를 통해 하려면 =(대입연산자) 를 정의해야 직관적이겠지만

C#에서는 허용되지 않는다.

 

하지만 대체 구문으로 exlicit, implicit 메서드를 정의하는 것으로 동일한 목적을 달성할 수 있다.

public class 실버 : 통화
    {
        public 실버(decimal money) : base(money) { }
        public override string ToString()
        {
            return Money + "실버";
        }
        static public implicit operator 코퍼(실버 실)
        {
            return new 코퍼(실.Money * 100);
        }
    }
    ------------------------------------------------------------
    public static void Main(String[] args)
        {
            코퍼 copper = new 코퍼(100);
            실버 silver = new 실버(100);
            골드 gold = new 골드(100);

            copper = silver;
            Console.WriteLine(copper);
        }

먼저 implicit 연산자는 이렇게 사용한다.

implicit는 암시적 형변환, 명시적 형변환 모두 허용한다.

 

단위 관련 형변환은 민감할 수 있기 때문에, 개발자가 의도한 형변환만 가능하도록 제한을 걸고 싶을 수 있는데

이때에는 explicit 연산자를 사용하면 된다.

implicit 대신 explici 을 사용하면 반드시 형변환 연산자() 를 사용해야 한다.

 

난 이걸 언제 쓰는지 모르겠다.

 

댓글