C#/์ด๊ฒƒ์ด C#์ด๋‹ค

33. ์ธํ„ฐํŽ˜์ด์Šค(1)

Rainbow๐ŸŒˆCoder 2022. 2. 14. 18:58
728x90

https://youtu.be/8NhvqLl-o2A

ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์˜ ์ฒญ์‚ฌ์ง„, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค์˜ ์ฒญ์‚ฌ์ง„

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ํ•ด์•ผํ•˜๋Š” ํ–‰๋™(์ฆ‰, ๋ฉ”์†Œ๋“œ)์„ ๊ฒฐ์ •

์ธํ„ฐํŽ˜์ด์Šค๋Š” (๊ธฐ๋ณธ์ ์œผ๋กœ) ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์„ ๊ฐ–์ง€ ์•Š์Œ

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•„๋“œ๋ฅผ ๊ฐ–์ง€ ์•Š์Œ

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์•ฝ์†์ด๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ์‹ค์ฒด ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‹ค์ฒด ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŒŒ์ƒ ํด๋ž˜์Šค์ธ์ง€๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค public ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š”์ง€๋„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ [๊ทธ๊ฒƒ์ด ์•ฝ์†์ด๋‹ˆ๊นŒ....(๋‚˜๋ฃจํ† ํ†ค)]

 

์ปค๋„ฅํ„ฐ๋Š” ๋‘ ๋ถ€ํ’ˆ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘๊ฐ„ ๋ถ€ํ’ˆ

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‘ ํด๋ž˜์Šค๋ฅผ ์ด์–ด์ฃผ๋Š” ์ปค๋„ฅํ„ฐ

 

 

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ์ธต ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์š”์†Œ์ด๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ณ ์ˆ˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

<์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ ์–ธ>

interface ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„
{
	๋ฐ˜ํ™˜ํ˜•์‹ ๋ฉ”์†Œ๋“œ์ด๋ฆ„1(๋งค๊ฐœ๋ณ€์ˆ˜_๋ชฉ๋ก...);
    ๋ฐ˜ํ™˜ํ˜•์‹ ๋ฉ”์†Œ๋“œ์ด๋ฆ„2(๋งค๊ฐœ๋ณ€์ˆ˜_๋ชฉ๋ก...);
    ๋ฐ˜ํ™˜ํ˜•์‹ ๋ฉ”์†Œ๋“œ์ด๋ฆ„3(๋งค๊ฐœ๋ณ€์ˆ˜_๋ชฉ๋ก...);
}

์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ ์–ธ์€ ํด๋ž˜์Šค์™€ ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ

๋ฉ”์†Œ๋“œ, ์ด๋ฒคํŠธ, ์ธ๋ฑ์„œ, ํ”„๋กœํผํ‹ฐ๋งŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค(๊ตฌํ˜„๋ถ€๋„ ์—†๋‹ค)๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

ํด๋ž˜์Šค๋Š” ์ ‘๊ทผ ์ œํ•œ ํ•œ์ •์ž๋กœ ์ˆ˜์‹ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ private๋กœ ์„ ์–ธ๋˜์ง€๋งŒ,

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ ‘๊ทผ ์ œํ•œ ํ•œ์ •์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ๋ชจ๋“  ๊ฒƒ์ด public์œผ๋กœ ์„ ์–ธ๋œ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธ์Šคํ„ด์Šค๋„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.

(์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์ง€๋งŒ, ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.)

 

๊ทœ์น™

(1) ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ(๋ฐ ํ”„๋กœํผํ‹ฐ)๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

(2) ๋ฉ”์†Œ๋“œ๋“ค์€ public ํ•œ์ •์ž๋กœ ์ˆ˜์‹ํ•ด์•ผ ํ•œ๋‹ค.

-ILogger ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์˜ˆ-

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace PosisionalPatern
{
    interface ILogger
    {
        void WriteLog(string message);
    }
    class ConsloeLogger : ILogger
    {
        public void WriteLog(string message)
        {
            WriteLine($"{DateTime.Now.ToLocalTime()} {message}");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            ILogger logger = new ConsloeLogger();
            logger.WriteLog("Hello, World!");
        }
    }
}

<์ถœ๋ ฅ ๊ฒฐ๊ณผ>

2022-02-14 ์˜คํ›„ 4:28:25 Hello, World!

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

            ILogger logger = new ConsloeLogger();
            logger.WriteLog("Hello, World!");

 

์œ„์™€ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธ์Šคํ„ด์Šค๋Š” ๋ชป ๋งŒ๋“ค์ง€๋งŒ, ์ฐธ์กฐ๋Š” ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ฐธ์กฐ์— ํŒŒ์ƒ ํด๋ž˜์Šค ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ ๋‹ด๋Š” ๊ฒƒ์ด๋‹ค.

(ํŒŒ์ƒํด๋ž˜์Šค๋Š” ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋Š˜ ๋ช…์‹ฌํ•˜์ž, ์ด๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์˜ ๊ด€๊ณ„์—๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค. ์ฆ‰ ์œ„์˜ ์˜ˆ์‹œ์—์„œ Consolelogger์˜ ๊ฐ์ฒด๋Š” ILogger์˜ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค.)

 

 

