Microsoft C#의 특징

마이크로소프트의 C#은 앤더슨 헬스버그가 처음 고안하여 여기까지 발전되었습니다.

.NET에 최적화 되어있고 컴포넌트 지향의 프로그래밍 언어입니다. 자바의 단점을 보완하였다고 하지만 그다지 뛰어난점은 모르겠습니다.

C#의 대표적인 특징은 다음과 같은 것이 있습니다.

1. 클래스 (Class) ————————————————————————————
C#에는 C++에서 볼수 있는 클래스가 있습니다. 이 클래스는 Template같은 역할을 하며 객체(인스턴스)로 만들어 사용할 수 있습니다. 클래스에는 객체의 속성(필드)과 행위(메서드)를 결정할 수 있습니다.
[code]class CoffeMaker
{
    public bool onState;
    public void StartCoffeMaker()
    {
        if(onState == true)
        {
            Console.WriteLine(“The CoffeMaker is already on”);
        }
        else
        {
            onState = true;
            Console.WriteLine(“The CoffeeMaker is now on”);
        }
}[/code]

2. 프로퍼티 (Property) ——————————————————————————-
프로퍼티는 클래스의 private 필드를 형식적으로 다루는데 사용되는 일종의 메서드입니다. 값을 지정하는 set과 값을 가져오는 get으로 구성됩니다. 자바의 setter, getter 생각하시면 되겠군요.
[code]class Car
{
    private int _engine;
    public void int engine {
        get { return _engine; }
        set { _engine = value; }
    }
}[/code]

3. 연산자중복 (Operator Overloading) ——————————————————————
연산자 중복이란 시스템에서 제공한 연산자를 프로그래머가 새롭게 정의하는 것을 뜻합니다. 여러말 하는것보다 한개의 예제가 좋겠군요.
[code]class Even {
    int evenNumber;
    public Even(int n)
    {
        // 생성자
        evenNumber = (n % 2 == 0) ? n : n+1;
    }

    public static Even operator++(Even e)
    {
        // ++ 연산자
        e.evenNumber += 2;                    // 다음 짝수
        return e;
    }

    public static Even operator–(Even e)
    {
        // — 연산자
        e.evenNumber -= 2;                  // 이전 짝수
        return e;
    }

    public void PrintEven()
    {
        // 출력 메소드
        Console.WriteLine(“Even Number = ” + evenNumber);
    }
}

class OperatorOverloadingApp
{
    public static void Main()
    {
        Even e = new Even(4);
        e.PrintEven();

        ++e;
        e.PrintEven();

        –e;
        e.PrintEven();
    }
}[/code]

4. 델리게이트 (Delegate) ——————————————————————————
델리게이트란 메소드를 참조하기 위한 방법론으로 자바에서는 없는 개념입니다. invoke를 이용하여 비슷하게 활용할수는 있겠군요. 이 델리게이트를 사용하여 바로 메서드에 접근할 수 있게 됩니다. C++의 포인터와도 비슷한 개념으로 볼 수 있겠지만 좀더 객체 지향적이며 타입 안정적입니다. 주로 이벤트와 쓰레드에서 사용됩니다.
[code]delegate void SampleDelegate();
class DelegateClass
{
    public void DelegateMethod()
    {
        Console.WriteLine(“In the DelegateClass.DelegateMethod …”);
    }
}

class DelegateApp
{
    public static void Main()
    {
        DelegateClass obj = new DelegateClass();
        SampleDelegate sd = new SampleDelegate(obj.DelegateMethod);
        sd();              // invoke obj.DelegateMethod() indirectly
    }
}[/code]

5. 이벤트 (Event) ————————————————————————————-
이벤트란 사용자 행동에 의해 발생하는 사건을 의미합니다. GUI에서 주로 사용되며 객체에 발생한 사건을 자신이나 다른 개체 통지하여 그에대한 처리를 하도록 합니다.
[code]class EventApp : Form
{
    public EventApp()
 {
        // 생성자
        this.Click += new EventHandler(ClickEvent); // 이벤트 처리기 등록
    }
 
    void ClickEvent(object sender, EventArgs e)
 {
        // 이벤트 처리기 작성
        MessageBox.Show(“Hello world”);
    }
 
    public static void Main() {
        Application.Run(new EventApp());
    }
}[/code]

6. 멀티쓰레드 (Multi Thread) ————————————————————————-
하나의 프로그램이 시작, 실행, 종료의 순서를 가진 순차 프로그램이라 할때 이 하나의 흐름을 쓰레드라고 부릅니다. C#에서는 여러개의 쓰레드를 만들어 사용할 수 있습니다.
[code]class ThreadApp {
    static void ThreadBody() {
        Console.WriteLine(“In the thread body …”);
    }


    public static void Main() {
        ThreadStart ts = new ThreadStart(ThreadBody);
        Thread t = new Thread(ts);
        Console.WriteLine(“*** Start of Main”);
        t.Start();
        Console.WriteLine(“*** End of Main”);
    }
}[/code]
위의 실행 결과는 다음과 같습니다
[code]*** Start of Main
*** End Of Main
In the thread body …[/code]
쓰레드 t는 Main과 따로 작동하는 것을 알 수 있습니다.

7. 제네릭 (Generic) ———————————————————————————–
프로그램은 여러종류의 자료형이 있고 이 자료형에 따라 데이터를 표현/저장/연산하는 방법이 다릅니다.
또한 형변환시에 타입캐스팅에 신경을 써야 하는것도 많지요. 제네릭은 미리 이곳에 들어갈 수 있는 타입은 무엇이다 라고 정의하는 것입니다. 자바에서도 5버젼부터 도입되었지요. 자세한 내용은 [ 이곳 ] 을 참조해 보세요^^

8. 예외처리 (Exception) ——————————————————————————-
C#의 예외처리는 예기치 못한 상황이나 예외상황을 다루기 위한 예외처리 기능을 제공합니다. try-catch-finally를 사용합니다.
다음의 예제는 0으로 나누는 상황을 대비한 예외처리 구문입니다.
[code]int SafeDivision(int x, int y)
{
    try
    {
        return (x / y);
    }
    catch (System.DivideByZeroException dbz)
    {
        System.Console.WriteLine(“Division by zero attempted!”);
        return 0;
    }
}[/code]
try는 예외상황을 캐치할 구문이 들어가고 catch에는 예외상황이 들어갔을 경우에 수행할 구문이 들어갑니다.
추가적으로 finally를 통해 예외상황 발생 여부와 상관없이 처리를 할 수도 있습니다.