기억저장소

기억저장소

Programming Language/C#

[C#] 주요 특징

roaminpixel 2013. 5. 15. 16:11
728x90

클래스, 프로퍼티, 연산자 중복, 델리게이트, 이벤트, 스레드, 제네릭 등으로 요약됨.

 

1. 클래스

객체를 정의하는 템플릿.

클래스의 구조는 크게 객체의 속성을 나타내는 필드 부분과 객체의 행위를 정의하는 메소드 부분으로 이루어짐.

 

2. 프로퍼티

클래스의 private 필드를 형식적으로 다루는 일종의 메소드.

클래스의 private 필드는 다른 클래스에서 임의로 접근이 허용되지 않지만 대응되는 프로퍼티를 통하여 다른 클래스에서 형식적으로 접근가능.

하나의 프로퍼티는 값을 지정하는 셋 접근자와 값을 참조하는 겟 접근자로 구성됨.

 

ex)

using System;

class PropertyClass {

private int privateValue;

public int PrivateValue {

get { return privateValue; }     //get 접근자

set { privateValue = value; }   //set 접근자

}

public void PrintValue() {

Console.WriteLine("Hidden value = " + privateValue);

}

}

class PropertyApp {

public static void Main() {

int n;

PropertyClass obj = new PropertyClass();

obj.PrivateValue = 100;      // set 접근자 호출

obj.PrintValue();

n = obj.PrivateValue;         // get 접근자 호출

Console.WriteLine("      Value = " + n);

}

}

 

3. 연산자 중복

프로그래머가 정의한 클래스에서 새로운 의미를 갖도록 재정의하는것.

 

ex)

using System;

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();

}

}

 

연산자 중복은 의미만을 재정의 할 수 있을 뿐 연산 순위나 결합 법칙 등 문법적인 규칙은 변경할 수 없다.

 

4. 델리게이트

메소드를 참조하기 위한 방법론으로 주로 이벤트와 스레드를 처리하기 위해 사용됨.

C/C++에서 포인터와 유사한 기능을 제공하지만 포인터보다는 객체 지향적이며 타입 안정적이다.

 

델리게이트를 정의하고 델리게이트의 객체를 생성하는 것은 기본적으로 클래스를 정의하고 클래스의 객체를 만드는 것과 비슷하다. 다만, 델리게이트 객체를 통하여 메소드를 호출한다는 점이 특징적이다.

델리게이틀르 정의하기 위해서는 먼저 델리게이트 객체를 통해 호출할 메소드를 작성해야 한다. 메소드가 작성되면 그에 해당하는 델리게이트를 정의해야 하며, 이때 델리게이트 형태와 메소드 형태가 정확히 일치해야 한다.

 

모든 델리게이트는 묵시적으로 System.Delegate 클래스를 상속한 클래스형으로 간주됨.

델리게이트는 처음에 수정자가 선택적으로 올 수 있으며 다음에 지정어 delegate가 나오고 반환형과 함께 델리게이트 이름이 따라옴.

델리게이트 수정자는 접근 수정자와 new가 될 수 있지만 클래스 밖에서 정의할 때는 public과 internal만 가능.

public은 다른프로그램에서 참조가능. internal은 같은프로그램 내에서만 참조가능.

 

델리게이트할 메소드를 결정하고 델리게이트를 정의했다면, 델리게이트 객체를 생성하면서 메소드를 연결해야 한다. 이 경우 해당 델리게이트의 매개변수로 메소드 이름을 명시해준다.

 

ex)

using System;

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();                   //obj.DelegateMethod() 간접호출

}

}

 

5. 이벤트

객체에 발생한 사건을 자신이나 다른 객체에 통지하여 그에 대한 행위를 하도록 시키는 구조.

 

처음에 수정자가 선택적으로 나올 수 있으며, 다음으로 지정어 event가 나오고 델리게이트형과 이벤트 이름이 나온다.

이벤트 수정자에는 접근 수정자와 new, static, virtual, sealed, override, abstract, extern 이 올 수 있음.

 

 1) 이벤트 처리를 담당하는 메소드를 작성

