Delegate(대리자)

delegate는 명명된 메서드나 익명 메서드를 캡슐화하는 데 사용할 수 있는 참조 형식입니다. 대리자는 C++의 함수 포인터와 비슷하지만 형식 안전성과 보안성을 제공한다는 점이 다릅니다

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

namespace DeclareaDelegate
{
    class MathClass
    {
        public void MultiplyNumber(int m, double n)
        {
            Console.WriteLine(m * n + "");
        }
    }
    delegate void del(int i,double j);
    class Program
    {
        static void Main(string[] args)
        {
            MathClass m = new MathClass();
            
            del d = m.MultiplyNumber;
            Console.WriteLine("Invoking the delegate using 'MultiplyNumbers':");
            for (int i = 1; i <= 5; i++)
            {
                d(i, 2);
            }
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }

}


'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
c# 기초  (0) 2016.11.30
마샬링(marshalling)  (0) 2016.11.30





csc /t:module IStudy.cs
csc /t:module ITeach.cs
csc /t:library /addmodule:IStudy.netmodule,ITeach.netmodule MyInterface.cs
csc /t:library Man.cs
csc /t:library /r:Man.dll,MyInterface.dll Stu.cs
csc /t:library /r:Man.dll,MyInterface.dll Tea.cs
csc /t:library /r:Man.dll,MyInterface.dll,Stu.dll StuTea.cs
csc /t:library /r:Man.dll,MyInterface.dll,Tea.dll TeaStu.cs
csc /t:library /r:Stu.dll,MyInterface.dll,Man.dll Library.cs
csc /t:library /r:Tea.dll,MyInterface.dll,Man.dll ReadyRoom.cs
csc /t:library /r:MyInterface.dll LecturRoom.cs
csc /t:library MyMethod.cs
csc /t:library /r:Stu.dll,StuTea.dll,Tea.dll,TeaStu.dll,Man.dll,MyInterface.dll ShowWindow.cs

csc /t:library /r:Stu.dll,StuTea.dll,Tea.dll,TeaStu.dll,Man.dll,ShowWindow.dll,MyMethod.dll,LecturRoom.dll,ReadyRoom.dll,Library.dll,MyInterface.dll Sumbit.cs
csc /t:exe /r:Sumbit.dll Program.cs


'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
c# 기초  (0) 2016.11.30
마샬링(marshalling)  (0) 2016.11.30
.Net is a for Web-Service.

COM 전략의 실패 - 레지스트리에 등록
-> 서비스 벤더 자체 프로토콜

JVM : .NET 플랫폼 - 미들웨어

App
M/W
Native

C++
Reference 형식 
형식 불안정

java .NET
형식안정적 -> 세대조사 0세대,1세대,2세대(세대조사 이유.성능저하)



.NET 3가지특징
- CTS Common type system 
- CLS Common Language Specification 공용언어를 사용시 최소한에 지켜야할 사항(외부로 노출된 것을 공용으로 사용할수 있는것으로)
- CIR Common Language Runtime 
핵심 -> jitter = Just It Tiem Complier , 공통라이브러리(COL)로딩

/////////////////////////////////////////////////////////////////////////////////
c#
형식(type)

value 
-구조체
- int
- char
- bool
   .
   .   
-열거형

reference
- Class
- delegate(암시적 Class)
- interface (Class로 취급해도 문제없음)
- string (동작은 value 처럼 사용해도 지장없음)

value 형은 Stack영역에 활당

reference 형은 Heap 영역에 활당
참조된 변수를 null로 바꿔주는 것 만으로도 효과적

objectClass
value type
reference type


int i = 7;
object o = i; // Boxing

int k = (int)o; // UnBoxing

제러릭(템플릿과 비슷)
제러릭 컬릭셕(성능에 향상) value 형식을 컨터이너에 보관할때 

foreach - 열거 가능한 형식에 대해서만 가능
 
Arraylist ar = new Arraylist();

ar.Add(3);
ar.Add(6);
ar.Add(8);

foreach(int i in ar)
{
Console.WiteLine(i.ToString());
}

OOP 3대속성
캡슐화
- 필드
- 상수
- 읽기전용
- 메소드
- 속성
- 등등등~

class stu
{
const int val = 7; (컴파일시)
readonly int num = 9; or 생성자에서만 초기화 가능! 
static readonly int num; // 가능 (런타임시)
}

상속(파생),다형성

abstract class stu
//클래스내에 순수가상함수가 하나도 없어도 해당 클래스를 생성할 수 없다
abstract 메소드 = 순수가상함수

BaseClass에 void Foo() 라는 메소드를 파생 클래스에서 무효화 하려면
파생Class 내에 new void Foo() 라 명시하면 BaseClass에 void Foo()는 무효화

sealed class stu  봉인 클래스
봉인된 클래스는 base클래스가 될 수 없다


다형성에서 주의사항

-기반 클래스는 하나만 명시가능 맨 앞에 명시 (다중상속 x) 
class MStu : Stu, IStudy //맨 앞이 기반 클래스 뒤로 인터페이스
{
}

구현약속
interface IStudy
{
void Study(); /// abstract,public
}


형식변환
RTTI

형식확인
is 연산 value 형식에 대해 사용을 많이 함
object o;
if(o is int)
if(o is char)

as 연산 //reference 형식만가능
int i = o as int;// 불가능
참이면 값대입 거짓이면 null 대입

Teacher t = o as Teacher;
if( t != null)
{
불라불라~
}


연산자 중복정의  
== 와 != 같이 정의해야됨~~
다른경우도 마찬가지
class Foo
{
int i;
public Foo(int _i){i = _i;}
public static bool operator == (Foo f, Foo f2)
{
return f.i == f2.i;
}
public static bool operator !=(Foo f, Foo f2)
{
return f.i != f2.i;
}
}

//명시적
class Foo
{
int i;
public static explicit operator int(Foo foo)
{
return foo.i;
}
public static explicit  operator Foo(int v)
{
return new Foo(v);
}
}

Foo foo = new Foo(3);
int i = (int)foo;

Foo foo2 =(Foo)i;


//위와 비슷
//암시적
class Foo
{
int i;
public implicit operator int(Foo foo)
{
return foo.i;
}
public implicit operator Foo(int v)
{
return new Foo(v);
}
}
Foo foo = new Foo(3);

int i = foo;

Foo foo2 =i;

속성 
   class stu
    {
        int score;
        public int socre
        {
            get
            {
                return socre;
            }
            protected set //비대칭 속성
            {
                if (AvailSocre(value))
                {
                    socre = value;
                }
            }
        }

