#테트리스.디버깅.단계(1)-Console출력및 테스트

using System;
using System.IO;
using System.Timers;

namespace tris_is_package
{
    class Program
    {
        public static void Main(string[] args)
        {
            tris_is_overloading_debug nm = new tris_is_overloading_debug();
            nm.running();
        }
    }
    class tris_is_overloading_debug
    {
        //Definition
        const int D_RIGHT =2000;
        const int D_LEFT =2001;
        const int D_DOWN =2002;
        const int MAPY =18;
        const int MAPX =18;
        const int MAXDESIGNARR=4;
        const int MAXDESIGN=7;
        //Properties
        int rc;
        int xpos,ypos;
        int[,] tris = new int[MAPY,MAPX];
        int[,] design = new int[MAXDESIGNARR,MAXDESIGNARR];
        int[,,] realdesign = new int[,,]
        {
            {{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},
            {{0,0,0,0},{0,1,1,0},{0,1,1,0},{0,0,0,0}},
            {{0,0,0,0},{0,1,0,0},{1,1,1,0},{0,0,0,0}},
            {{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}},
            {{0,1,0,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}},
            {{0,0,0,0},{0,1,0,0},{0,1,1,1},{0,0,0,0}},
            {{0,0,0,0},{0,1,1,1},{0,1,0,0},{0,0,0,0}}
        };

        DateTime nw;
        Timer tm;
        ConsoleKeyInfo keyinfo;

        //Method
        public tris_is_overloading_debug(){}
        public void running()
        {
            init();

            while(true)
            {
                keyinfo=Console.ReadKey(true);

                if(keyinfo.Key==ConsoleKey.RightArrow)
                {
                    rc=check_t_tris(D_RIGHT,ref ypos,ref xpos);
                    if(rc != 0){stop(); Environment.Exit(0);}
                }
                if(keyinfo.Key==ConsoleKey.LeftArrow)
                {
                    rc=check_t_tris(D_LEFT,ref ypos,ref xpos);
                    if(rc != 0){stop(); Environment.Exit(0);}
                }
                if(keyinfo.Key==ConsoleKey.DownArrow)
                {
                    rc=check_t_tris(D_DOWN,ref ypos,ref xpos);
                    if(rc != 0){stop(); Environment.Exit(0);}
                }
                if(keyinfo.Key==ConsoleKey.Escape) break;

                logg("Key", keyinfo);
            }

            stop();
        }
        void init(){}
        void stop(){}
        int check_t_tris(int direction, ref int y, ref int x){}
        void ____time_tick(object sender, ElapsedEventArgs e){}
        //overloading
        //overloading
        void logg(string msg)
        {
            nw=DateTime.Now;

            Console.WriteLine(">>Pos:[" + ypos.ToString("000") + "," + xpos.ToString("000") + "]" +
            " Event:" + msg);
        }
        void logg(string msg, ConsoleKeyInfo keytmp)
        {
            nw=DateTime.Now;

            Console.WriteLine(">>Pos:[" + ypos.ToString("000") + "," + xpos.ToString("000") + "]" +
            " KeyName:[" + keytmp.Key.ToString() + "]" +
            " Event:" + msg);
        }
        void logg(string msg, bool idx)
        {
            nw=DateTime.Now;
            Console.Write("[" + msg + "]");
        }
    }
}

#File Attach

debug_console_tris.cs
0.01MB

#데이타 읽고,쓰기 속성 선언및 사용방법(get/set)
#데이타 읽고,쓰기 속성 선언및 사용방법(get/set)

namespace ____java_is_package
{
    class Program
    {
        public static void Main(string[] args)
        {
            ____dataclass nm = new ____dataclass();

            nm.Index=1000;
            Console.WriteLine(">>" + nm.Index.ToString("00000000"));
        }
    }
    class ____dataclass
    {
        public int Index
        {get; set;}
    }
}


/*-----------------------------------------------------------------
1. 오버로딩 (Overloading)
"이름은 같지만 그냥 다른 함수"입니다.

2. 오버라이딩 (Overriding)
"부모에게 물려받아 변형한 함수"입니다.
상속의 개념이 들어갔으며 객체지향의 핵심 특징인 "다형성"과 밀접한 관련이 있습니다.

Ex)protected override void WndProc(ref Message m){}
---------------*/

/*
 * Console Time Handling & Log Overloading(Object Language Needed)
 */
using System;
using System.IO;
using System.Timers;

namespace ____java_is_package
{
    class Program
    {
        public static void Main(string[] args)
        {
            ____java_is_basic_class pro = new ____java_is_basic_class();
            pro.running();
        }
    }
    class ____java_is_basic_class
    {
        DateTime now;ConsoleKeyInfo keyinfo;Timer tm;
        int xpos,ypos;

        //function method overloading,--------------------------------
        //function method overloading,--------------------------------
        void Log(string msg){}
        void Log(string msg, ConsoleKeyInfo keytmp)
        {
            now=DateTime.Now;
            Console.WriteLine("KeyName:[" + keytmp.Key.ToString() + "]");
        }


