/*Singletone Pattern sample*/

using System;
using System.Drawing;

public class APMMemory
{
    private static APMMemory apmMemory=null;
    string ____processid;
    System.Drawing.Color ____bgColor;

    public static APMMemory GetInstance
    {
        get
        {
            if(apmMemory == null)
            {
                apmMemory=new APMMeory();
                Console.WriteLine("Singletone Pattern sample");
            }
        }
    }
    public string processid
    {
        get{return ____processid;}
        set{___processid=value;}
    }
    public System.Drawing.Color bgColor
    {
        get{return ____bgColor;}
        set{____bgColor=value;}
    }
}
class SampleManage
{
    public void running()
    {
        Console.WriteLine("" + APMMemory.GetInstance.processid);
        Console.WriteLine("" + APMMemory.GetInstance.bgColor);
    }
}
class Program
{
    public static void Main()
    {
        APMMemory.GetInstance.processid = "9999";
        APMMemory.GetInstance.bgColor=System.Drawing.Color.SteelBlue;

        SampleManage nm = new SampleManage();
        nm.running();
    }
}


/*Update by 2022.04.18*/

int common_chek(int direction)
{
    int ii,kk;
    int[,] tmp = new int[MAPY,MAPX];

    for(ii=0; ii <MAPY; ii++)
    for(kk=0; kk<MAPX; kk++)
    {
        tmp[ii,kk]=comm[ii,kk];
    }

    for(ii=0; ii<ARR; ii++)
    for(kk=0; kk<ARR; kk++)
    {
        if(design[ii,kk]==1)
        {
             if(ypos+ii>MAPY-1) continue;
             if(xpos+kk>MAPX-1) continue;
             if(xpos+kk<0) continue;

             tmp[ypos+ii,xpos+kk]=0;
        }
    }

    if(direction==D_RIGHT) xpos++;
    if(direction==D_LEFT) xpos--;
    if(direction==D_DOWN) ypos++;

    ff=0;
    for(ii=0; ii<ARR; ii++)
    for(kk=0; kk<ARR; kk++)
    {
        if(design[ii,kk]==1)
        {
             if(ypos+ii>MAPY-1) continue;
             if(xpos+kk>MAPX-1) continue;
             if(xpos+kk<0) continue;

             tmp[ypos+ii,xpos+kk] += 1;
             if(tmp[ypos+ii,xpos+kk]>1) ff++;
        }
    }

    if(ff>0)
    {
        if(direction==D_RIGHT) xpos--;
        if(direction==D_LEFT) xpos++;
        if(direction==D_DOWN) ypos--;

        return(FAIL);
    }
    else
    {
        for(ii=0; ii<MAPY; ii++)
        for(kk=0; kk<MAPX; kk++)
        {
            comm[ii,kk]=tmp[ii,kk];
        }
    }
    return(SUCC);
}

/*
c# 프로그램 전체 종료*/

1. Console

Environment.Exit(0);

2. Windows Form

Application.Exit();

1. 외부 시스템에 제공할 서비스 또는 객체 정보를 직접적인 class가 아닌 "선언" 만을 제공한다.

2. 다중 상속에 따른 class의 표현을 여러가지로 가능하게 한다.

C Pattern(C로 만드는 Interface)

Java에서는 객체지향, 패턴, Interface을 빼놓고는 아무것도 아닙니다. Interface를 사용해야 언제든지 교체가능한 모듈형태의 프로그래밍을 할 수 있습니다.
Interface의 필요성에 대해서는 다른 곳에도 많이 나와 있기때문에 따로 설명하지 않겠습니다. C로 Interface를 만들어 보겠습니다. 이번에 만들 Interface는 UART입니다.
UART는 MCU와 Device와의 커뮤니케이션 도구로 많이 사용합니다. 예를 들면 GPS Module, RS232를 통한 PC와의 통신 등등에서 사용되므로 Interface를 설명하기에 적합합니다. 

typedef struct
{
    InitFunction Init;
    OpenFunction Open;
    TxHandlerFunction TxHandler;
    RxHandlerFunctioin RxHandler;
    //....(필요시 추가)

}UartInterface;



우선 UART interface를 만들었습니다. 이 interface를 이용해서 GPS Device Interface를 만들어 보겠습니다.

GpsUart.c 에는 다음과 같은 코드가 들어가야 합니다.

void CreatGpsUart(UartInterface *uart)
{
  uart->Open = GpsUartOpen;
  uart->TxHandler = GpsTxHandler;
  uart->RxHandler = GpsRxHandler;
}
void GpsUartOpen()
{
//
}
void GpsTxHandler()
{
//
}

void GpsRxHandler()
{
//
}

Rs232.c 에는 다음과 같은 코드가 들어가야 합니다.

CreatRs232Uart(UartInterface *uart)
{
  uart->Open = Rs232UartOpen;
  uart->TxHandler = Rs232TxHandler;
  uart->RxHandler = Rs232RxHandler;
}
void Rs232UartOpen()
{
//
}