        private bool AvailSocre(int value)
        {
            return (value <= 100);
        }
    }


static 

    static class MyGeneral //모든 맴버 가 static 이여야 한다.
    {
        static public int Add(int a, int b)
        {
            return a + b;
        }
    }

    class MyGeneral
    {
        static int num;
        static MyGeneral() //  static 생성자 입력 매개변수 접근 사용자를 명시할수 없음. static 생성자는 .NET 스스로 호출
        {
            num = 0;
        }
    }


class Book
    {
    }
    class MyGeneral
    {
        const int num = 5;
        static readonly Book book;
        static MyGeneral() 
        {
            book = new Book();
        }
    }

    class Book
    {
    }
    class MyGeneral
    {
        static const Book book2 = new Book();
        static readonly Book book;
        static MyGeneral() 
        {
            book = new Book();
        }
    }



상속
    class BaseClass
    {
        public BaseClass(int a)
        {
        }
        public virtual void Foo()
        {
        }
       
    }

    class Derived : BaseClass
    {
        public Derived() : base(8)
        {
        }
        public override void Foo()
        {
            base.Foo();
        }        
    }
//입력매개변수가 없는 생성자는 구조체에 선언 할 수 없다.
순수 가상함수 상속 abstract

 abstract class BaseClass
    {
        public BaseClass(int a)
        {
        }
        public abstract void soo();

        public virtual void Foo()
        {
        }
       
    }

    class Derived : BaseClass
    {
        public Derived() : base(8)
        {
        }
        public override void Foo()
        {
            base.Foo();
        }
        public override void soo()
        {
            throw new NotImplementedException();
        }
    }


강제 소멸자
    abstract class BaseClass : IDisposable
    {
        bool check;
        public BaseClass(int a)
        {
        }
        public abstract void soo();
        public void Dispose()
        {
            if (check == false)
            {                
                GC.SuppressFinalize(this);
                check = true;
            }
        }


입력 매개변수 전달 유형

return , in, out , ref

ref

