마이크로소프트의 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를 통해 예외상황 발생 여부와 상관없이 처리를 할 수도 있습니다.