외규장각 도서 환수 모금 캠페인

'Interesting/C#'에 해당되는 글 7건

  1. 2008.11.10 Attribute란? 1
  2. 2008.11.08 Delegate란?
  3. 2008.11.08 Generic이란?
  4. 2008.11.08 Partial Classes란?
  5. 2008.11.08 interface란?
  6. 2008.11.06 C#의 Data Types
  7. 2008.11.06 C# 처음으로 코딩해봤어요...ㅎㅎ

Attribute란?

Interesting/C# 2008. 11. 10. 11:48

Attribute는 전처리 지시어로서 클래스, 구조체, 매소드 등에 영향을 미치는 범용적인 기능을 가지고 있습니다.
내장 Attribute와 사용자 정의 Attribute가 있는데 기본적인 Attribute로는 Conditionalm Obsolete, Dlllmport가 있습니다.

대표적인 Conditional Attribute만 알아보겠습니다.

#define SELF
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace Attrivute_conditional
{
    class ConditionalTest
    {
        [Conditional("SELF")]
        public static void definefunction()
        {
            Console.WriteLine("Define conditional attribute!!");
        }
        [Conditional("BYSELF")]
        public static void undefined()
        {
            Console.WriteLine("Undefined Conditional!!");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ConditionalTest.definefunction();
            ConditionalTest.undefined();
        }
    }
}



#define SELF : define으로 선언된 것만 Attribute로 등록하여 사용할 수 있습니다.
using System.Diagnostics; : Conditional Attribute를 사용하기 위해서는 추가해야 함
[Conditional("SELF")] : Attribute 등록함

Posted by 닉네임영역
,

Delegate란?

Interesting/C# 2008. 11. 8. 13:59

메소드의 기능을 대신해 주는 대리자입니다. 메소드를 보다 효율적으로 사용하기 위하여 메소드 자체를 캡슐화 하는 기능입니다. 그래서 메소드를 대신하는 대리자를 호출하면 메소드를 직접 호출하지 않고도 메소드 호출이 가능합니다.

Delegate는 일종의 함수포인터 혹은 매크로라고 생각하시면 이해하기 편하실 겁니다.

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

namespace delegate_test
{
    delegate void dele();

    class deletest
    {
        public void function1()
        {
            Console.WriteLine("function1");
        }
        public void function2()
        {
            Console.WriteLine("function2");
        }
    }
    class Program
    {
        public static void Main(string[] args)
        {
            deletest dt = new deletest();
            dele de = new dele(dt.function1);
            de();
            de += new dele(dt.function2);
            de();
        }
    }
}



대리자에 deletest의 function1만 등록하고 한번 출력 후 function2도 추가 등록하여 2가지 일을 동시에 하게 만들었습니다. 메소드와 Delegate의 반환형, 매개변수 타입, 개수가 같으면 추가로 등록하는게 가능합니다.

Posted by 닉네임영역
,

Generic이란?

Interesting/C# 2008. 11. 8. 13:58

이 기능은  C++의 템플릿 기능이라고 보시면 됩니다.
Framework 1.0에는 없던 기능으로서 2.0에 새로 생겼습니다.

우선 Generic의 장점
1. Type Checking 불필요
2. boxing 불필요
3. Type Casting 불필요
4. 위와 과정 3개가 없어지므로 성능의 향상



generic의 설명을 확실하게 해줄 그림입니다.
이것을 보시면 generic이란게 무엇인지 확실히 알수 있을 것입니다.

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

namespace generic_test
{
    class Obj
    {
        public Object t;
        public Object u;
        public Obj(Object _t, Object _u)
        {
            t = _t;
            u = _u;
        }
    }
    class Gen<T, U>
    {
        public T t;
        public U u;
        public Gen(T _t, U _u)
        {
            t = _t;
            u = _u;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Obj oa = new Obj("Hello", " World");
            Console.WriteLine((string)oa.t + (string)oa.u);

            Gen<string, string> ga = new Gen<string,string>("Hello, ", "World");
            Console.WriteLine(ga.t + ga.u);

            Obj ob = new Obj(10.125, 2008);
            Console.WriteLine((double)ob.t + (int)ob.u);

            Gen<double, int> gb = new Gen<double, int>(10.125, 2005);
            Console.WriteLine(gb.t + gb.u);
        }
    }
}


위의 소스를 보게 되면 main에서 generic을 것과 사용하지 않은 을 모두 넣었습니다.
사용방법은 오브젝트 선언 후 (Class Obj) 그 클래스를 담을 수 있는 generic을 선언(Class Gen)
이것을 메인에서 선언 후 사용하면 됩니다.

