델리게이트(delegate)는 C#에서 함수포인터와 비슷한 역활을 담당한다.


우선 함수포인터에 대해서 알아보자.


함수포인터는 함수의 주소값을 저장하는 역활을 한다.


1
2
3
4
5
6
7
8
int (*p)(int,int);
 
int add(int a, int b){
    return a+b;
}
= add;
p(3,2); // 5 리턴
 
cs


위와 같이 p가 함수포인터이다. 함수의 이름이 곧 함수의 주소값이기 때문에 p = add로 함수의 주소값을 함수포인터 p에 저장하였다.


함수 포인터와 같이 델리게이트(delegate)역시 함수를 대리호출 할 수 있다.


C#에서 함수포인터가 없고 델리게이트란 개념을 새로 만든 것은 포인터대신 참조자인 ref를 사용하는 것과 같은 이유이다.


주소값을 직접 저장하고 다루면 위험하기 때문이다.


사용자에게 주소값을 직접 다루지 않아도 포인터와 같은 역활을 하는 개념을 만든 것이다.


아래와 같은 형식으로 선언하면 된다.



delegate 반환형식 델리게이트이름 (매개변수 목록);


1
2
3
4
5
6
7
8
delegate int TestDele(int a,int b);
 
int add(int a, int b) {
    return a+b;
}
TestDele dele = new TestDele(add);
dele(3,2); //5 리턴
 

cs


델리게이트(delegate) 체인은 하나의 델리게이트 안에 여러개의 함수를 연결하여 연쇄적으로 호출하는 방식이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
delegate void testDele();
static void Main(string[] args)
{
            
    void print1()
    {
        Console.WriteLine("print1");
    }
    void print2()
    {
        Console.WriteLine("print2");
    }
    void print3()
    {
        Console.WriteLine("print3");
    }
    testDele dele = new testDele(print1);
    dele += new testDele(print2);
    dele += new testDele(print3);
    dele();
}
cs


- 출력 -

print1

print2

print3


위에서 보듯이 print1함수와 print2, print3 함수들을 델리게이트 testDele에 +=로 추가를 하고 dele()로 호출을 하니 넣은 순서대로 3개 함수가 모두 호출되는 것을 볼 수 있다.


Posted by 꿈만은공돌
,




C#/닷넷에 자료형에는 소수를 저장하는 변수가 double과 decimal 두가지가 존재


double은 부동소수점 방식을 이용하고 


decimal은 고정소수점 방식을 이용


부동소수점 방식 장점으론 작은 메모리공간에 큰 소수를 저장 가능하나 정확성이 떨어진다.


고정소수점 방식은 연산 속도가 빠르고 수의 정확성이 높은데신 큰수를 저장할때 메모리를 많이 잡아먹게 된다. 


C#에서 double은 8byte 메모리를 사용하며 decimal은 16byte에 메모리를 사용한다.


- 부동소수점의 원리를 잘 설명한 블로그 : https://blog.naver.com/chdb57/221146120811


- 고정소수점의 원리를 잘 설명한 블로그 : https://chogahui05.blog.me/221246891984




- 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//부동소수점 double 사용
double double1 = 0.1;
double double2 = 1;
 
if (double1 + double2 == 1.1)
    Console.WriteLine("값 일치");
else
    Console.WriteLine("일치하지 않음");
   
 
//고정소수점 decimal 사용         
decimal decimal1 = 0.1M;
decimal decimal2 = 1.1M;
 
if (decimal1 + decimal2 == 1.1M)
    Console.WriteLine("값 일치");
else
    Console.WriteLine("일치하지 않음");



위의 예제처럼 부동 소수점은 == 연산을 사용해서 비교를 하면 안된다.


Posted by 꿈만은공돌
,

닷넷 네이티브(.NET Native)란

 

보통의 C#은 CLR(Common Language Runtime)이 C#의 소스코드를 컴파일 해서 생성된 IL(Intermediate Language) 코드를 만든다. 그리고 이 IL 코드를 가지고 런타임에 JIT(Just In Time) 컴파일러가 네이티브 소스코드를 만든다.


이런 방식에 장점은 개발자가 코드를 작성해서 배포할 때 사용자의 실행환경(OS, CPU 등)을 고려하지 않아도 된다.


하지만 이러면 단점이 메모리를 많이 사용하게 되고 속도 또한 떨어지게 된다.

그래서 이를 해결하기 위해 나온 것이 닷넷 네이티브 이다.


닷넷 네이티브는 AOT(Ahead of time) 컴파일을 사용해 대상에 CPU와 OS에 맞는 네이티브 코드가 생성이된다.


그러면 실행 속도가 빨라지고 메모리 사용량 역시 감소 한다.


이미지 출처 : https://www.slideshare.net/AlexThissen/net-core-new-platform-bern-lucerne-2016-final



자세한 사용 방법 및 내용은 아래 출처 참고

https://blogs.msdn.microsoft.com/dotnet/2014/04/02/announcing-net-native-preview/



참고 자료 : 크로스 플랫폼 개발을 위한 C#7 과 닷넷 코어 2.0 책


Posted by 꿈만은공돌
,