본문 바로가기

   
Programming/C#

Generic, var 자료형태, Sample delegate, Partial

반응형

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       class Work

       {

             static void Main(string[] args)

             {

                    //제네릭(Generic)

                    // - 내부 구조나 알고리즘이 동일하되 다루는 자료형만 다른 경우 클래스나 메서드를 간결화 시키는 기법

                    // - 컴파일될때 자료형이 결정

 

                    WrapperInt n1 = new WrapperInt(10);

                    Console.WriteLine("int:{0}", n1.Value);

 

                    WrapperString s1 = new WrapperString("문장");

                    Console.WriteLine("String:{0}", s1.Value);

 

                    //박싱과 언박싱은 비용이 많이 들어간다. object의 문제점을 보완하기위해 Generic 탄생

                    WrapperObject o1 = new WrapperObject(30);

                    Console.WriteLine("object INT형과 더하기 : {0}", (int)o1.Value + 10);

 

                    //래퍼 클래스 사용 : 한번 셋팅이 되면 다른 타입은 절대 넣을수가 없다.

                    //컴파일 하는 순간 매개 변수처럼 단어가 Wrapper<T> t 로넘어가며 생성자를 인트형으로 초기화 한다. <T>에 데이타 타입 대로 자료 형을 매개변수로 넘겨준다

                    Wrapper<int> n3 = new Wrapper<int>(30);

                    Console.WriteLine("Generic Int :{0}", n3.Value + 30);

 

                    Wrapper<string> g2 = new Wrapper<string>("");

                    Console.WriteLine("Generic String:{0}", g2.Value);

 

 

             }

       }

 

       //요구사항] 멤버 변수 int value을 가지는 클래스 선언

       //         value를 핸들링 멤버 추가 구성

 

       //기존 값은 스트링형으로 사용할수 없다.

       class WrapperInt

       {

             private int value;

 

             //생성자

             public WrapperInt()

             {

                    this.value = 0;

             }

 

             //생성자 오버로딩

             public WrapperInt(int value)

             {

                    this.value = value;

             }

 

             //프로퍼티

             public int Value

             {

                    get { return this.value; }

                    set { this.value = value; }

             }

             //요구사항] 멤버 변수 int value을 가지는 클래스 선언

             //         value를 핸들링 멤버 추가 구성

             //              WrapperInt 클래스가 하는일과 동일****            

       }

 

       class WrapperString

       {

             private string value;

 

             //생성자

             public WrapperString()

             {

                    this.value = string.Empty;

             }

 

             //생성자 오버로딩

             public WrapperString(string value)

             {

                    this.value = value;

             }

 

             //프로퍼티

             public string Value

             {

                    get { return this.value; }

                    set { this.value = value; }

             }

             //요구사항] 멤버 변수 int value을 가지는 클래스 선언

             //         value를 핸들링 멤버 추가 구성

             //              WrapperInt 클래스가 하는일과 동일****            

       }

 

       class WrapperObject

       {

             private object value;

 

             public WrapperObject()

             {

                    this.value = value;

             }

 

             public WrapperObject(object value)

             {

                    this.value = value;

             }

 

             public object Value

             {

                    get { return this.value; }

                    set { this.value = value; }

             }

       }

 

       //제네릭 클래스

       // - 멤버 변수의 타입을 고정시켜놓지 않고, 선언할때 결정하는 방식의 클래스

       //<T> = 매개 변수이다. 아무거나 넣어도 상관없다.

       class Wrapper<T>

       {

             private T value;

 

             public Wrapper()

             {

                    this.value = default(T);

             }

 

             public Wrapper(T value)

             {

                    this.value = value;

             }

 

             public T Value

             {

                    get { return this.value; }

                    set { this.value = value; }

             }

       }

}

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

 

namespace Work

{

       class Generic02

       {

             static void Main(string[] args)