main에서 보시면 아시겠지만 generic을 사용하지 않을 때는 타입캐스팅을 해주어야만 합니다.
하지만 그에 비해 사용하면 타입캐스팅은 해주지 않아도 됩니다.

개발자가 직접 원하는 형태의 데이터를 담을 수 있게 <>로 안에 타입을 선언해주고 사용하면 됩니다.

Posted by 닉네임영역
,

Partial Classes란?

Interesting/C# 2008. 11. 8. 13:58
제목 그대로 일부분의 클래스들이라는 뜻입니다.
각각 다른 파일에 클래스의 일부분들을 나누어 구현하는 것이 가능해졌습니다.
VS1.0에서는 하나의 파일에는 하나 혹은 둘 이상의 클래스를 구현할 수는 있었으나 두개의 파일에서 하나의 클래스를 구현할 수는 없었습니다.
하지만 2.0에서는 이렇게 두개 이상의 파일에 하나의 클래스를 구현할 수 있는데 그 기능이 partial classes기능입니다.

다음은 간단한 예제입니다.

Class1.cs

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

namespace Partial_claaes
{
    public partial class Partial_test
    {
        public string Class1()
        {
            return "ClassA";
        }
    }
}


Class2.cs

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

namespace Partial_claaes
{
    public partial class Partial_test
    {
        public string Class2()
        {
            return "ClassB";
        }
    }
}


Class3.cs

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

namespace Partial_claaes
{
    public partial class Partial_test
    {
        public string Class3()
        {
            return "ClassC";
        }
    }
}


Program.cs

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

namespace Partial_claaes
{
    class Program
    {
        static void Main(string[] args)
        {
            Partial_test pt = new Partial_test();
            Console.WriteLine(pt.Class1());
            Console.WriteLine(pt.Class2());
            Console.WriteLine(pt.Class3());
        }
    }
}


Program.cs는 기본 생성 파일이며 Class1, Class2, Class3은 직접 만든 파일입니다.
키워드 Partial을 넣어서 클래스를 선언하고 구현을 하게 되면 하나의 클래스로 인식되어 어디에 있던지 컴파일시 하나의 클래스로 인식을 하게 됩니다.

Posted by 닉네임영역
,

interface란?

Interesting/C# 2008. 11. 8. 13:57

인터페이스는 규약(Contract) 이라고 불립니다. 인터페이스 안에는 메소드뿐만 아니라 속성, 이벤트, 인덱서 등의 멤버를 가질 수 있지만 메소드에 대해서만 다루겠습니다.

 

C#에서는 클래스의 다중 상속을 지원하지 않습니다. 인터페이스는 각 클래스들이 구현해야 하는 일을 정의해 놓은 것이라고 보시면 좋을 거 같습니다. 하지만 클래스와는 달리, 인터페이스는 규약, 약속이기 때문에 여러 개의 인터페이스로부터 상속이 가능합니다. 클래스를 상속 받으면 인터페이스를 상속 받을 수 있기 때문에 상속에 상관없이 인터페이스를 사용할 수 있답니다.


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

namespace interface_test
{
    interface IState
    {
        void stand();
        void sleep();
    }
    interface IEat
    {
        void hamburger();
        void korean_food();
    }
    class IPresent : IState, IEat
    {
        public void stand()
        {
            Console.WriteLine("나는 서있습니다.");
        }
        public void sleep()
        {
            Console.WriteLine("나는 자고 있습니다.");
        }
        public void hamburger()
        {
            Console.WriteLine("나는 햄버거를 먹습니다.");
        }
        public void korean_food()
        {
            Console.WriteLine("나는 한식을 먹습니다..");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IPresent ip = new IPresent();
            ip.stand();
            ip.sleep();
            ip.hamburger();
            ip.korean_food();
        }
    }
}



위의 소스를 보면 interface로 각각의 메소드를 2개씩만들었습니다.
만약 interface로 하지 않고 class로 선언했다면 IPresent 클래스에서는 두개의 상속이 아닌 한개의 상속만 받을 수 있습니다. 이와 같이 여러개의 상속을 한번에 받고자 하는 경우에 사용하면 편리합니다.
추상 클래스를 사용하여 본래의 메소드와 다른 기능을 수행하게 할 수 있으나 우선은 interface가 목적이므로 추상클래스를 사용하지 않았습니다. 위의 소스만 이해 하신다면 interface는 쉽게 이해하실 수 있을 것입니다.

Posted by 닉네임영역
,

C#의 Data Types

