'2016/01/22'에 해당되는 글 4건

  1. 2016.01.22 C#의 where
  2. 2016.01.22 delegate
  3. 2016.01.22 typeof
  4. 2016.01.22 연산자

where(제네릭 형식 제약 조건)(C# 참조)


제네릭 형식 정의에서 where 절은 제네릭 선언에 정의된 형식 매개 변수의 인수로 사용할 수 있는 형식에 대해 제약 조건을 지정하는 데 사용됩니다. 


ex) 예를 들어, 다음과 같이 형식 매개 변수 T가 IComparable<T> 인터페이스를 구현하도록 제네릭 클래스 MyGenericClass를 선언할 수 있습니다.


public class MyGenericClass<T> where T:IComparable { }


where T : struct, IConvertible

ㄴ 이런 식으로 다수에 대해서 허용하는 것도 가능하니, 결론적으로 포지티브 방식인듯.

where의 영어적 의미가 '어디' 이니 어디에만 쓸 수 있다고 제약하는 식인듯 하다.


출처 : MSDN


'프로그래밍 > C++++ (C#)' 카테고리의 다른 글

도구 상자가 보이지 않는다!!!  (0) 2016.02.26
C#의 where  (0) 2016.01.22
delegate  (0) 2016.01.22
typeof  (0) 2016.01.22
c# using 키워드  (0) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요

델리게이트(Delegate)
 - 메서드를 가리키는 참조형이다.
 - 메서드의 번지를 저장하거나 다른 메서드의 인수로 메서드 자체를 전달하고 싶을 때 사용한다.
 - C++의 함수 포인터에 대응되는 타입이다. 
 - 한마디로 설명하자면 A클래스의 메서드를 B클래스로 넘겨 B 클래스에서 A 클래스의 메서드를 호출하게 해주는 역할을 한다. (A의 행위를 B에게 위임하여 B가 A의 행위를 대신한다. 대리자)


C# delegate의 개념 

C# delegate는 C/C++의 함수 포인터와 비슷한 개념으로 메서드 파라미터와 리턴 타입에 대한 정의를 한 후, 동일한 파라미터와 리턴 타입을 가진 메서드를 서로 호환해서 불러 쓸 수 있는 기능이다.
예를 들면, 아래 RunDelegate 델리게이트는 입력 파라미터가 int 하나이고 리턴 값이 없는 메서드를 가리킨다. RunThis() 메서드와 RunThat()메서드는 모두 int 파라미터 하나에 리턴 값이 없는 메서드이므로, RunDelegate의 함수 형식(prototype)과 맞으므로 이 delegate를 사용할 수 있다. 


예제

using System;
namespace MySystem
{
    class MyClass
    {
        // 1. delegate 선언
        private delegate void RunDelegate(int i);

        private void RunThis(int val)
        {
            // 콘솔출력 : 1024
            Console.WriteLine("{0}", val);
        }

        private void RunThat(int value)
        {
            // 콘솔출력 : 0x400
            Console.WriteLine("0x{0:X}", value);
        }

        public void Perform()
        {
            // 2. delegate 인스턴스 생성
            RunDelegate run = new RunDelegate(RunThis);
            // 3. delegate 실행
            run(1024);

            //run = new RunDelegate(RunThat); 을 줄여서 
            //아래와 같이 쓸 수 있다.
            run = RunThat;

            run(1024);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.Perform();
        }
    }
}




Delegate를 메서드 파라미터로 전달 