        public void running(){}
        void Init()
        {
            tm = new Timer();
            tm.Elapsed += new ElapsedEventHandler(____time_tick_1);
            tm.Elapsed += new ElapsedEventHandler(____time_tick_2);
            tm.Elapsed += new ElapsedEventHandler(____time_tick_3);
            tm.Interval = 1000;
            tm.Start();
        }
        void Stop()
        {
            tm.Stop();
            tm.Elapsed -= ____time_tick_1;
            tm.Elapsed -= ____time_tick_2;
            tm.Elapsed -= ____time_tick_3;
        }
        void ____time_tick_1(object sender, ElapsedEventArgs e){}
        void ____time_tick_2(object sender, ElapsedEventArgs e){}
        void ____time_tick_3(object sender, ElapsedEventArgs e){}
    }
}


/*---------------------------------------------------------------
 * C#
 * public enum ConsoleKey

 * 사용방법
ConsoleKeyInfo keyinfo;
while(true)

    keyinfo=Console.ReadKey(true);
    if(keyinfo.Key==ConsoleKey.Escape) break;
}
-----------------------------------------------------------------*/

ConsoleKey.A 65 A 키입니다.
ConsoleKey.Add 107 더하기 키(숫자 키패드의 더하기 키).
ConsoleKey.Applications 93 애플리케이션 키(Microsoft Natural 키보드)입니다.
ConsoleKey.Attention 246 ATTN 키입니다.
ConsoleKey.B 66 B 키입니다.
ConsoleKey.Backspace 8 백스페이스 키입니다.
ConsoleKey.BrowserBack 166 브라우저 뒤로 키입니다.
ConsoleKey.BrowserFavorites 171 브라우저 즐겨찾기 키입니다.
ConsoleKey.BrowserForward 167 브라우저 앞으로 키입니다.
ConsoleKey.BrowserHome 172 브라우저 홈 키입니다.
ConsoleKey.BrowserRefresh 168 브라우저 새로 고침 키입니다.
ConsoleKey.BrowserSearch 170 브라우저 검색 키입니다.
ConsoleKey.BrowserStop 169 브라우저 중지 키입니다.
ConsoleKey.C 67 C 키입니다.
ConsoleKey.Clear 12 지우기 키입니다.
ConsoleKey.CrSel 247 CRSEL(CURSOR SELECT) 키입니다.
ConsoleKey.D 68 D 키입니다.
ConsoleKey.D0 48 0 키입니다.
ConsoleKey.D1 49 1 키입니다.
ConsoleKey.D2 50 2 키입니다.
ConsoleKey.D3 51 3 키입니다.
ConsoleKey.D4 52 4 키입니다.
ConsoleKey.D5 53 5 키입니다.
ConsoleKey.D6 54 6 키입니다.
ConsoleKey.D7 55 7 키입니다.
ConsoleKey.D8 56 8 키입니다.
ConsoleKey.D9 57 9 키입니다.
ConsoleKey.Decimal 110 점 키(숫자 키패드의 점 키).
ConsoleKey.Delete 46 Del(Delete) 키입니다.
ConsoleKey.Divide 111 나누기 키(숫자 키패드의 나누기 키).
ConsoleKey.DownArrow 40 아래쪽 화살표 키입니다.
ConsoleKey.E 69 E 키입니다.
ConsoleKey.End 35
ConsoleKey.Enter 13 Enter 키입니다.
ConsoleKey.EraseEndOfFile 249 ERASE EOF 키입니다.
ConsoleKey.Escape 27 Esc(ESCAPE) 키입니다.
ConsoleKey.Execute 43 실행 키입니다.
ConsoleKey.ExSel 248 EXSEL(EXTEND SELECTION) 키입니다.
ConsoleKey.F 70 F 키입니다.
ConsoleKey.F1 112 F1 키입니다.
ConsoleKey.F10 121 F10 키입니다.
ConsoleKey.F11 122 F11 키입니다.
ConsoleKey.F12 123 F12 키입니다.
ConsoleKey.F13 124 F13 키입니다.
ConsoleKey.F14 125 F14 키입니다.
ConsoleKey.F15 126 F15 키입니다.
ConsoleKey.F16 127 F16 키입니다.
ConsoleKey.F17 128 F17 키입니다.
ConsoleKey.F18 129 F18 키입니다.
ConsoleKey.F19 130 F19 키입니다.
ConsoleKey.F2 113 F2 키입니다.
ConsoleKey.F20 131 F20 키입니다.
ConsoleKey.F21 132 F21 키입니다.
ConsoleKey.F22 133 F22 키입니다.
ConsoleKey.F23 134 F23 키입니다.
ConsoleKey.F24 135 F24 키입니다.
ConsoleKey.F3 114 F3 키입니다.
ConsoleKey.F4 115 F4 키입니다.
ConsoleKey.F5 116 F5 키입니다.
ConsoleKey.F6 117 F6 키입니다.
ConsoleKey.F7 118 F7 키입니다.
ConsoleKey.F8 119 F8 키입니다.
ConsoleKey.F9 120 F9 키입니다.
ConsoleKey.G 71 G 키입니다.
ConsoleKey.H 72 H 키입니다.
ConsoleKey.Help 47 도움말 키입니다.
ConsoleKey.Home 36 HOME 키입니다.
ConsoleKey.I 73 I 키입니다.
ConsoleKey.Insert 45 Insert 키입니다.
ConsoleKey.J 74 J 키입니다.
ConsoleKey.K 75 K 키입니다.
ConsoleKey.L 76 L 키입니다.
ConsoleKey.LaunchApp1 182 애플리케이션 1 시작 키(Microsoft Natural 키보드)입니다.
ConsoleKey.LaunchApp2 183 애플리케이션 2 시작 키(Microsoft Natural 키보드)입니다.
ConsoleKey.LaunchMail 180 메일 실행 키(Microsoft Natural 키보드)입니다.
ConsoleKey.LaunchMediaSelect 181 미디어 선택 키(Microsoft Natural 키보드)입니다.
ConsoleKey.LeftArrow 37 왼쪽 화살표 키입니다.
ConsoleKey.LeftWindows 91 왼쪽 Windows 로고 키(Microsoft Natural 키보드)입니다.
ConsoleKey.M 77 M 키입니다.
ConsoleKey.MediaNext 176 미디어 다음 트랙 키입니다.
ConsoleKey.MediaPlay 179 미디어 재생/일시 중지 키입니다.
ConsoleKey.MediaPrevious 177 미디어 이전 트랙 키입니다.
ConsoleKey.MediaStop 178 미디어 중지 키입니다.
ConsoleKey.Multiply 106 곱하기 키(숫자 키패드의 곱하기 키).
ConsoleKey.N 78 N 키입니다.
ConsoleKey.NoName 252 나중에 사용하기 위해 예약된 상수입니다.
ConsoleKey.NumPad0 96 숫자 키패드의 0 키입니다.
ConsoleKey.NumPad1 97 숫자 키패드의 1 키입니다.
ConsoleKey.NumPad2 98 숫자 키패드의 2 키입니다.
ConsoleKey.NumPad3 99 숫자 키패드의 3 키입니다.
ConsoleKey.NumPad4 100 숫자 키패드의 4 키입니다.
ConsoleKey.NumPad5 101 숫자 키패드의 5 키입니다.
ConsoleKey.NumPad6 102 숫자 키패드의 6 키입니다.
ConsoleKey.NumPad7 103 숫자 키패드의 7 키입니다.
ConsoleKey.NumPad8 104 숫자 키패드의 8 키입니다.
ConsoleKey.NumPad9 105 숫자 키패드의 9 키입니다.
ConsoleKey.O 79 O 키입니다.
ConsoleKey.Oem1 186 OEM 1 키(OEM 특정)입니다.
ConsoleKey.Oem102 226 OEM 102 키(OEM 특정)입니다.
ConsoleKey.Oem2 191 OEM 2 키(OEM 특정)입니다.
ConsoleKey.Oem3 192 OEM 3 키(OEM 특정)입니다.
ConsoleKey.Oem4 219 OEM 4 키(OEM 특정)입니다.
ConsoleKey.Oem5 220 OEM 5 키(OEM 특정)입니다.
ConsoleKey.Oem6 221 OEM 6 키(OEM 특정)입니다.
ConsoleKey.Oem7 222 OEM 7 키(OEM 특정)입니다.
ConsoleKey.Oem8 223 OEM 8 키(OEM 특정)입니다.
ConsoleKey.OemClear 254 지우기 키(OEM 특정)입니다.
ConsoleKey.OemComma 188 국가/지역별 키보드의 OEM 쉼표 키입니다.
ConsoleKey.OemMinus 189 국가/지역별 키보드의 OEM 빼기 키입니다.
ConsoleKey.OemPeriod 190 국가/지역별 키보드의 OEM 마침표 키입니다.
ConsoleKey.OemPlus 187 국가/지역별 키보드의 OEM 더하기 키입니다.
ConsoleKey.P 80 P 키입니다.
ConsoleKey.Pa1 253 PA1 키입니다.
ConsoleKey.PageDown 34 <Page Down> 키입니다.
ConsoleKey.PageUp 33 Page Up 키입니다.
ConsoleKey.Pause 19 Pause 키입니다.
ConsoleKey.Play 250 재생 키입니다.
ConsoleKey.Print 42 인쇄 키입니다.
ConsoleKey.PrintScreen 44 Print Screen 키입니다.
ConsoleKey.Process 229 입력기 프로세스 키입니다.
ConsoleKey.Q 81 Q 키입니다.
ConsoleKey.R 82 R 키입니다.
ConsoleKey.RightArrow 39 오른쪽 화살표 키입니다.
ConsoleKey.RightWindows 92 오른쪽 Windows 로고 키(Microsoft Natural 키보드)입니다.
ConsoleKey.S 83 S 키입니다.
ConsoleKey.Select 41 선택 키입니다.
ConsoleKey.Separator 108 구분 기호 키입니다.
ConsoleKey.Sleep 95 컴퓨터 절전 키입니다.
ConsoleKey.Spacebar 32 스페이스바 키입니다.
ConsoleKey.Subtract 109 빼기 키(숫자 키패드의 빼기 키).
ConsoleKey.T 84 T 키입니다.
ConsoleKey.Tab 9 Tab 키입니다.
ConsoleKey.U 85 U 키입니다.
ConsoleKey.UpArrow 38 위쪽 화살표 키입니다.
ConsoleKey.V 86 V 키입니다.
ConsoleKey.VolumeDown 174 볼륨 작게 키(Microsoft Natural 키보드)입니다.
ConsoleKey.VolumeMute 173 볼륨 음소거 키(Microsoft Natural 키보드)입니다.
ConsoleKey.VolumeUp 175 볼륨 크게 키(Microsoft Natural 키보드)입니다.
ConsoleKey.W 87 W 키입니다.
ConsoleKey.X 88 X 키입니다.
ConsoleKey.Y 89 Y 키입니다.
ConsoleKey.Z 90 Z 키입니다.
ConsoleKey.Zoom 251 확대/축소 키입니다.

#비고)Makefile

CC=gcc
SRC=./
EXE=./
INC=./
CFLAGS=-DSERCMD - DDEBUG -DLOGGING -I.
LIBS = -lcrypt -lnsl -lm

BIN=$(EXE)
all: $(BIN)/sample \

.c.o:
    $(CC) $(CFLAGS) -c -g $*.c

#sample.c R_Option.c R_Future.c 가 모두 존재할경우에 Object는 아래와 같이 명시를 해줘야 한다.
$(BIN)/sample: sample.o R_Option.o R_Future.o
    $(CC) -o $@ sample.o  R_Option.o R_Future.o (LIBS) -s

clean:
    rm *.o

#구조체안에 선언되어진 함수 실행하기(함수를 구조체 변수로 갖는경우)
#구조체안에 선언되어진 함수 실행하기(함수를 구조체 변수로 갖는경우)

#명령인자에 따른 각각의 함수로 분기하는 경우에 사용되는 형태의 코드기법입니다.
#명령인자에 따른 각각의 함수로 분기하는 경우에 사용되는 형태의 코드기법입니다.

#주로 통신시에 서버와 클라이언트에서 주고받는 데이타에 따른 서버의 함수를 실행하고자 할때에 자주 사용됩니다.

#include<stdio.h>
#include<string.h>

#define SERCMD

typedef struct ser_map_t
{
    char *cpMethod;
    int (*fpProc)(char *, char *, char *);
}ser_map_t;

#ifdef SERCLI
int icsLoginClient (char *,char *,char *);
int icsDynBigSel (char *,char *,char *);
int icsCmdOsp (char *,char *,char *);
#endif

#ifdef SERCMD
int icsCmdOspMain(char *,char *,char *);
#endif

static ser_map_t ser_map_ims[] = 
{
#ifdef SERCLI
    { "login_client", icsLoginClient },
    { "dynbigsel", icsDynBigSel },
    { "cmd_osp_check", icsCmdOsp },
#endif
#ifdef SERCMD
    { "cmd_osp_check_s", icsCmdOspMain },
#endif
    { NULL,NULL }
};

int
icsCmdOspMain(char *Rcomm, char *Param, char *cppMsg)
{
    return(0);
}

int main(void)
{
    int iRet, kk, Tot;
    char *Rcomm, *Param, *cppMsg, method_cmd[100];

    memset(method_cmd,0x00,sizeof(method_cmd));    
    strcpy(method_cmd, "cmd_osp_check_s");

    Tot=(sizeof(ser_map_ims)/sizeof(ser_map_t))-1;
    for(kk=0; kk<Tot; kk++)
    {
        if(strcmp(method_cmd, ser_map_ims[kk].cpMethod)==0)
        {
            iRet=ser_map_ims[kk].fpProc(Rcomm,Param,cppMsg);
            printf("[%s]:[%d]\n",ser_map_ims[kk].cpMethod, iRet);
        }
    }
    return(0);
}

 

 

 

static ser_map_t ser_map_ims[] = 
{
#ifdef SERCLI
    {"cmd_ops_check", icsCmdOsp},
#endif

#ifdef SERCMD
    {"cmd_osp_check_s", icsCmdOspMain},
#endif
    {NULL,NULL}
};

위에서 SERCLI와 SERCMD는 위 코드전에 선언이 되어져 있어야 한다. 아래와 같이.
#define SERCLI
#define SERCMD

만약에 아무리 찾아봐도 없다면(???????)

Makefile을 열어보면 답을 알수 있다. 
------------------------------------------------------------------------------------------------------------
#define, -D옵션, CFLAGS, avr-gcc에서 Makefile의 CFLAGS, 인수(매개변수)가 있는 사용자 정의 함수
------------------------------------------------------------------------------------------------------------

CFLAGS=-DSERCMD 로 선언이 되어 있으면, 굳이 소스코드에 넣지 않아도 컴파일시에 반영이 되도록 할수 있다.

비고)Makefile