Interesting/C# 2008. 11. 6. 16:52
Value Types
일반적으로 3가지의 타입이 있다.
1. Built-in Type(내장형 타입)
2. User-defined Types(사용자 정의 타입)
3. Enumerations(열거형)

-----------------------------------------------------------------------------------------------------------
Built-in Value Types
 sbyte  1 byte
 byte  1 byte 
 short  2 byte
 int  4 byte
 uint  4 byte
 long  8 byte
 float  3 byte
 double  8 byte
 decimal  16 byte

other Value Types
 char  2 byte 
 bool  4 byte
 date  8 byte

위에서 언급한 Value Type들은 직접 직접 데이터를 가지며 변수에는 원본 데이터에 대한 복사본이 저장되며 한 변수에 대한 연산이 다른 변수에 영향을 미칠 수 없다는 특징이 있습니다. 참고로 C#은 대소문자를 구분해줍니다.

Value Types을 정의하는 방법은 다음과 같습니다.
1. Built-in Type
bool b = false;
다른 언어와 마찬가지로 변수가 직접 데이터를 가지기 때문에 위와 같이 정의 해줍니다.

2. User-defined Type
유저정의 타입은 표현을 할때 일반적으로 구조체를 사용한다. 여기 소스를 보면 쉽게이해가 갈 것이다.

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

namespace User_defined_types
{
    struct Int_user_defined
    {
        int number1, number2, number3;
        public Int_user_defined(int _number1, int _number2, int _number3)
        {
            number1 = _number1;
            number2 = _number2;
            number3 = _number3;
        }
        public int Value(int i)
        {
            if (i == 1)
                return number1;
            else if (i == 2)
                return number2;
            else if (i == 3)
                return number3;
            return 0;
        }
        public override string ToString()
        {
            return base.ToString();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Int_user_defined test1 = new Int_user_defined(1, 10, 100);
            Console.WriteLine("number1 = {0}, number2 = {1}, number3 = {2}", test1.Value(1),test1.Value(2),test1.Value(3));
        }
    }
}





3. Enumerations
열거형들은 고정된 값들을 가지고 있습니다. 하지만 고정된 값들은 모두 하나의 연관성을 가지고 있으며 그 중에 하나만을 선택하거나 할 때 사용하면 유용하게 쓰입니다.

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

namespace enum_test
{
    enum Selection : int { Red, Green, Blue};
    class Program
    {
        static void Main(string[] args)
        {
            Selection s = Selection.Red;
            Console.WriteLine("{0}",s);
        }
    }
}




-----------------------------------------------------------------------------------------------------------
Reference Types
Reference Types은 해당 타입의 인스턴스(instance)에 대한 참조입니다. 여기서 타입의 인스턴스를 개체라고 부릅니다. 개체는 object 입니다. 일반적으로 포인터라고 불리워집니다.
Value Types은 변수의 값을 그대로 복사해오는 것이지만 Reference Type은 개체 자체를 복사해서 그가 가진 모든 것들을 복사하는 것입니다.

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

namespace reference_types
{
    struct Numbers
    {
        public int val;
       
        public Numbers(int _val)
        {
            val = _val;
        }
        public override string ToString()
        {
            return val.ToString();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Numbers n1 = new Numbers(0);
            Numbers n2 = n1;
            n1.val += 1;
            n2.val += 2;
            Console.WriteLine("n1 = {0}, n2 ={1}", n1, n2);
        }
    }
}





Commom Reference Types
 System.Object
 System.String
 System.Text.StringBuilder
 System.Array
 System.IO.Stream
 System.Exception

Posted by 닉네임영역
,
원서를 가지고 처음으로 코딩했다.
마소에서 출판한 시험 대비용 책이긴 하지만 원서라서 적응할 시간이 필요했다.
사실 원서는 처음 사용하는 것 같다.
대학교 7학기를 다니면서 신기하게도 거의 번역본이나 국내에서 편찬된 책을 본 것 같다.
참으로 신기하지 않을 수 없다.

원서를 보고 코딩을 짜보니 그제서야 이해가 확실히 되는듯....ㅋㅋㅋ
확실히라는 단어가 100%를 말하는것은 아니지만

C#은 처음 해보았지만 C++과 자바의 합성(?)정도의 느낌이다.
머 닷넷으로 하다보니 그런 느낌일 수 있지만 왠지 그런 느낌이다.
자바의 느낌이 작고 C++의 느낌이 강하긴 하다.

이제부터 C#을 독학하려 한다.ㅋ
쉽지않지만 머...인터넷이 있으니...ㅎㅎ
얼마나 많은 시간이 소요될지는 해봐야 알겠지..

Posted by 닉네임영역
,


사랑합니다. 편안히 잠드소서