       void Foo()
        {
            int i = 2;
            Soo(ref i);
        }
        void Soo(ref int i)
        {
            if ((i % 2) == 0)
            {
                i = 3;
            }
        }

out

    class BaseClass
    {
        public void Foo()
        {
            int i = 3;
            int j = 9;
            int max;
            int u = Add(i, j, out max);
            Console.WriteLine("{0},{1}",u,max);
        }
        int Add(int a, int b, out int v)
        {
            v = b;
            if (a > b)
            {
                v = a;
            }
            return a + b;
        }
    }


배열

Array 클래스에서 부터 파생
int [ ] arr = new int[7];
int[ , ] arr = new int[3,4];
int [][] arr = new int [3][]; 제그드배열~~~~~~~~지그제그지그제그
arr[0] = new int [2];
arr[1] = new int[10];
arr[2] = new int[5];

foreach(int []ar in arr)
{
foreach(int i in ar)
{
Console.WiteLine(i.ToString);
}
}


Arrage.Sort(arr); // 비교가 가능한 대상이라면 정렬가능

string

string s = string.Empty; // 습관처럼 이용

문자열은 char의 읽기전용 컬렉션이다!

조합을 사용할때
StringBuilder sb = new StringBuilder("hello");
사용이 효율적
string s;
s = string.format("{0}{1}","asdasd",asdasdasdasd"); 이런식으로



인터페이스

 interface IStudy
    {
        void Study();
        void Work();
        int Num // 이런것도 가능
        {
            get;
            set;
        }
    }
    interface ITeach
    {
        void Teach();
        void Work();
    }
    class Man
    {
    }
    class Stu : Man, IStudy,ITeach
    {        
        public void Study()
        {
        }
        public void Teach()
        {
        }
        void ITeach.Work()
        {
        }
        void IStudy.Work()
        {
        }
        int IStudy.Num
        {
            get;
            set;
        }

    }


'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
마샬링(marshalling)  (0) 2016.11.30
마샬링(marshalling)
마샬링이란 컴퓨터 프로그래밍에서 하나 이상의 프로그램 또는 연속되어 있지 않은 저장 공간으로 부터
데이터를 모은 다음, 데이터들을 메시지 버퍼에 집어넣고, 특정 수신기나 프로그래밍 인터페이서에 맞도록 그 데이터를 조직화 하거나, 미리 정해진 다른 형식으로 변환하는 과정을 말한다. 마샬리은 대체로, 어떤 한 언어로 작성된 프로그램의 출력 매개변수들을 다른 언어로 작성된 프로그램의 입력으로 전달해야 하는 경우에 필요하다. 

반면,  언마샬링은...
 
마샬링을 통해 보내진 데이터들을 원래 구조로 복원시키는 것이다. 이러한 의미에서  개체 입출력을 위해 개체를 직렬화serialize 하고 복원deserialize 하는 과정과 비슷합니다. 다만 마샬링과 언마샬링은 단순한 데이터의 직렬화가 아니라, 구조화된 대상들에 대해 구조 해체/복원이 개입할 때 사용하는 개념이라는 점이 다릅니다.

실매개변수
프로그래밍 언어에서 프로시저나 함수를 호출할 때 호출하는 쪽에서 실제로 넘겨주는 변수 또는 수식. 이는 실행시에 그 값에 계산되어 프로시저의 형식 인수(formal parameter)에 대응되어 넘겨진다.
 
void int foo(int num) <-형식매개변수
foo(20); <- 실매개변수


'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
c# 기초  (0) 2016.11.30

interface IAverage : IUnknown

{

virtual int __stdcall Average(int *base,int asize)=0;

};



interface ICal: IUnknown

{

virtual int __stdcall Add(int a,int b)=0;

virtual int __stdcall Sub(int a,int b)=0;

virtual int __stdcall Mul(int a,int b)=0;

virtual int __stdcall Div(int a,int b)=0;

};


DLL만들기 예제

FactoryDll.zip



DLL지옥

DLL지옥(dll hell)은 마이크로소프트 윈도우 기반의 프로그램에서 DLL을 사용할 경우
발생할 수 있는 복잡성을 뜻하는 말이다. 이용어는 릭 엔더슨이 2000년 1월에발표한 <DLL지옥의 종말>>이라는 문서를 통해 대중에 소개되었따 그 전에는 잠시 동안 마이크로소프트 내부에서 사용되었다.DLL 지옥은 DLL을 관리할 때 발생할 수 있는 모든 문제를 뜻한다. 여기에는 DLL 버전 충돌 문제, 프로그램이 의존하는 DLL파일을 찾을 때의 어려움, 불필요한 DLL파일 복사본이 만들어지는 문제 등이 포함된다. DLL 지옥은 잠재적인 운영체제 설계 결함의 한 예이다. 이결함으로 인해 잘 작성된 프로그램도 문제를 일으킬 수 있는데, 이는 허술하게 작성된 프로그램의 나쁜 프로그래밍 습관이나 버그로부터 영항을 받을 받을 수 있고, 이를 운영체제가 묵인하기 때문이다.


출처 : 위키백과


 MFC 그림판 연습


기본적으로 생성되는 MainWnd, App, ViewWnd를 제외한 클래스에 대해 설명하겠습니다.

PaintaManager View 클래스에서 너무 많은 일을 하게 되니깐 PaintManager에서 실질적인 처리를 하게됩니다 View 클래스는 어떤 일이 발생하게 되면 PaintManager의 메시지를 호출 하게됩니다. Document Paint을 관리합니다. Pen, Rect, uEllipse, uLine Paint을 상속받았습니다

기본적인 파일 저장이 가능하며 메타파일 형태로 저장하여 동작합니다.


첨부파일 있음.


Picture.zip


'Programing > MFC' 카테고리의 다른 글

ON_UPDATE_COMMAND_UI  (0) 2016.11.30

ON_UPDATE_COMMAND_UI 매크로

Visual Studio .NET 2003

속성 창을 사용하여 사용자 인터페이스 개체를 명령 대상 개체의 명령 업데이트 처리기에 연결할 수 있습니다. 이렇게 하면 사용자 인터페이스 개체의 ID가 ON_UPDATE_COMMAND_UI 매크로에 자동으로 연결되고 업데이트를 처리할 개체에 처리기가 만들어집니다. 자세한 내용은 함수에 메시지 매핑을 참조하십시오.

예를 들어, 프로그램의 편집 메뉴에서 모두 지우기 명령을 업데이트하려면, 속성 창을 사용하여 선택한 클래스의 메시지 맵 엔트리, 클래스 선언에서 호출된 명령 업데이트 처리기 OnUpdateEditClearAll에 대한 함수 선언, 클래스 구현 파일에 있는 빈 함수 템플릿 등을 추가합니다. 함수 프로토타입은 다음과 같습니다.

afx_msg void OnUpdateEditClearAll( CCmdUI* pCmdUI );

모든 처리기와 마찬가지로 이 함수도 afx_msg 키워드를 표시합니다. 또한 모든 업데이트 처리기와 마찬가지로 이 함수도 CCmdUI 개체에 대한 포인터를 인수로 사용합니다.


'Programing > MFC' 카테고리의 다른 글

MFC 그림판  (0) 2016.11.30

응용프로그램의 연결된 소켓이 스트림 소켓(stream socket)이고 일반 데이터보다 중요한 데이터를 전송해야 할 떄,

좀 더 중요한 데이터라는 의미에서 대역 외 데이터(OOB data, Out-of-Band Data)로 데이터를 표시 할 수 있다.

수신측에서는 일반적인 데이터 스트림 외에 논리적으로 분리된 채널을 통하여 OOB 데이터를 수신할 수 있다.


TCP에서는 OOB 데이터를 urgent data라는 방식으로 구현했다. TCP의 urgent data는 urgent data임표시하는

1bit(URG)와 TCP 세그먼트 헤더(TCP segment header)의 16bit포인터(urgent pointer)를 이용하여 수신

스트림(downstream)이 urgent data임을 표시한다. urgent data의 구현 방법 두 가지가 RFC 793와 RFC 1122에

정의되어 있다. RFC 793에서는 TCP 헤더의 urgent pointer를 뒤에 붙은 urgent data byte의 옵셋으로 정의하고

있고 RFC 1122에서는 urgent data byte 자체로 정의하고 있다.


윈속 규약에서 OOB란 용어는 TCP에서 구현된 OOB 데이터(urgent data)와 프로토콜 독립적인 OOB 데이터(protocol-independent OOB data)의

구현 둘 다를 의미한다. 데이터에 OOB 데이터가 포함되었는지 체크하는 방법으로 ioctlsocket 함수의 SIOCALTMARK

옵션을 이용한다.


윈속은 urgent data를 얻는 몇가지 방법을 제공한다. urgent data가 일반 데이터 스트림에 포함되었거나 수신 함수가 분리되어 

urgent data만 얻을 수 있다.

'Programing > WSP&WNP' 카테고리의 다른 글

TCP/IP 개념  (0) 2016.11.30

1. TCP/IP 배경

 - 1960년대 말 미국방성(DARPA)연구에서 시작

1980년대초 프로토콜 모델 공개, 인터넷 표준 프로토콜로 이용

 

2. 배우는 목적 및 이유

 - 현재 인터넷 이용 시 가장 많이 사용하는 프로토콜이 TCP 와 IP 입니다.

그러므로 이 프로토콜을 모르면 네트워크가 어떻게 돌아가는지를 알 수 없습니다.

네트워크 관련 업무를 하려면 TCP/IP 에 대한 지식은 필수 입니다.

 

3. 내용

 - TCP/IP 는 현재 가장 널리 사용되고 있는 프로토콜로 TCP/IP 모델이라는게 있습니다.

총 5계층으로 나누어 지며 이 모델 사용 목적은 표준화 용이, 트러블 슈팅 용이 등이 있습니다.

그리고 5계층 모델은 다음과 같이 나뉘어 집니다.

 

5계층 : 응용 프로그램(Application) 계층         

4계층 : 전송(Transport) 계층

3계층 : 인터넷(Internet) 계층

2계층 : 데이터 링크(Datalink) 계층

1계층 : 물리(Physical) 계층

 

로 나뉘어 집니다. 각 계층별로 하는 역할이 틀리며 각 계층별 사용하는 프로토콜 또한 다릅니다.

 

응용프로그램 계층의 역할은 TCP/IP 응용 프로그램 프로토콜을 정의하고 호스트 프로그램이 전송

계층 서비스에 연결하여 네트워크를 사용하는 방법을 정의합니다.

대표적인 프로토콜 : http, telnet, ftp, tftp, snmp, dns, smtp, x windows 등등

 

전송 계층의 역할은 호스트 컴퓨터 사이의 통신 세션을 관리합니다. 데이터를 전송할 때 사용되는

서비스 수준 및 연결상태를 정의 합니다.

대표적인 프로토콜 : tcp, udp, rtp

 

인터넷 계층의 역할은 호스트 및 네트워크 간에 데이터그램을 전달하는 데 사용되는 원본주소 및 대상 주소

정보가 들어있는 IP 데이터그램으로 데이터를 묶습니다. IP 데이터그램을 라우팅 합니다.

대표적인 프로토콜 : ip, icmp, arp, rarp 등등

 

데이터링크 계층의 역할은 네트워크 매체에 직접 연결된 하드웨어 장치가 비트에 전기적인 신호를 보내는

방법을 포함하여 데이터가 네트워크를 통해 실제로 전달되는 방법에 대한 세부 정보를 지정 합니다.

대표적인 프로토콜 : 이더넷, 토큰링, 프레임릴레이 등등

 

물리 계층의 역할은 동축케이블, 광섬유, 또는 꼬인 구리선과 같은 케이블로 장비와 장비사이를 연결해주는

역할을 합니다.

 

TCP/IP 에 대한 최근 이슈는 현재 표준으로 사용중인 IPv4 를 점진적으로 IPv6 로 교체해 나가고 있다는

것입니다. 그 이유는 IPv4 보다 IPv6 가 멀티미디어 서비스를 제공하는데 더욱 적합한 기능을 하며

현재 IPv4 의 여유 IP 개수가 거의 다 떨어졌기 때문입니다.

반면 IPv6 는 거의 무한한 개수의 IP를 사용이 가능하기 때문에 현재 IPv4 에서 IPv6 로 교체 중인 작업이

세계에서 진행 중 입니다.

'Programing > WSP&WNP' 카테고리의 다른 글

대역 외 데이터(Out-of-Band Data)  (0) 2016.11.30

+ Recent posts