CC=gcc
SRC=./
EXE=./
INC=./
CFLAGS=-DSERCMD - DDEBUG -DLOGGING -I.
LIBS = -lcrypt -lnsl -lm

BIN=$(EXE)
all: $(BIN)/sample \

.c.o:
    $(CC) $(CFLAGS) -c -g $*.c

$(BIN)/sample: sample.o
    $(CC) -o $@ sample.o (LIBS) -s

clean:
    rm *.o

 


#컴파일과정에서 코드추가 가능(#define PIE 3.1416을 대신할수 있다.)
#컴파일과정에서 코드추가 가능(#define PIE 3.1416을 대신할수 있다.)

비고) Makefile 사용시에는 CFLAGS를 추가해서 구성할수 있다.

#include<stdio.h>
int main()
{
    int radius;
    float circumference;

    radius=5;
    circumference = (radius + radius) * PIE;

    printf("The circumference of circle is %7.2f \n", circumference);
    return(0);
}

>gcc -o sample sample.c
>PIE undeclared(first use in this function)
컴파일과정에서 코드추가 가능(#define PIE 3.1416을 대신할수 있다.)
>gcc -DPIE=3.1416 -o sample sample.c

가장 많이 사용하는 경우는 전처리기일것이다.

int main()
{
#ifdef INFO_DEBUG
printf("error ,mmmm1\n");
#endif

#ifdef ERROR_DEBUG
printf("error ,mmmm2\n");
#endif

printf("program terminated,mmmm\n");
}

gcc -o sample sample.c
or
gcc -DINFO_DEBUG -DERROR_DEBUG -o sample sample.c

닷넷 프레임워크

닷넷 프레임워크(.NET Framework, 이전 이름: 닷넷)는 마이크로소프트에서 개발한 윈도우 프로그램 개발 및 실행 환경이다. 
네트워크 작업, 인터페이스 등의 많은 작업을 캡슐화하였고, 
공통 언어 런타임(Common Language Runtime)(CLR)이라는 이름의 가상 머신 위에서 작동한다.

닷넷 프레임워크의 구조

.NET 프레임워크의 가장 중요한 콤포넌트는 공통 언어 기반(Common Language Infrastructure)이다. 
다른 말로 CLI라고 한다. 
CLI를 둔 목적은 애플리케이션의 개발과 실행 시 언어에 종속적이지 않은 플랫폼을 제공하기 위해서이다. 
예외 처리, 가비지 콜렉션, 보안, 호환 등을 위한 소프트웨어 콤포넌트를 포함한다. 
마이크로소프트가 구현한 CLI를 일컬어, 공통 언어 런타임(Common Language Runtime, CLR)이라고 한다.

 



#YYYY-MM-DD HH:MM:SS 에서 MM이 변경되면 출력
#YYYY-MM-DD HH:MM:SS 에서 MM이 변경되면 출력
#YYYY-MM-DD HH:MM:SS 에서 MM이 변경되면 출력

using System;
using System.IO;
using System.Timers;

namespace ____trigia_pyeongchon
{
    class Program
    {
        public static void Main(string[] args)
        {
            ___proud_hill pro = new ___proud_hill();

            pro.running();
        }
    }

    class ___proud_hill
    {
        ConsoleKeyInfo keyinfo;
        int xpos,ypos;
        Timer tm;
        string ____old_month, ____now_month;

        public void running()
        {
            tm = new Timer();
            tm.Interval = 1000;

            xpos=ypos=2;

            ____old_month="INIT";
            ____now_month="INIT";

            tm.Elapsed += new ElapsedEventHandler(__time_tick);
            tm.Start();

            Logging("Start");

            while(true)
            {
                keyinfo = Console.ReadKey(true);

                if(keyinfo.Key == ConsoleKey.RightArrow) xpos++;
                else
                if(keyinfo.Key == ConsoleKey.LeftArrow) xpos--;
                else
                if(keyinfo.Key == ConsoleKey.UpArrow) ypos++;
                else
                if(keyinfo.Key == ConsoleKey.DownArrow) ypos++;
                else
                if(keyinfo.Key == ConsoleKey.Escape) break;

                if(keyinfo.KeyChar=='+')
                {
                    tm.Stop();
                    tm.Interval += 10;
                    tm.Start();
                }
                else
                if(keyinfo.KeyChar=='-')
                {
                    tm.Stop();
                    tm.Interval -= 10;
                    tm.Start();
                }

                Logging("Key");
            }
            tm.Stop();
            tm.Elapsed -= __time_tick;

            Logging("Stop");
        }

        void __time_tick(object sender, ElapsedEventArgs e)
        {
            ypos++;

            Logging("Time");
        }

        void Logging(string msg)
        {
            DateTime now;

            now = DateTime.Now;

            ____now_month = now.ToString("mm");
            if(____now_month != ____old_month)
            {
                if(____old_month !="INIT" )
                {
                    Console.WriteLine("Minute is changed!!!!!, KeyBoard HIT is needed!!");
                }
            }

            Console.WriteLine("Debug>>Time:" + now.ToString("yyyy-MM-dd hh:mm:ss") + 
                  " YYYY:" + now.ToString("yyyy") + 
                  " MM:" + now.ToString("MM") + 
                  " mm:" + now.ToString("mm") + 
                  " Pos:[" + ypos.ToString("000000") + "," + xpos.ToString("000000") + "]" +
                  " Interval:" + tm.Interval + 
                  " Event:" + msg);
            ____old_month = ____now_month;
        }
    } //end of class
} //end of namespace





    

(BEGIN)RPUSH & BLPOP Usage-------------------------------------------------
1. 터미널에서 RPUSH 커맨드로 list2 키를 추가한다.
127.0.0.1:6379> RPUSH list2 a b c
(integer) 3

2. 터미널에서 BLPOP 커맨드를 호출한다. 리스트의 앞 엘리먼트부터 pop한 것을 확인할 수 있다.
127.0.0.1:6379> BLPOP list1 list2 0
1) "list2"
2) "a"