Delegate는 동일한 함수 Prototype을 갖는 메서드를 가리키므로 함수의 포인터를 파라미터로 전달하듯, 다른 함수의 파라미터로 사용될 수 있다. delegate 파라미터를 전달받은 쪽은 이를 자신의 내부 함수를 호출하듯 사용할 수 있다. (C# delegate는 내부적으로 .NET Delegate /MulticastDelegate 클래스를 사용한다. 따라서 이 클래스가 지원하는 속성 (예: .Method - 함수 Prototype을 보여줌)과 메서드 (예: GetInvokcationList())를 모두 사용할 수 있다)

아래 예제는 올림차순으로 비교하는 함수(AscendingCompare) 와 내림차순으로 비교하는 함수(DescendingCompare)를 delegate로 전달하여, 하나의 Sort메서드에서 비교함수에 따라 여러 개의 소트가 가능하다는 것을 보여주는 예이다.
 

예제

class MySort
{
    // 델리게이트 CompareDelegate 선언
    public delegate int CompareDelegate(int i1, int i2);

    public static void Sort(int[] arr, CompareDelegate comp)
    {
        if (arr.Length < 2) return;
        Console.WriteLine("함수 Prototype: " + comp.Method);

        int ret;
        for (int i = 0; i < arr.Length - 1; i++)
        {
            for (int j = i+1; j < arr.Length; j++)
            {
                ret = comp(arr[i], arr[j]);
                if (ret == -1)
                {
                    // 교환
                    int tmp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = tmp;
                }
            }
        }
        Display(arr);
    }
    static void Display(int[] arr)
    {
        foreach (var i in arr) Console.Write(i + " ");
        Console.WriteLine();
    }
}

class Program
{
    static void Main(string[] args)
    {
        (new Program()).Run();
    }

    void Run()
    {
        int[] a = { 5, 53, 3, 7, 1 };
        
        // 올림차순으로 소트
        MySort.CompareDelegate compDelegate = AscendingCompare;
        MySort.Sort(a, compDelegate);

        // 내림차순으로 소트
        compDelegate = DescendingCompare;
        MySort.Sort(a, compDelegate);            
    }

    // CompareDelegate 델리게이트와 동일한 Prototype
    int AscendingCompare(int i1, int i2)
    {
        if (i1 == i2) return 0;
        return (i2 - i1) > 0 ? 1 : -1;
    }

    // CompareDelegate 델리게이트와 동일한 Prototype
    int DescendingCompare(int i1, int i2)
    {
        if (i1 == i2) return 0;
        return (i1 - i2) > 0 ? 1 : -1;
    }
}



그냥 함수 포인터.

위처럼 MySort.CompareDelegate = Asecendiing 과 같이 함수를 대입해주면 쓸 수 있다.,



출처.. 가 기억이 안난다;;; 원 작성자분들 죄송합니다.





'프로그래밍 > C++++ (C#)' 카테고리의 다른 글

도구 상자가 보이지 않는다!!!  (0) 2016.02.26
C#의 where  (0) 2016.01.22
delegate  (0) 2016.01.22
typeof  (0) 2016.01.22
c# using 키워드  (0) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요

typeof

프로그래밍/C++++ (C#) 2016. 1. 22. 15:31

typeof

- 실행중에 형식 정보를 얻을수 있는 연산자.
- System.Type를 얻는다.
- C#의 Reflection 기능 구현


C# 의 typeof() 연산자를 이용해서 Type 의 인스턴스를 얻을 수도 있다.

Code:
// typeof 를 이용해서 Type 을 가져온다.
Type t = typeof(Foo);



형식에 대한 System.Type 개체를 얻는 데 사용됩니다. typeof 식의 형식은 다음과 같습니다.

System.Type type = typeof(int);



typeof가 대상 타입을 System.Type의 정보로 얻어오는 것 같은데.

그래도 잘 모르겠다. System.Type은 뭘까?




Type 클래스

.NET Framework (current version)
 

클래스 형식, 인터페이스 형식, 배열 형식, 값 형식, 열거형 형식, 형식 매개 변수, 제네릭 형식 정의 및 개방형 생성 제네릭 형식이나 폐쇄형 생성 제네릭 형식에 대한 형식 선언을 나타냅니다.

이 형식에 대한 .NET Framework 소스 코드를 찾아보려면 참조 원본을 참조하세요.

네임스페이스:   System
어셈블리:  mscorlib.dll의 mscorlib



namespace ConsoleApplication1

{

    class Program

    {

        public class test

        {

            public string str { get; set; }

            public int age { get; set; }

        }


        IEnumerable<test> tests;

        public void init()

        {


            tests = new test[] {

                new test {str = "aa", age = 33},

                new test {str = "aas", age = 133},

                new test {str = "aad", age = 233},

            };

            System.Type type = typeof(int);

            Console.Write(type);

        }

        static void Main(string[] args)

       {

           test theTest = new test();

           System.Type st = typeof(test[]);


           // typeof는 대상을 system.Type으로 변환한다.

           // system.Type은 여러 정보를 담게 된다. // 받았던 대상의 타입이 클래스인지, 배열인지? 텍스트 명칭부터, 정식으로 어느 소속인지 등..

           // 


       }

    }

}



결론적으로 돌려보니, '타입'을 집어넣으면, 해당 타입의 정보를 가진 객체를 반환하는 함수였다. 그 이름이나 소속, 배열 여부 , 클래스인지 등.. 다양한 정보를 담은 객체를 던진다.



'프로그래밍 > C++++ (C#)' 카테고리의 다른 글

도구 상자가 보이지 않는다!!!  (0) 2016.02.26
C#의 where  (0) 2016.01.22
delegate  (0) 2016.01.22
typeof  (0) 2016.01.22
c# using 키워드  (0) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요

출처 : 위키 백과

연산자 이름구문오버로드 가능[참고 1]C에 포함됨[참고 2]
T의 멤버로서외부 클래스 정의들
기본 할당= b
T& T::operator=(const T& b);

빈칸
덧셈+ b
T T::operator+(const T& b) const;

T operator+(const T& a, const T& b);

뺄셈- b
T T::operator-(const T& b) const;

T operator-(const T& a, const T& b);

단항 덧셈
(정수 승급)
+a
T T::operator+() const;

T operator+(const T& a);

단항 뺄셈
(반수)
-a
T T::operator-() const;

T operator-(const T& a);

곱셈* b
T T::operator*(const T& b) const;

T operator*(const T &a, const T& b);

나눗셈/ b
T T::operator/(const T& b) const;

T operator/(const T& a, const T& b);

모듈러 (나머지)% b
T T::operator%(const T& b) const;

T operator%(const T& a, const T& b);

증가전위++a
T& T::operator++();

T& operator++(T& a);

후위a++
T T::operator++(int);

[참고 3]
T operator++(T& a, int);

[참고 3]
감소전위--a
T& T::operator--();

T& operator--(T& a);

후위a--
T T::operator--(int);

[참고 3]
T operator--(T& a, int);

[참고 3]
연산자 이름구문오버로드
가능[참고 1]
C에서
포함됨[참고 2]
프로토타입 예제[참고 4]
T의 멤버로서외부 클래스 정의들
같음== b
bool T::operator==(const T& b) const;

bool operator==(const T& a, const T& b);

같지 않음!= b
bool T::operator!=(const T& b) const;

bool operator!=(const T& a, const T& b);

> b
bool T::operator>(const T& b) const;

bool operator>(const T& a, const T& b);

작음< b
bool T::operator<(const T& b) const;

bool operator<(const T& a, const T& b);

크거나
같음
>= b
bool T::operator>=(const T& b) const;

bool operator>=(const T& a, const T& b);

작거나
같음
<= b
bool T::operator<=(const T& b) const;

bool operator<=(const T& a, const T& b);

연산자
이름
구문오버로드
가능[참고 1]
C에서
포함됨[참고 2]
프로토타입 예제[참고 4]
T의 멤버로서외부 클래스 정의들
논리적
부정 (NOT)
!a
bool T::operator!() const;

bool operator!(const T& a);

논리적
AND
&& b
bool T::operator&&(const T& b) const;

bool operator&&(const T& a, const T& b);

논리적
OR
|| b
bool T::operator||(const T& b) const;

bool operator||(const T& a, const T& b);

연산자
이름
구문오버로드 가능[참고 1]C에서 포함됨[참고 2]프로토타입 예제[참고 4]
T의 멤버로서외부 클래스 정의들
비트 NOT~a
T T::operator~() const;

T operator~(const T& a);

비트
AND
& b
T T::operator&(const T& b) const;

T operator&(const T& a, const T& b);

비트
OR
| b
T T::operator|(const T& b) const;

T operator|(const T& a, const T& b);

비트
XOR
^ b
T T::operator^(const T& b) const;

T operator^(const T& a, const T& b);

비트
왼쪽
시프트[참고 5]
<< b
T T::operator<<(const T& b) const;

T operator<<(const T& a, const T& b);

비트
오른쪽
시프트[참고 5]
>> b
T T::operator>>(const T& b) const;

T operator>>(const T& a, const T& b);


'프로그래밍 > 프로그래밍 공부' 카테고리의 다른 글

DAO / VO / DTO란?  (2) 2016.01.27
RDBS,DB모델링,파일시스템 표현 차이  (0) 2016.01.26
연산자  (0) 2016.01.22
스테레오 타입(Stereotype)  (0) 2016.01.21
시퀀스 다이어그램(Sequence Diagram)  (1) 2016.01.21
클래스 다이어그램(Class Diagram)  (0) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요