[실습으로 다지는 C#]택배 요금 계산 시뮬레이션

 이번 강의에서는 택배 요금을 계산하는 시뮬레이션을 만들어 봅시다.

 

택배 요금 계산 클래스 다이어그램

 City, Parcel, Application 세 개의 클래스로 구성하고 있습니다.

 City 클래스는 도시 이름과 (기준 도시에서) 상대적 거리를 멤버로 갖습니다.  그리고 다른 도시와의 거리를 계산하는 메서드를 제공합니다.

 Parcel 클래스는 기준 요금과 무게를 멤버로 갖고 요금을 계산하는 메서드를 제공합니다.

 Application은 택배 시스템 시뮬레이션으로 하나의 개체만 허용하는 단일체 패턴을 적용할게요. 

 단일체로 표현하기 위해 정적 멤버로 단일체를 참조하는 멤버 필드를 추가합니다. 그리고 정적 생성자에서 단일체를 생성합니다.  정적 생성자는 해당 형식을 사용하기 전에 동작하는 것을 보장하며 한 번만 동작합니다. 단일체를 생성하기 적합한 곳이죠. 그리고 생성자를 정의하세요. 단, 접근 지정은 디폴트 가시성을 갖는 private으로 지정하세요.

 아래 코드는 단일체를 표현한 코드 예입니다.

class Singleton
{
    static Singleton singleton;
    static Singleton()
    {
        singleton = new Singleton();
    }
    Singleton()
    {
    }
}
using System;

namespace 택배_요금_계산_시뮬레이션
{
    public class City
    {
        readonly double relative_position;
        public string Name
        {
            get;
            private set;
        }
        public City(string name, double relative_position)
        {
            Name = name;
            this.relative_position = relative_position;
        }
        public double CalculateDistance(City city)
        {
            double distance = relative_position - city.relative_position;
            return Math.Abs(distance);
        }
    }
}
namespace 택배_요금_계산_시뮬레이션
{
    public class Parcel
    {
        public const int base_fee = 100;
        double weight;
        public Parcel(double weight)
        {
            this.weight = weight;
        }
        public double CalculateFee(double distance)
        {
            return weight * base_fee * distance;
        }
    }
}

using System;
using System.Collections.Generic;

namespace 택배_요금_계산_시뮬레이션
{
    class Application
    {
        #region 단일체 패턴
        static Application application;
        static Application()
        {
            application = new Application();
        }
        Application()
        {
        }
        #endregion
        List cities = new List();
        internal static void Run()
        {
            application.Init();
            application.Simulation();
        }

        private void Simulation()
        {
            City dep_city = SelectCity("도착 도시");
            if(dep_city == null)
            {
                Console.WriteLine("잘못 선택하였습니다.");
                return;
            }
            City arr_city = SelectCity("출발 도시");
            if(arr_city == null)
            {
                Console.WriteLine("잘못 선택하였습니다.");
                return;
            }
            Parcel parcel = MakeParcel();
            PrintDeliveryFee(dep_city, arr_city, parcel);
        }

        private void PrintDeliveryFee(City dep_city, City arr_city, Parcel parcel)
        {
            double distance = dep_city.CalculateDistance(arr_city);
            Console.WriteLine("택배 요금:{0}원", parcel.CalculateFee(distance));
        }

        private Parcel MakeParcel()
        {
            Console.WriteLine("무게 (Kg):");
            double weight = 0;
            double.TryParse(Console.ReadLine(), out weight);
            return new Parcel(weight);
        }

        private City SelectCity(string msg)
        {
            Console.Write("{0} (", msg);
            for(int i = 0; i<cities.Count; i++)
            {
                Console.Write("{0}:{1} ", i, cities[i].Name);
            }
            Console.Write("):");

            int index = 0;
            if(int.TryParse(Console.ReadLine(), out index)==false)
            {
                return null;
            }
            if((index<0)||(index>=cities.Count))
            {
                return null;
            }
            return cities[index];
        }

        private void Init()
        {
            cities.Add(new City("부산", 0));
            cities.Add(new City("대구", 105.84));
            cities.Add(new City("대전", 259.24));
            cities.Add(new City("서울", 397.40));
        }
    }
}

//https://ehpub.co.kr
//실습으로 다지는 C#
//택배 요금 계산 시뮬레이션

namespace 택배_요금_계산_시뮬레이션
{
    class Program
    {
        static void Main(string[] args)
        {
            Application.Run();
        }
    }
}