127.0.0.1:6379> BLPOP list1 list2 0
1) "list2"
2) "b"

127.0.0.1:6379> BLPOP list1 list2 0
1) "list2"
2) "c"

127.0.0.1:6379> BLPOP list1 list2 0
(블럭됨)
(END)RPUSH & BLPOP Usage-------------------------------------------------

c# code example(approximately)
c# code example(approximately)

RedisClient sendRedis = null;
RedisClient recvRedis = null;
byte[] jsonByteData = sendQueue.Dequeue();

int rc = sendRedis.RPush("QCS", jsonByteData);
jsonByteData = recvRedis.BLPop("CLI:" + ClientCurrentId.GetInstance.MyID,10);

#Redis의 기본지식이 필요하다.
#Redis의 기본지식이 필요하다.
#Redis의 기본지식이 필요하다.

#IDE를 이용해서, NuGet패키지관리자에서 StackExchange.Redis 검색및 설치를 진행합니다.
#IDE를 이용해서, NuGet패키지관리자에서 StackExchange.Redis 검색및 설치를 진행합니다.
#IDE를 이용해서, NuGet패키지관리자에서 StackExchange.Redis 검색및 설치를 진행합니다.

#Redis Server를 이용한 데이타 저장(Key,Value)과 불러오기(Key)
#Redis Server를 이용한 데이타 저장(Key,Value)과 불러오기(Key)
#Redis Server를 이용한 데이타 저장(Key,Value)과 불러오기(Key)