<์ธํ„ฐํŽ˜์ด์Šค ์ž‘๋ช…๋ฒ•>

์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„ ์•ž์— 'I'๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ด๋‹ค.

 

 

<์ธํ„ฐํŽ˜์ด์Šค๋Š” ์•ฝ์†์ด๋‹ค.>

PC์—์„œ USBํฌํŠธ๊ฐ€ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” PC์™€ ์ฃผ๋ณ€๊ธฐ๊ธฐ๊ฐ€ USB๋ผ๋Š” ์•ฝ์†์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋„ ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด์—์„œ USB ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.(ํด๋ž˜์Šค๊ฐ€ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ์•ฝ์†)

์ด ์•ฝ์†์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋  ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค.

 

๊ฐ€๋ น ์œ„์—์„œ ILogger ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž์‹ ์œผ๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋  ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ WriteLog()๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์ œํ•œ๋‹ค. ์–ด๋–ค ํด๋ž˜์Šค๋“  ILogger๋ฅผ ์ƒ์†๋ฐ›์•„ ILogger์— ์„ ์–ธ๋˜์–ด ์žˆ๋Š” WriteLog() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ILogger์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

(์•ž์—์„œ ILogger ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ConsoleLogger ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์—ฌ ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก WriteLog() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์ด ์™ธ์—๋„ ์–ผ๋งˆ๋“ ์ง€ ILogger๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•ด์„œ ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ณ  ๋„คํŠธ์›Œํฌ ๋„ˆ๋จธ์— ์žˆ๋Š” ์„œ๋ฒ„์— ์ €์žฅํ•˜๋„๋ก ํŒจํ‚ท์„ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค.)

 

 

<Bug ver.> : ์ •์ƒ์ ์œผ๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š” ์ฝ”๋“œ... bin ํŒŒ์ผ์— ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋ฉ”๋ชจ์žฅ์— ๊ธฐ๋ก์ด ๋‚จ์•„์•ผ ํ•˜๋Š”๋ฐ ๋‚จ์ง€ ์•Š๋Š”๋‹ค.

์›์ธ ๋ฐœ๊ฒฌ X

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using System.IO;

namespace Interface 
{
    interface ILogger //ConsloeLogger์™€ FileLogger๋Š” ILogger๋ฅผ ์ƒ์†ํ•˜๋ฉฐ, WriteLog() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. 
    {
        void WriteLog(string message);
    }
    class ConsloeLogger : ILogger
    {
        public void WriteLog(string message)
        {
            WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), message);
        }
    }

    class FileLogger : ILogger //์ฝ˜์†์ด ์•„๋‹Œ ํ…์ŠคํŠธ ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ILogger์˜ ํŒŒ์ƒ ํด๋ž˜์Šค
    {
        private StreamWriter writer; //StreamWriter ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•จ

        public FileLogger(string path)
        {
            writer = File.CreateText(path);
            writer.AutoFlush = true;
        }
        public void WriteLog(string message) //์—ญ์‹œ๋‚˜ ILogger๊ฐ€ ์ •ํ•ด๋†“์€ ๊ทœ์น™์„ FileLogger ํด๋ž˜์Šค๊ฐ€ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค.
        {
            WriteLine($"{0} {1}",DateTime.Now.ToShortTimeString(), message);
        }
    }

    class ClimateMonitor //ClimateMonitor ํด๋ž˜์Šจ๋Š” ILogger ํ˜•์‹์˜ ์ฐธ์กฐ logger์„ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์˜จ๋„๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž…๋ ฅ๋ฐ›์•„ ๊ธฐ๋ก
    {
        private ILogger logger;
        public ClimateMonitor(ILogger logger)//logger๊ฐ€ ์–ด๋–ป๊ฒŒ ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ• ์ง€๋Š” ClimateMonitor() ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ž…๋ ฅ๋œ ๊ฐ์ฒด์— ๋‹ฌ๋ ค์žˆ๋‹ค.
        {
            this.logger = logger;
        }
        public void start()
        {
            while(true)
            {
                Console.Write("์˜จ๋„๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. (End ์ž…๋ ฅ ํ›„ ์—”ํ„ฐํ‚ค๋Š” ์ข…๋ฃŒ....): ");
                string temperature = Console.ReadLine();
                if (temperature == "End") 
                    break;
                logger.WriteLog("ํ˜„์žฌ ์˜จ๋„ : "+temperature);
            }
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            //๋‹ค์Œ๊ณผ ๊ฐ™์ด ConsloeLogger ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž์— ์ธ์ˆ˜๋กœ ๋„˜๊ธฐ๋ฉด ClimateMonitor๋Š” ์ฝ˜์†”์— ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ
            //FileLogger ๊ฐ์ฒด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ClimateMonitor ๊ฐ์ฒด์— ๋„˜๊ธฐ๋ฉด ์ด์ œ monitor ๊ฐ์ฒด๋Š” ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. 
            ClimateMonitor monitor = new ClimateMonitor(new FileLogger("Test.txt"));
            //monitor ๊ฐ์ฒด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— MyLog.txt ๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฌ๊ธฐ์— ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค.
            monitor.start();

        }
    }
}