             {

                    //제네릭 컬렉션

                    ArrayList list1 = new ArrayList();

                    list1.Add(100);

                    list1.Add(200);

                    list1.Add(300);

                    Console.WriteLine("ArrayList:{0}", (int)list1[0] + (int)list1[1] + (int)list1[2]);

 

                    ArrayList list2 = new ArrayList();

                    list2.Add(true);

                    list2.Add(false);

                    if ((bool)list2[0])

                    {

                           Console.WriteLine("ArrayList ");

                    }

 

 

                    //ArrayList : object형 배열

                    //ArrayList 제네릭 버젼 : list<>

                    List<int> list3 = new List<int>();

                    list3.Add(1000);

                    list3.Add(2000);

                    list3.Add(3000);//Boxing발생X

                    Console.WriteLine("제네릭 인트형:{0}", list3[0] + list3[1] + list3[2]);

 

                    List<bool> list4 = new List<bool>();

                    list4.Add(true);

                    list4.Add(false);

                    Console.WriteLine("제네릭 불리언형:{0}", list4[0]);

 

                    //제네릭 컬렉션

                    //ArrayList -> list<>

                    Hashtable ht1 = new Hashtable();

 

                    //Dictionary : 하나는 string 하나는 int

                    Dictionary<string, int> ht2 = new Dictionary<string, int>();

                    ht2.Add("하나", 1);

                    ht2.Add("", 2);

 

                    Console.WriteLine("Dictionary:{0}", ht2["하나"] + 100);

 

                    Queue<int> queue = new Queue<int>();

                    Stack<string> stack = new Stack<string>();

             }

       }

}

 


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       class Generic03

       {

             static void Main(string[] args)

             {

                    Test<int> t1 = new Test<int>();

                    t1.m = 10;

 

                    Test<char> t2 = new Test<char>();

                    t2.m = 'a';

 

                    Test2<string, bool> t3 = new Test2<string, bool>();

 

                    t3.a = "string";

                    t3.b = true;

                    t3.c = "string";

                    t3.d = 10;

             }

       }

 

       class Test<T>

       {

             public T m;

       }

 

       class Test2<T, U>

       {

             public T a;

             public U b;

             public T c;

             public int d;

       }

}

 




using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       class Generic03

       {

             static void Main(string[] args)

             {

                    //제네릭 메서드

                    int a = 10, b = 20;

                    Swap(a, b);

                    Swap<int>(a, b);

 

                    string s1 = "하하", s2 = "호호";

                    Swap(s1, s2);

                    Swap<string>(s1, s2);

 

                    bool b1 = true, b2 = false;

                    Swap<bool>(b1, b2);

 

                    Test<int, byte>(10, 10);

             }

 

             public static void Test<T, U>(T a, U b)

             {

                    //특정 타입의 개체를 알고싶을때

                    Console.WriteLine(a.GetType().ToString());

                    Console.WriteLine(b.GetType().ToString());

             }

 

             //Swap : , 같은 타입끼리 교환

             public static void Swap(int a, int b)

             {

                    int temp;

                    temp = a;

                    a = b;

                    b = temp;

 

                    Console.WriteLine("a : {0}, b : {1}", a, b);

             }

 

             public static void Swap(string a, string b)

             {

                    string temp;

                    temp = a;

                    a = b;

                    b = temp;

 

                    Console.WriteLine("a : {0}, b : {1}", a, b);

             }

 

             //제네릭 메서드

             public static void Swap<T>(T a, T b)

             {

                    T temp;

                    temp = a;

                    a = b;

                    b = temp;

 

                    Console.WriteLine("a : {0}, b : {1}", a, b);

             }

       }

 

}

 


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

 

namespace Work

{

       class Initializer01

       {

             static void Main(string[] args)

             {

                    //초기화 리스트, 이니셜라이저, 객체 초기자

 

                    //배열 초기자

                    int[] nums = new int[3] { 100, 200, 300 };

 

                    //ArrayList 초기화

                    ArrayList list1 = new ArrayList() { 10, 20, 30 };

      

                    //제네릭 초기화

                    //모든것이 초기화가 됨

                    List<int> list2 = new List<int>() { 100, 200, 300 };

 

                    //객체초기자 Initializer(생성자와 같은 맥락) -> 링크를 할때에 이것을 사용한다.

                    Student s1 = new Student { Name = "김종현", Age = 10 };

                    Console.WriteLine(s1);

 

                    Student s2 = new Student("홍길동", 28);

                    Console.WriteLine(s2);

             }

       }

 

       class Student

       {

             public string name;

             public int age;

 

             public string Name

             {

                    set { this.name = value; }

 

             }

 

             public int Age

             {

                    set { this.age = value; }

             }

 

             public Student() { }

             public Student(string name, int age)

             {

                    this.name = name;

                    this.age = age;

             }

       }

}

 

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       class Initializer02

       {

             static void Main(string[] args)

             {

                    Time t1 = new Time();

                    t1.Hour = 10;

                    t1.Min = 20;

                    t1.Sec = 30;

                    t1.Check();

                    Console.WriteLine("{0}---------{1}", t1.Hour, t1.Min);

 

                    //생성, 프로퍼티를 모두 합친 형태 최종형태

                    Time t2 = new Time { Hour = 10, Min = 20, Sec = 30};

             }

       }

 

       class Time

       {

             //생성자, 프로퍼티, 멤버 변수는 내부적으로 무조건 private

             public int Hour { get; set; }

             public int Min { get; set; }

 

             public int Sec { get; set; }

 

             internal void Check()

             {

             }

       }

 

       class Student

       {

             private string name;

 

             public string Name

             {

                    get { return this.name; }

                    set { this.name = value; }

             }

 

             //자동화 프로퍼티

             public int Age { get; set; }

 

             public void Test()

             {

                    this.name = "하하";

                    this.Name = "호호";

                    this.Age = 20;

             }

       }

}

 

 

 

 

 