using StackExchange.Redis;

class Redis
{
    private ConnectionMultiplexer redisConnection;
    private IDatabase db;

    public Redis()
    {
        //
    }

    public bool Init(string host, int port)
    {
        try
        {
            this.redisConnection = ConnectionMultiplexer.Connect(host + ":" + port);
            if(this.redisConnection.IsConnected)
            {
                this.db = this.redisConnection.GetDatabase();
                return true;
            }
            return false;
        }
        catch(Exception e)
        {
            return false;
        }
    }
    //Load-------------------------------------------------
    public string GetString(string key)
    {
        return this.db.StringGet(key);
    }
    //Save--------------------------------------------------
    public string SetString(string key, string val)
    {
        return this.db.StringSet(key, val);
    }
}

#위의 Redis class를 이용한 실행프로그램은 다음글에서 작성할예정입니다.

/*
 * static Color [] fogarr = new Color[140];
 */

fogarr[0]= Color.FromArgb(240,248,255);
fogarr[1]= Color.FromArgb(255,160,122);
fogarr[2]= Color.FromArgb(250,235,215);
fogarr[3]= Color.FromArgb(32,178,170);
fogarr[4]= Color.FromArgb(0,255,255);
fogarr[5]= Color.FromArgb(135,206,250);
fogarr[6]= Color.FromArgb(127,255,212);
fogarr[7]= Color.FromArgb(119,136,153);
fogarr[8]= Color.FromArgb(240,255,255);
fogarr[9]= Color.FromArgb(176,196,222);
fogarr[10]= Color.FromArgb(245,245,220);
fogarr[11]= Color.FromArgb(255,255,224);
fogarr[12]= Color.FromArgb(255,228,196);
fogarr[13]= Color.FromArgb(0,255,0);
fogarr[14]= Color.FromArgb(0,0,0);
fogarr[15]= Color.FromArgb(50,205,50);
fogarr[16]= Color.FromArgb(255,255,205);
fogarr[17]= Color.FromArgb(250,240,230);
fogarr[18]= Color.FromArgb(0,0,255);
fogarr[19]= Color.FromArgb(255,0,255);
fogarr[20]= Color.FromArgb(138,43,226);
fogarr[21]= Color.FromArgb(128,0,0);
fogarr[22]= Color.FromArgb(165,42,42);
fogarr[23]= Color.FromArgb(102,205,170);
fogarr[24]= Color.FromArgb(222,184,135);
fogarr[25]= Color.FromArgb(0,0,205);
fogarr[26]= Color.FromArgb(95,158,160);
fogarr[27]= Color.FromArgb(186,85,211);
fogarr[28]= Color.FromArgb(127,255,0);
fogarr[29]= Color.FromArgb(147,112,219);
fogarr[30]= Color.FromArgb(210,105,30);
fogarr[31]= Color.FromArgb(60,179,113);
fogarr[32]= Color.FromArgb(255,127,80);
fogarr[33]= Color.FromArgb(123,104,238);
fogarr[34]= Color.FromArgb(100,149,237);
fogarr[35]= Color.FromArgb(0,250,154);
fogarr[36]= Color.FromArgb(255,248,220);
fogarr[37]= Color.FromArgb(72,209,204);
fogarr[38]= Color.FromArgb(220,20,60);
fogarr[39]= Color.FromArgb(199,21,112);
fogarr[40]= Color.FromArgb(0,255,255);
fogarr[41]= Color.FromArgb(25,25,112);
fogarr[42]= Color.FromArgb(0,0,139);
fogarr[43]= Color.FromArgb(245,255,250);
fogarr[44]= Color.FromArgb(0,139,139);
fogarr[45]= Color.FromArgb(255,228,225);
fogarr[46]= Color.FromArgb(184,134,11);
fogarr[47]= Color.FromArgb(255,228,181);
fogarr[48]= Color.FromArgb(169,169,169);
fogarr[49]= Color.FromArgb(255,222,173);
fogarr[50]= Color.FromArgb(0,100,0);
fogarr[51]= Color.FromArgb(0,0,128);
fogarr[52]= Color.FromArgb(189,183,107);
fogarr[53]= Color.FromArgb(253,245,230);
fogarr[54]= Color.FromArgb(139,0,139);
fogarr[55]= Color.FromArgb(128,128,0);
fogarr[56]= Color.FromArgb(85,107,47);
fogarr[57]= Color.FromArgb(107,142,45);
fogarr[58]= Color.FromArgb(255,140,0);
fogarr[59]= Color.FromArgb(255,165,0);
fogarr[60]= Color.FromArgb(153,50,204);
fogarr[61]= Color.FromArgb(255,69,0);
fogarr[62]= Color.FromArgb(139,0,0);
fogarr[63]= Color.FromArgb(218,112,214);
fogarr[64]= Color.FromArgb(233,150,122);
fogarr[65]= Color.FromArgb(238,232,170);
fogarr[66]= Color.FromArgb(143,188,143);
fogarr[67]= Color.FromArgb(152,251,152);
fogarr[68]= Color.FromArgb(72,61,139);
fogarr[69]= Color.FromArgb(175,238,238);
fogarr[70]= Color.FromArgb(40,79,79);
fogarr[71]= Color.FromArgb(219,112,147);
fogarr[72]= Color.FromArgb(0,206,209);
fogarr[73]= Color.FromArgb(255,239,213);
fogarr[74]= Color.FromArgb(148,0,211);
fogarr[75]= Color.FromArgb(255,218,155);
fogarr[76]= Color.FromArgb(255,20,147);
fogarr[77]= Color.FromArgb(205,133,63);
fogarr[78]= Color.FromArgb(0,191,255);
fogarr[79]= Color.FromArgb(255,192,203);
fogarr[80]= Color.FromArgb(105,105,105);
fogarr[81]= Color.FromArgb(221,160,221);
fogarr[82]= Color.FromArgb(30,144,255);
fogarr[83]= Color.FromArgb(176,224,230);
fogarr[84]= Color.FromArgb(178,34,34);
fogarr[85]= Color.FromArgb(128,0,128);
fogarr[86]= Color.FromArgb(255,250,240);
fogarr[87]= Color.FromArgb(255,0,0);
fogarr[88]= Color.FromArgb(34,139,34);
fogarr[89]= Color.FromArgb(188,143,143);
fogarr[90]= Color.FromArgb(255,0,255);
fogarr[91]= Color.FromArgb(65,105,225);
fogarr[92]= Color.FromArgb(220,220,220);
fogarr[93]= Color.FromArgb(139,69,19);
fogarr[94]= Color.FromArgb(248,248,255);
fogarr[95]= Color.FromArgb(250,128,114);
fogarr[96]= Color.FromArgb(255,215,0);
fogarr[97]= Color.FromArgb(244,164,96);
fogarr[98]= Color.FromArgb(218,165,32);
fogarr[99]= Color.FromArgb(46,139,87);
fogarr[100]= Color.FromArgb(128,128,128);
fogarr[101]= Color.FromArgb(255,245,238);
fogarr[102]= Color.FromArgb(0,128,0);
fogarr[103]= Color.FromArgb(160,82,45);
fogarr[104]= Color.FromArgb(173,255,47);
fogarr[105]= Color.FromArgb(192,192,192);
fogarr[106]= Color.FromArgb(240,255,240);
fogarr[107]= Color.FromArgb(135,206,235);
fogarr[108]= Color.FromArgb(255,105,180);
fogarr[109]= Color.FromArgb(106,90,205);
fogarr[110]= Color.FromArgb(205,92,92);
fogarr[111]= Color.FromArgb(112,128,144);
fogarr[112]= Color.FromArgb(75,0,130);
fogarr[113]= Color.FromArgb(255,250,250);
fogarr[114]= Color.FromArgb(255,240,240);
fogarr[115]= Color.FromArgb(0,255,127);
fogarr[116]= Color.FromArgb(240,230,140);
fogarr[117]= Color.FromArgb(70,130,180);
fogarr[118]= Color.FromArgb(230,230,250);
fogarr[119]= Color.FromArgb(210,180,140);
fogarr[120]= Color.FromArgb(255,240,245);
fogarr[121]= Color.FromArgb(0,128,128);
fogarr[122]= Color.FromArgb(124,252,0);
fogarr[123]= Color.FromArgb(216,191,216);
fogarr[124]= Color.FromArgb(255,250,205);
fogarr[125]= Color.FromArgb(253,99,71);
fogarr[126]= Color.FromArgb(173,216,230);
fogarr[127]= Color.FromArgb(64,224,208);
fogarr[128]= Color.FromArgb(240,128,128);
fogarr[129]= Color.FromArgb(238,130,238);
fogarr[130]= Color.FromArgb(224,255,255);
fogarr[131]= Color.FromArgb(245,222,179);
fogarr[132]= Color.FromArgb(250,250,210);
fogarr[133]= Color.FromArgb(255,255,255);
fogarr[134]= Color.FromArgb(144,238,144);
fogarr[135]= Color.FromArgb(245,245,245);
fogarr[136]= Color.FromArgb(211,211,211);
fogarr[137]= Color.FromArgb(255,255,0);
fogarr[138]= Color.FromArgb(255,182,193);
fogarr[139]= Color.FromArgb(154,205,50);