void Method() { }

 2) 이벤트 처리기와 일치하는 델리게이트를 정의하거나 C#에서 기본적으로 제공하는 System.EventHandler 델리게이트를 사용한다. System.EventHandler를 사용하면 이 과정은 생략됨.

delegate void MyEventHandler();

 3) 델리게이트를 이용하여 이벤트를 선언한다. 미리 정의된 이벤트인 경우에는 이 과정을 생략함.

event MyEventHandler MyEvent;

 4) 이벤트에 이벤트 처리기를 등록한다

MyEvent += new MyEventHandler(Method);

 5) 마지막으로 이벤트를 발생시킨다. 미리 정의된 이벤트는 사용자 행동에 의해 이벤트가 발생한다

if(MyEvent != null) MyEvent();

 

ex)

using System;

using System.Windows.Forms;

class EventApp : Form {  

public EventApp() {            //생성자

this.Click+=new EventHandler(ClickEvent);    //4) 이벤트 처리기 등록

}

void ClickEvent(object sender, EventArgs e) {      //1) 이벤트 처리기 작성

MessageBox.Show("Hello World");

}

public static void Main() {

Application.Run(new EventApp());

}

}

 

6. 스레드

순차 프로그램과 유사하게 시작, 실행, 종료의 순서르르 가진 제어의 흐름.

C#에서 스레드는 델리게이트를 이용하여 처리함. ThreadStart 델리게이트를 통하여 스레드 몸체에 해당하는 메소드를 연결한 후 생성된 델리게이트 객체를 매개변수로 스레드 객체를 생성한다. C#에서 멀티스레드를 지원하기 위해 제공된 System.Threading 네임스페이스를 포함해야 한다. 스레드 객체 생성 후 Start() 메소드를 호출하여 스레드를 실행한다.

 

ex)

using System;

using SYstem.Threading;                //반드시 포함

class ThreadApp {

static void ThreadBody() {        //스레드 몸체

Console.WriteLine("In the thread body ...");   //실행순서 3

}

public static void Main() {

ThreadStart ts = new ThreadStart(ThreadBody);

Thread t = new Thread(ts);

Console.WriteLine("*** Start of Main");        //실행순서 1

t.Start();

Console.WriteLine("*** End of Main");        //실행순서 2

}

}

 

첫번째 메시지 출력 후 스레드를 시작하며 t가 스레드이기 때문에 Main()의 실행이 계속되어 두번째 메시지 출력 후 t가 실행되어 실행결과의 마지막줄에  스레드 내용이 출력됨.

 

7. 제네릭

같은 기능을 하지만 자료형에 따라 중복된 프로그램을 작성해야 하는 불편을 해소하기 위해 제네릭 이란 개념이 도입됨. 자료형을 매개변수로 가짐.

C#에서 지원하는 제네릭 프로그램 단위에는 클래스, 구조체, 인터페이스, 메소드가 있다.

 

실질적인 자료형을 <>안에 명시해준다.

 

ex)

using System;

class Stack<StackType> {

private StackType[] stack = new StackType[100];

private int sp = -1;

public void Push(StackType element) {

stack[++sp] = element;

}

public StackType Pop() {

return stack[sp--];

}

}

class GenericClassApp {

public static void Main() {

Stack<int> stk1 = new Stack<int>();                 //정수형 스택

Stack<double> stk2 = new Stack<double>();    //실수형 스택

stk1.Push(1); stk1.Push(2); stk1.Push(3);

Console.WriteLine("integer stack : " + stk1.Pop() + " " + stk1.Pop() + " " + stk1.Pop());

stk2.Push(1.5); stk2.Push(2.5); stk2.Push(3.5);

Console.WriteLine("double stack : " + stk2.Pop() + " " + stk2.Pop() + " " + stk2.Pop());

}

}


본문 :  http://blishk.tistory.com/88

728x90
반응형

'Programming Language > C#' 카테고리의 다른 글

[C#] 기본특징  (0) 2013.05.15
[C#] 윈도우 폼 + DB 환경 구축 + 메시지 출력 + 사진올리기  (0) 2013.05.15
[C#] 연산자중복  (0) 2013.05.15