var 자료형태

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       class var01

       {

             static void Main(string[] args)

             {

                    //var : 암묵적 타입변수, 익명 변수 > 내부적으로 박싱이 일어난다.

                    int n = 10;

                    Console.WriteLine(n.GetType());

 

                    string s = "";

                    Console.WriteLine(s.GetType());

 

                    //C#에서의 var는 오브젝트 성격을 가지고 있으나

                    //var로 생성한 변수는 초기값에 의해서 변수에 타입이 결정된다.

                    //한번결정이되면 변경이 불가능 하다.

                    var n2 = 20;

                    Console.WriteLine(n2);

                    Console.WriteLine(n2.GetType());

 

                    var s2 = "";

                    Console.WriteLine(s2);

                    Console.WriteLine(s2.GetType());

 

                    //var의 특징들..

                    //1. 한번 자료형이 결정돼면 불면

                    var num = 100;

 

                    //2. 선언과 동시에 초기화 필수!!

                    //var name;

                    //name = "홍길동";

                    var name = "홍길동";

                   

                    //3. null값 할당이 안된다

                    //var obj = null;

                    var obj = new Random();

 

                    //4. 한줄에 하나씩

                    //var c = 10, d = 20;

                    var c = 10;

                    var d = 20;

 

                    //5. var 은 지역변수에 한해서 가능

             }

       }

}

 

익명타입, 익명변수 : 클래스를 하나 생성할때

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       class AnonymousType

       {

             static void Main(string[] args)

             {

                    //익명타입(이름이 없는 자료형)

                    //int n;

                    //? m;(이름이 없는 타입)

 

                    //초기화리스트 사용 - 생성자사용해서는 안된다.

                    //생성자를 사용하면 초기화리스트를 사용하면 안된다.

                    Human h = new Human { Name = "홍길동", Age = 28 };

 

                    Console.WriteLine("{0}\t{1}", h.Name, h.Age);

 

                    //유일한 하나뿐인 인스턴스를 생성하기 위해서 클레스를 설계해야하는 경우...***

                    //이름없는 클래스

 

 

                    Human h2 = new Human { Name = "홍길동", Age = 20 };

 

                    //클래스 없이 하나의 인스턴스를 쓸때 사용할수 있는 var~

                    //익명 타입, 익명 변수 변수가 무엇인지 잘 모를때 사용한다.

                    var size1 = new { Width = 100, Height = 200 };

                    object size2 = new { Width = 100, Height = 200 };

                    //size2. 없다

                    Console.WriteLine(size1.Height + 700);

             }

       }

 

       class Human

       {

             public string Name { get; set; }

             public int Age { get; set; }

       }

}

 

 

 

 

Sample delegate

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       //Sample delegate(자료형이다.)

       public delegate int Sample(int a, int b);

 

       class AnonymousMethod01

       {

             static void Main(string[] args)

             {

                    //익명변수 : var

                    //익명클래스 : new {}

                    //익명메서드********

                    //3가지가 1세트

                    int sum1 = Sum(10, 20);

 

                    //이름이 없는 함수를 익명 변수라 한다. 메서드이름대신 delegate 키워드를 적어놓았다.

                    //다른데선 호출을 하지 못한다.

                    //이벤트를 배워서 이벤트와 같이 엮어서 배운다.

                    //어떤 행동을 하기위해서 메서드에 대한 정의가 같이 이루어진

                    //1. 사용하는 용도가 단 한곳일 경우.

                    //2. 메서드 선언위치가 사용하는 곳에서 선언..

                    Sample s = delegate(int a, int b)

                    {

                           return a * b;

 

                    };

 

                    int sum2 = s(10, 20);

             }

 

             public static int Sum(int a, int b)

             {

                    return a + b;

             }

       }

}

 

 

 

Partial

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace Work

{

       class Partial

       {

             static void Main(string[] args)

             {

                    //int n;

                    //int n;

 

             }

             //public void Test() { }

             //public void Test() { }

       }

 

       //같은 이름이어도 구별할수 있도록 해주는기능을 Partial 이라고 한다.

       //코딩은 나누었으나 컴파일러에서 한몸으로 만든다.

       //인위적으론 사용할순 없으며 윈폼, .net에서 사용 구조를 만들어 놨다.

       //다른 클래스 파일에서도 partial이라는 키워드만 사용하면 다른 파일에 똑같은 이름이 있다면 컴파일 하는순간 하나로 다합쳐서 컴파일 하게 된다.

 

       partial class Test

       {

             private int n;

       }

 

       partial class Test

       {

       }

}

 

 

반응형