#Color class 배열을 이용한 다양한 색상나타내기
#Color class 배열을 이용한 다양한 색상나타내기

#현재 Form에 대한 this 핸들얻기
#현재 Form에 대한 this 핸들얻기

#Color 배열(140개)



using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Drawing2D;

class Program : Form
{
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_PAINT = 0x000F;
    private const int WM_CREATE = 0x0001;

    static Graphics graphics;
    static Font font;
    static Color [] fogarr = new Color[140]; //배열선언
    static int toggle=0;
    static int ____index=0;
    static Program fi;

    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Program());
    }

    static void __time_tick(object sender, ElapsedEventArgs e)
    {
        for (int h = 0; h <= 52; h++)
        {
            HatchStyle hs = (HatchStyle)h;
            Brush hb = new HatchBrush(hs, fogarr[____index % 140]);
            graphics.FillRectangle(hb, new Rectangle((h/26)*250, (h%26)*20, 50, 20));
            graphics.DrawString(hs.ToString(), font, Brushes.DarkGreen, (h/26)*250+50, (h%26)*20);
        }
        fi.Text = fogarr[____index % 140].ToString();
        ____index++;
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        switch(m.Msg)
        {
            case WM_PAINT:
            if(toggle==0)
            {
                this.Size = new Size(800,600);
                this.Text = "HatchStyle Window Information";

                graphics = this.CreateGraphics();
                font = new Font("고딕", 12, FontStyle.Bold);
                toggle=100;
            }
            break;
            case WM_CREATE :
               

                fi = new Program();
                fi = this;


                fogarr[0]= Color.FromArgb(240,248,255); //초기화 
                fogarr[1]= Color.FromArgb(255,160,122);
                fogarr[2]= Color.FromArgb(250,235,215);
                fogarr[3]= Color.FromArgb(32,178,170);
                fogarr[4]= Color.FromArgb(0,255,255);
                fogarr[5]= Color.FromArgb(135,206,250);
                /*
                ,, 자세한 Color.FromArgb List는 c#강의리스트에 올려놓았습니다. 참고부탁드려요.^
                */
                fogarr[134]= Color.FromArgb(144,238,144);
                fogarr[135]= Color.FromArgb(245,245,245);
                fogarr[136]= Color.FromArgb(211,211,211);
                fogarr[137]= Color.FromArgb(255,255,0);
                fogarr[138]= Color.FromArgb(255,182,193);
                fogarr[139]= Color.FromArgb(154,205,50);
                break;
            case WM_KEYDOWN :

            Keys keyCode = (Keys)m.WParam & Keys.KeyCode;

            if(keyCode.ToString() == "F1")
            {
                tm = new System.Timers.Timer();
                tm.Interval=100;
                tm.Elapsed += new ElapsedEventHandler(__time_tick);
                tm.Start();
            }
            else if(keyCode.ToString() == "F2")
            {

                if(tm != null)   //예외 사항체크
                {
                    tm.Stop();
                    tm.Elapsed -= __time_tick;
                }            }
            else
            {
                for (int h = 0; h <= 52; h++)
                {
                    HatchStyle hs = (HatchStyle)h;
                    Brush hb = new HatchBrush(hs, fogarr[____index % 140]);
                    graphics.FillRectangle(hb, new Rectangle((h/26)*250, (h%26)*20, 50, 20));
                    graphics.DrawString(hs.ToString(), font, Brushes.DarkGreen, (h/26)*250+50, (h%26)*20);
                }
                this.Text = fogarr[____index % 140].ToString();
                ____index++;
                break;
            }//end if else

        }//end of switch
    }//end of method
}//end of class

