演算子のリロード、クラスからクラスへの変換


演算子のオーバーロード
using System;


namespace _21_12_21
{
    public class Kilogram
    {
        double mass;

        public Kilogram(double value)
        {
            this.mass = value;
        }

        public Kilogram Add(Kilogram target)
        {
            return new Kilogram(this.mass + target.mass);
        }
        public override string ToString()
        {
            return mass + "kg";
        }

        public static Kilogram operator +(Kilogram op1, Kilogram op2)
        {
            return new Kilogram(op1.mass + op2.mass);
        }

        public static Kilogram operator -(Kilogram op1, Kilogram op2)
        {
            return new Kilogram(op1.mass - op2.mass);
        }

        public static Kilogram operator *(Kilogram op1, Kilogram op2)
        {
            return new Kilogram(op1.mass * op2.mass);
        }

        public static Kilogram operator /(Kilogram op1, Kilogram op2)
        {
            return new Kilogram(op1.mass / op2.mass);
        }

        public static Kilogram operator %(Kilogram op1, Kilogram op2)
        {
            return new Kilogram(op1.mass % op2.mass);
        }

        // 증감연산자 오버로딩 : +1, -1씩 증가
        static public Kilogram operator ++(Kilogram kg)
        {
            ++kg.mass;
            return kg;
        }

        static public Kilogram operator --(Kilogram kg)
        {
            --kg.mass;
            return kg;
        }

        // 부정 연산자
        static public bool operator !(Kilogram kg)
        {
            return kg.mass != 5;
        }

        // 비교연산자
        static public bool operator ==(Kilogram a, Kilogram b)
        {
            return a.mass == b.mass;
        }

        static public bool operator !=(Kilogram a, Kilogram b)
        {
            return a.mass != b.mass;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Kilogram kg1 = new Kilogram(5);
            Kilogram kg2 = new Kilogram(10);

            Kilogram kg3 = kg1 + kg2;
            Kilogram kg4 = kg1 - kg2;
            Kilogram kg5 = kg1 * kg2;
            Kilogram kg6 = kg1 / kg2;
            Kilogram kg7 = kg1 % kg2;


            Console.WriteLine(kg3);
            Console.WriteLine(kg4);
            Console.WriteLine(kg5);
            Console.WriteLine(kg6);
            Console.WriteLine(kg7);

            ++kg1;
            Console.WriteLine(kg1);

            --kg1;
            Console.WriteLine(kg1);

            Console.WriteLine(!kg1);

            Console.WriteLine(kg1 == kg2);
            Console.WriteLine(kg1 != kg2);
        }
    }
}
クラスからクラスへの変換
using System;


namespace _21_12_21
{
    public class Currency
    {
        decimal money;
        public decimal Money
        {
            get { return money; }
        }

        public Currency(decimal money)
        {
            this.money = money;
        }
    }

    public class Won : Currency
    {
        public Won(decimal money) : base(money) { }

        public override string ToString()
        {
            return Money + "Won";
        }

        static public explicit operator Won(Dollar dollar)
        {
            return new Won(dollar.Money * 1000m);
        }
    }

    public class Dollar : Currency
    {
        public Dollar(decimal money) : base(money) { }

        public override string ToString()
        {
            return Money + "Dollar";
        }
    }

    public class Yen : Currency
    {
        public Yen(decimal money) : base(money) { }

        public override string ToString()
        {
            return Money + "Yen";
        }

        static public implicit operator Won(Yen yen)
        {
            return new Won(yen.Money * 13m);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Won won = new Won(1000);
            Dollar dollar = new Dollar(1);
            Yen yen = new Yen(13);

            Won won1 = yen; // 암시적 형변환 가능, 명시적 형변환 가능
            Won won2 = (Won)dollar; // 암시적 형변환 불가능, 명시적 형변환 가능

            Console.WriteLine(won1);
            Console.WriteLine(won2);
        }
    }
}
using System;


namespace _21_12_20
{
    class Mammal
    {
        private int price;

        public int Price
        {
            get { return price; }
        }

        public void Move()
        {
            Console.WriteLine("이동한다.");
        }

        public Mammal(int price)
        {
            this.price = price;
        }

    }
    
    class Lion : Mammal 
    {
        public Lion(int price) : base(price)
        {
            
        }

        public override string ToString()
        {
            return Price + "Lion";
        }
    }

    class Whale : Mammal 
    {
        public Whale(int price) : base(price)
        {

        }

        public override string ToString()
        {
            return Price + "Whale";
        }

        static public implicit operator Lion(Whale whale)
        {
            return new Lion(whale.Price);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Lion lion = new Lion(1);
            Whale whale = new Whale(100);

            Lion lion2 = (Lion)whale;
            Console.WriteLine(lion2);
        }
    }
}