void Rs232TxHandler()
{
//
}

void Rs232RxHandler()
{
//
}

이제 Main.c를 살펴보겠습니다.

UartInteface gGpsUart;
UartInteface gRs232Uart;

void main(void)
{
    CreatGpsUart(&gGpsUart);
    CreatRs232Uart(&gRs232Uart);

    //...
}

UartInterface를 통해 두가지 기능을 만들어 냈습니다. 

/*
interface는 규약이다. usb를 예로 들어보면(?) */

windows os를 사용하는 노트북에 usb를 꽂는다. 이 usb가 어느제조업체에서 만들었는지 알수있는
windows 제어판을 제공한다고 하자.

usb를 만드는 제조업체는 반드시 제조업체와 만든날짜 그리고 버젼을 등록하고 싶다.
windows os의 개발도구 interface를 이용해서 가능하게 할수 있다.

 

interface ____usb_register
{
    public void register_company();
    public void register_version();
    public void register_date();
}

위의 interface를 상속해서 반드시 구현해 주어야 windows os에 usb를 꽂으면 제어판에서 usb의 개략정보를
확인할수 있다.
즉 usb제조업체에서 위의 ____usb_register interface를 상속해서 메소드를 구현해주어야 한다.

/*interface는 규약이다. 반드시 interface상속을 했으면 규약대로 구현을 해야 한다.
상속했는데, 구현을 안했다면 위배가 된다.
usb를 예로 들수 있다. usb를 만든업체는 windows라는 os에서 동작하도록 하려면
windows os에서 규약해놓은 interface의 대부분을 구현해줘야 usb를 노트북이나 데스크탑에 꽂았을때에
제대로 동작하는것이다. usb를 만들어서 windows os에서 동작하려면, windows os의 interface규약집을 참조하여
구현하여야 할것이다. 그러므로 method의 선언만 되어 있을뿐, 구현되는부분은 usb제조사에서 구현해서
사용해야 한다.*/

using System;

interface IAnimal
{
void Eat();
}

interface IAnimalDrink
{
void Drink();
}

class Person : IAnimal,IAnimalDrink
{
public void Eat()
{
Console.WriteLine("Rice.Shape Eating,,,,!!");
}
public void Drink()
{
Console.WriteLine("Water.Shape Drinking,,,,!!");
}
}

class Lion : IAnimal,IAnimalDrink
{
public void Eat()
{
Console.WriteLine("Meat.Shape Eating,,,,!!");
}
public void Drink()
{
Console.WriteLine("Water.Shape Drinking,,,,!!");
}
}

class Camel : IAnimalDrink
{
public void Eat()
{
Console.WriteLine("Green.Shape Eating,,,,!!");
}
public void Drink()
{
Console.WriteLine("Water.Shape Drinking,,,,!!");
}
}

class Program
{
static void Main(string[] args)
{
Person myPerson = new Person();
Lion myLion = new Lion();
Camel myCamel = new Camel();

ExecuteInterface(myCamel);
ExecuteInterface(myPerson);
ExecuteInterface(myLion);
}
private static void ExecuteInterface(object obj)
{
IAnimal target1 = obj as IAnimal;
if (target1 != null)
{
target1.Eat();
}

IAnimalDrink target2 = obj as IAnimalDrink;
if (target2 != null)
{
target2.Drink();
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InterfaceUnderstand
{
    interface IPower
    {
        void action();
    }

    interface IBoot
    {
        void action();
    }

    class NoteBook : IPower, IBoot
    {
        void IPower.action()
        {
            Console.WriteLine("NoteBook::IPower.action() 호출.");
        }

        void IBoot.action()
        {
            Console.WriteLine("NoteBook::IBoot.action() 호출.");
        }
    }

class DesktopPC : IPower, IBoot
    {
        void IPower.action()
        {
            Console.WriteLine("DesktopPC::IPower.action() 호출.");
        }

        void IBoot.action()
        {
            Console.WriteLine("DesktopPC::IBoot.action() 호출.");
        }
    }

class Program
{
static void Main(string[] args)
        {
/*NoteBook을 Handling*//*NoteBook을 Handling*//*NoteBook을 Handling*/
/*NoteBook을 Handling*//*NoteBook을 Handling*//*NoteBook을 Handling*/
            NoteBook mc = new NoteBook();
            
            IPower imca = mc;
            imca.action();

            IBoot imcb = mc;
            imcb.action();

/*DesktopPC를 Handling*//*DesktopPC를 Handling*//*DesktopPC를 Handling*/
/*DesktopPC를 Handling*//*DesktopPC를 Handling*//*DesktopPC를 Handling*/
DesktopPC mcc = new DesktopPC();
            
            IPower imcaa = mcc;
            imcaa.action();

            IBoot imcbb = mcc;
            imcbb.action();
        }
}
}

+ Recent posts