#컨트롤에 포커스가 자동으로 안갈 때
#컨트롤에 포커스가 자동으로 안갈 때
#컨트롤에 포커스가 자동으로 안갈 때
#컨트롤에 포커스가 자동으로 안갈 때



case WM_PAINT:
if(toggle==0)
{
this.Size = new Size(1000,600);
this.Text = "TRIS BY CONSOLE FORM";

graphics = CreateGraphics();
font = new Font("바탕체", 17, FontStyle.Bold);

toggle=100;

timer = new System.Timers.Timer();
timer.Interval = 800;
timer.Elapsed += new ElapsedEventHandler(__time_tick);
timer.Start();

mainBackColor = this.BackColor;

MessageBox.Show("TRIS START, Time Interval:" + timer.Interval);

//Form에 focus가 가도록 하기. 키보드 컨트롤을 이용할수 있다.
this.Activate();
this.Focus();


var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE); // 숨기기

init(ref t_tris, ref xpos, ref ypos, ref __design);
DrawTerisAll(t_tris);
}
break;

#설명:Windows10 Console창에서 실행하는 테트리스 프로그램 소스입니다.
#메모장에서 코드작성후에, C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe 로 컴파일 & 링크
#IDE는 사용하지 않습니다.(Visual Studio와 같은)

#HatchStyle 적용

#Tris Form Game by console base
#Tris Form Game by console base

#IDE(No Needed), Memo is sufficient, Window10 csc.exe is sufficient.

 

if(____t_tris[mm, nn]==0) 
{
#if false
    Brush brush = new SolidBrush(mainBackColor);
    graphics.FillRectangle(brush, 
    new Rectangle(50 + nn * ____WIDTH, 
                      40 + mm * ____HEIGHT, 
                      ____WIDTH-1, ____HEIGHT-1));
#endif   
  
#if true
    HatchStyle hs = (HatchStyle)____hatch_style;
    Brush hb = new HatchBrush(hs, mainBackColor);
    graphics.FillRectangle(hb, new Rectangle(50 + nn * ____WIDTH, 
                  40 + mm * ____HEIGHT, 
                  ____WIDTH-1, ____HEIGHT-1));
#endif   
}
else
{
#if false
    Brush brush = new SolidBrush(realBackColor[ ____t_tris[mm, nn] ]);
    graphics.FillRectangle(brush, 
                new Rectangle(50 + nn * ____WIDTH, 
                  40 + mm * ____HEIGHT, 
                  ____WIDTH-1, ____HEIGHT-1));
#endif   
  
#if true
    HatchStyle hs = (HatchStyle)____hatch_style;
    Brush hb = new HatchBrush(hs, realBackColor[ ____t_tris[mm, nn] ]);
    graphics.FillRectangle(hb, new Rectangle(50 + nn * ____WIDTH, 
                  40 + mm * ____HEIGHT, 
                  ____WIDTH-1, ____HEIGHT-1));
#endif   
}

 

#File Attach

f33.cs
0.04MB

Graphics graphics = CreateGraphics();
Graphics graphics = CreateGraphics();
Graphics graphics = CreateGraphics(); ????? 알아보도록 하자.

선 및 도형을 그리거나, 텍스트를 렌더링 하거나, GDI +를 사용 하 여 이미지를 표시 하 고 조작 하려면 먼저 Graphics 개체를 만들어야 합니다. Graphics개체는 GDI + 그리기 화면을 나타내며 그래픽 이미지를 만드는 데 사용 되는 개체입니다.

그래픽 작업에는 두 가지 단계가 있습니다.

  1. 개체 만들기 Graphics
  2. 개체를 사용 하 여 Graphics 선과 도형을 그리거나, 텍스트를 렌더링 하거나, 이미지를 표시 하 고 조작 합니다.

그래픽 개체 만들기

그래픽 개체는 다양 한 방법으로 만들 수 있습니다.

그래픽 개체를 만들려면

  • PaintEventArgs폼 또는 컨트롤의 경우의 일부로 그래픽 개체에 대 한 참조를 받습니다 Paint . 일반적으로 컨트롤의 그리기 코드를 만들 때 그래픽 개체에 대 한 참조를 가져오는 방법입니다. 마찬가지로, PrintPageEventArgs PrintPage 에 대 한 이벤트를 처리할 때 그래픽 개체를의 속성으로 가져올 수도 있습니다 PrintDocument .
  • 또는
  • 컨트롤이 나 폼의 메서드를 호출 하 여 CreateGraphics Graphics 해당 컨트롤이 나 폼의 그리기 화면을 나타내는 개체에 대 한 참조를 가져옵니다. 이미 존재 하는 폼 이나 컨트롤에 그리려는 경우이 메서드를 사용 합니다.
  • 또는
  • Graphics에서 상속 되는 개체에서 개체를 만듭니다 Image . 이 방법은 이미 존재 하는 이미지를 변경 하려는 경우에 유용 합니다.
  • 다음 섹션에서는 이러한 각 프로세스에 대 한 세부 정보를 제공 합니다.

Paint 이벤트 처리기의 PaintEventArgs

컨트롤 또는의에 대 한를 프로그래밍할 때 PaintEventHandler PrintPage PrintDocument 그래픽 개체는 또는의 속성 중 하나로 제공 됩니다 PaintEventArgs PrintPageEventArgs .