<Bug X version>

 

using System;
using System.IO;

namespace Interface
{
    interface ILogger // ์ธํ„ฐํŽ˜์ด์Šค!
    {
        void WriteLog(string message);
    }

    // ๋‚˜๋Š” Console์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ฒ ๋‹ค.
    class ConsoleLogger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine($"{DateTime.Now.ToLocalTime()}, {message}");
        }
    }

    // ๋‚˜๋Š” ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ฒ ๋‹ค.
    class FileLogger : ILogger
    {
        private StreamWriter writer;

        public FileLogger(string path)
        {
            writer = File.CreateText(path);
            writer.AutoFlush = true;
        }

        public void WriteLog(string message)
        {
            writer.WriteLine($"{DateTime.Now.ToLocalTime()}, {message}");
        }
    }

    class ClimateMonitor
    {
        private ILogger logger; // ์–ด๋–ค ๋กœ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•  ์ง€
        //ILogger์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
        public ClimateMonitor(ILogger logger)
        { //์ด ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋‹ค!
            this.logger = logger;
        }
        public void start()
        {
            while (true)
            {
                Console.WriteLine("์˜จ๋„๋ฅผ ์ž…๋ ฅ : ");
                string temperature = Console.ReadLine();
                if (temperature == "") break;

                // ๋“ฑ๋ก๋œ ๋กœ๊ฑฐ์— message๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
                logger.WriteLog($"ํ˜„์žฌ ์˜จ๋„ : {temperature}");
            }
        }
    }

    class Program
    {
        static void Main()
        {
            ClimateMonitor monitor = new ClimateMonitor(new FileLogger("MyLog.txt"));
            //ใ„ดvar๋กœ ํ•ด๋„ ๋จ!

            monitor.start();
        }
    }
}

<์œ„ ์Šคํฌ๋ฆฝํŠธ ์ชผ๊ฐœ์„œ ์ƒ๊ฐํ•˜๊ธฐ>


using System;
using System.IO;

namespace Interface
{
    interface ILogger // ์ธํ„ฐํŽ˜์ด์Šค!
    {
        void WriteLog(string message);
    }

    // ๋‚˜๋Š” Console์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ฒ ๋‹ค.
    class ConsoleLogger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine($"{DateTime.Now.ToLocalTime()}, {message}");
        }
    }

    // ๋‚˜๋Š” ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ฒ ๋‹ค.
    class FileLogger : ILogger
    {
        private StreamWriter writer;

        public FileLogger(string path)
        {
            writer = File.CreateText(path);
            writer.AutoFlush = true;
        }

        public void WriteLog(string message)
        {
            writer.WriteLine($"{DateTime.Now.ToLocalTime()}, {message}");
        }
    }



    class Program
    {
        static void Main()
        {
            ILogger newFileLog = new FileLogger("OKOKOKOK.txt"); //๊ฐ™์€ ํด๋”์— txt ํŒŒ์ผ ์ƒ์„ฑ!
        }
    }
}
using System;
using System.IO;

namespace Interface
{
    interface ILogger // ์ธํ„ฐํŽ˜์ด์Šค!
    {
        void WriteLog(string message);
    }

    // ๋‚˜๋Š” Console์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ฒ ๋‹ค.
    class ConsoleLogger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine($"{DateTime.Now.ToLocalTime()}, {message}");
        }
    }

    // ๋‚˜๋Š” ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ฒ ๋‹ค.
    class FileLogger : ILogger
    {
        private StreamWriter writer;

        public FileLogger(string path)
        {
            writer = File.CreateText(path);
            writer.AutoFlush = true;
        }

        public void WriteLog(string message)
        {
            writer.WriteLine($"{DateTime.Now.ToLocalTime()}, {message}");
        }
    }

    class ClimateMonitor
    {
        private ILogger logger; // ์–ด๋–ค ๋กœ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•  ์ง€
        //ILogger์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํ•„๋“œ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค
        public ClimateMonitor(ILogger logger)
        { //์ด ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋‹ค!
            this.logger = logger;
        }
        public void start()
        {
            while (true)
            {
                Console.WriteLine("์˜จ๋„๋ฅผ ์ž…๋ ฅ : ");
                string temperature = Console.ReadLine();
                if (temperature == "") break;

                // ๋“ฑ๋ก๋œ ๋กœ๊ฑฐ์— message๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
                logger.WriteLog($"ํ˜„์žฌ ์˜จ๋„ : {temperature}");
            }
        }
    }

    class Program
    {
        static void Main()
        {

            ILogger newFileLog = new FileLogger("ILOVEYOU.txt");
            ClimateMonitor monitor = new ClimateMonitor(newFileLog);
            monitor.start();
        }
    }
}
728x90