Paint 이벤트의 PaintEventArgs에서 그래픽 개체에 대 한 참조를 가져오려면

  1. 개체를 선언 Graphics 합니다.
  2. 의 일부로 전달 된 개체를 참조 하는 변수를 할당 합니다 Graphics PaintEventArgs .
  3. 폼 이나 컨트롤을 그리는 코드를 삽입 합니다.C#복사
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs pe) { // Declares the Graphics object and sets it to the Graphics object // supplied in the PaintEventArgs. Graphics g = pe.Graphics; // Insert code to paint the form here. }
  4. 다음 예제에서는 이벤트의에서 개체를 참조 하는 방법을 보여 줍니다 Graphics PaintEventArgs Paint .

CreateGraphics 메서드

CreateGraphics컨트롤이 나 폼의 메서드를 사용 하 여 Graphics 해당 컨트롤이 나 폼의 그리기 화면을 나타내는 개체에 대 한 참조를 가져올 수도 있습니다.

CreateGraphics 메서드를 사용 하 여 그래픽 개체를 만들려면

  • CreateGraphics그래픽을 렌더링 하려는 폼 이나 컨트롤의 메서드를 호출 합니다.Graphics g; // Sets g to a graphics object representing the drawing surface of the // control or form g is a member of. g = this.CreateGraphics();
  • C#복사

이미지 개체에서 만들기

또한 클래스에서 파생 되는 모든 개체에서 그래픽 개체를 만들 수 있습니다 Image .

이미지에서 그래픽 개체를 만들려면

  • 개체를 Graphics.FromImage 만들려는 이미지 변수의 이름을 제공 하 여 메서드를 호출 합니다 Graphics .C#복사
    Bitmap myBitmap = new Bitmap(@"C:\Documents and Settings\Joe\Pics\myPic.bmp"); Graphics g = Graphics.FromImage(myBitmap);
  • 다음 예제에서는 개체를 사용 하는 방법을 보여 줍니다 Bitmap .

 참고

Graphics16 비트, 24 비트 및 32 비트 .bmp 파일과 같은 인덱싱되지 않은 .bmp 파일의 개체만 만들 수 있습니다. 비인덱스 .bmp 파일의 각 픽셀은 색 테이블에 대 한 인덱스를 포함 하는 인덱싱된 .bmp 파일의 픽셀과 달리 색을 포함 합니다.

모양 및 이미지 그리기 및 조작

개체를 만든 후에 Graphics 는 개체를 사용 하 여 선과 셰이프를 그리거나, 텍스트를 렌더링 하거나, 이미지를 표시 하 고 조작할 수 있습니다. 개체와 함께 사용 되는 보안 주체 개체는 Graphics 다음과 같습니다.

  • Pen클래스-선 그리기, 모양 개요 또는 다른 기하학적 표현 렌더링에 사용 됩니다.
  • Brush클래스-채워진 도형, 이미지 또는 텍스트와 같은 그래픽 영역을 채우는 데 사용 됩니다.
  • Font클래스-텍스트를 렌더링할 때 사용할 도형에 대 한 설명을 제공 합니다.
  • Color구조는 표시할 여러 색을 나타냅니다.

만든 그래픽 개체를 사용 하려면

C# 콘솔프로그램에서 콘솔창 숨기기
C# 콘솔프로그램에서 콘솔창 숨기기
C# 콘솔프로그램에서 콘솔창 숨기기

C# 콘솔프로그램에서 실행되는 콘솔창을 숨기기 위한 방법이다.

class안에 아래와 같이 선언한다.
[DllImport(“kernel32.dll”)]
static extern IntPtr GetConsoleWindow();

[DllImport(“user32.dll”)]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0; // 숨기기
const int SW_SHOW = 1; // 보이기

2.  main 함수 안에 아래의 코드를 입력한다.

var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE); // 숨기기
ShowWindow(handle, SW_SHOW); // 보이기

3. 실행

요약 
모든 데이터를 오브젝트(object;물체)로 취급하여 프로그래밍 하는 방법으로, 처리 요구를 받은 객체가 자기 자신의 안에 있는 내용을 가지고 처리하는 방식이다.


이 개념은 1960년 중엽에 유행한 시뮬레이션 언어의 SIMURA에서 유래한 것이다. 모든 데이터를 오브젝트(object:물체)로 취급하며, 이 오브젝트에는 클래스(class:類)의 개념이 있어서 상위(上位)와 하위(下位)의 관계가 있다. 클래스의 구체적인 예가 인스턴스(instance)이다. 오브젝트 사이는 메시지의 송신(送信)으로 상호 통신한다. 가장 특징적인 것은 각 클래스에 그 메시지를 처리하기 위한 방식이 있다는 것이다. 어떤 인스턴스에 메시지가 도래하면 그 상위 클래스가 그것을 처리한다. 현재 오브젝트지향개념은 프레임 표현형식과 융합하여 인공지능을 위한 소프트웨어 기법(技法)의 하나로 되어 있다.

객체지향프로그램은 C, Pascal, BASIC 등과 같은 절차형 언어(procedure-oriented programming)가 크고 복잡한 프로그램을 구축하기 어렵다는 문제점을 해결하기 위해 탄생된 것이다. 절차형 언어에서는 코드 전체를 여러 개의 기능부분 즉, 인쇄하는 기능부분과 유저로부터의 입력을 받는 기능부분 등으로 분할하는데, 이와 같이 각 기능부분을 구성하는 코드를 모쥴이라고 한다. 절차형 언어에서는 프로그램을 여러 기능으로 나누고 이들 모쥴을 편성하여 프로그램을 작성할 경우, 각 모쥴이 처리하는 데이터에 대해서는 전혀 고려하지 않는다. 다시 말하면 데이터 취급이 완전하지 않고 현실 세계의 문제를 프로그램으로서 표현하는 것이 곤란하다.

이러한 절차형 프로그래밍이 가지는 문제를 해결하기 위해 탄생된 객체지향프로그래밍은 객체라는 작은 단위로서 모든 처리를 기술하는 프로그래밍 방법으로서, 모든 처리는 객체에 대한 요구의 형태로 표현되며, 요구를 받은 객체는 자기 자신 내에 기술되어 있는 처리를 실행한다. 이 방법으로 프로그램을 작성할 경우 프로그램이 단순화되고, 생산성과 신뢰성이 높은 시스템을 구축할 수 있다.

#C# 에서의 [STAThread] 는 왜 붙이는가? (Why STAThread is attached above C# ?)

C# 코드에서 [STAThread] 가 의미하는 바는 기본적으로, VS .NET에 의해 만들어진 응용 프로그램의 Main()메소드에는 [STAThread] 라는 속성으로 되어 있다. 
하지만 COM 형식을 이용하는 경우엔 [STAThread]  라는 것으로  해당 응용 프로그램이 COM형식을 이용하는 경우에 (단지 이 경우에만 해당하는 것인데) 해당 응용 프로그램이 단일 스레드 아파트(single threaded apartment, STA) 모델로 설정되어야 한다는 것을 런타임에게 알려주는 역할을 한다. 
즉 다중쓰레드로 동작하지 않는다는 것을 알려주는것이다. 
해당 응용 프로그램에서 COM 형식을 이용하지 않는다면, [STAThread] 어트리뷰트는 무시되기 때문에 삭제해도 무방하다.

+ Recent posts