C# 언어의고급프로그래밍기법 응용프로그램을보다짜임새있고원론적으로작성가능델리게이트 객체지향특성이반영된메소드포인터이벤트와스레드를처리하는방법론 애트리뷰트 프로그래밍단위 ( 어셈블리, 클래스, 메소드등 ) 에줄수있는추가적인정보언어시스템에서실행시간에다양하게활용할수있는방법을지원 예외처리 실행중에발생하는에러언어시스템에서에러처리를지원
델리게이트 (delegate) 는메소드참조기법객체지향적특징이반영된메소드포인터 이벤트와스레드를처리하기위한방법론 특징정적메소드및인스턴스메소드참조가능 객체지향적델리게이트의형태와참조하고자하는메소드의형태는항상일치 타입안정적델리게이트객체를통하여메소드를호출 메소드참조 VS. 함수포인터 (C/C++) 메소드참조기법면에서유사객체지향적이며타입안정적
정의형태 [modifiers] delegate returntype DelegateName(parameterList); 수정자 접근수정자 new public, protected, internal, private 클래스밖에서는 public 과 internal 만가능 델리게이트정의시주의점 델리게이트할메소드의메소드반환형및매개변수의개수, 반환형을일치시켜야함
델리게이트정의예 delegate void SampleDelegate(int param); // 델리게이트정의 class DelegateClass { public void DelegateMethod(int param) { // 델리게이트할메소드 //...
델리게이트를사용하기위해서는델리게이트객체를생성하고대상메소드를연결해야함 해당델리게이트의매개변수로메소드의이름을명시 델리게이트객체에연결할수있는메소드는형태가동일하면인스턴스메소드뿐만아니라정적메소드도가능 델리게이트생성 ( 인스턴스메소드 ) 델리게이트할메소드가포함된클래스의객체를먼저생성 정의된델리게이트형식으로델리게이트객체를생성 생성된델리게이트를통하여연결된메소드의호출 델리게이트객체생성예 DelegateClass obj = new DelegateClass(); SampleDelegate sd = new SampleDelegate(obj.DelegateMethod);
델리게이트객체의호출은일반메소드의호출과동일 델리게이트를통하여호출할메소드가매개변수를갖는다면델리게이트를호출하면서 ( ) 안에매개변수를기술
[ 예제 6.1 - DelegateCallApp.cs] using System; delegate void DelegateOne(); // delegate with no params delegate void DelegateTwo(int i); // delegate with 1 param class DelegateClass { public void MethodA() { Console.WriteLine("In the DelegateClass.MethodA..."); public void MethodB(int i){ Console.WriteLine("DelegateClass.MethodB, i = " + i); class DelegateCallApp { public static void Main() { DelegateClass obj = new DelegateClass(); DelegateOne d1 = new DelegateOne(obj.MethodA); DelegateTwo d2 = new DelegateTwo(obj.MethodB); d1(); // invoke MethodA() in DelegateClass d2(10); // invoke MethodB(10) in DelegateClass 실행결과 : In the DelegateClass.MethodA... DelegateClass.MethodB, i = 10
하나의델리게이트객체에형태가동일한여러개의메소드를연결하여사용가능 C# 언어는델리게이트를위한 + 와 연산자 ( 메소드추가 / 제거 ) 를제공 멀티캐스트델리게이션 (multicast delegation) 델리게이트연산을통해하나의델리게이트객체에여러개의메소드가연결되어있는경우, 델리게이트호출을통해연결된모든메소드를한번에호출 델리게이트를통하여호출되는순서는등록된순서와동일
[ 예제 6.2 - MultiCastApp.cs] using System; delegate void MultiCastDelegate(); class Schedule { public void Now() { Console.WriteLine("Time : "+DateTime.Now.ToString()); public static void Today() { Console.WriteLine("Date : "+DateTime.Today.ToString()); class MultiCastApp { public static void Main() { Schedule obj = new Schedule(); MultiCastDelegate mcd = new MultiCastDelegate(obj.Now); mcd += new MultiCastDelegate(Schedule.Today); mcd(); 실행결과 : Time : 2005-06-11 오후 12:05:30 Date : 2005-06-11 오전 12:00:00
이벤트 (event) 사용자행동에의해발생하는사건어떤사건이발생한것을알리기위해보내는메시지 C# 에서는이벤트개념을프로그래밍언어수준에서지원 이벤트처리기 (event handler) 발생한이벤트를처리하기위한메소드 이벤트 - 주도프로그래밍 (event-driven programming) 이벤트와이벤트처리기를통하여객체에발생한사건을다른객체에통지하고그에대한행위를처리하도록시키는구조를가짐 각이벤트에따른작업을독립적으로기술 프로그램의구조가체계적 / 구조적이며복잡도를줄일수있음
정의형태 [event-modifier] event DelegateType EventName; 수정자 접근수정자 new, static, virtual, sealed, override, abstract, extern 이벤트처리기는메소드로배정되기때문에메소드수정자와종류 / 의미가같음
이벤트정의순서 1 이벤트처리기를작성 2 이벤트처리기의형태와일치하는델리게이트를정의 ( 또는 System.EventHandler 델리게이트를사용 ) 3 델리게이트를이용하여이벤트를선언 ( 미리정의된이벤트인경우에는생략 ) 4 이벤트에이벤트처리기를등록 5 이벤트를발생 ( 미리정의된이벤트는사용자행동에의해이벤트가발생 ) 이벤트가발생되면등록된메소드가호출되어이벤트를처리 미리정의된이벤트발생은사용자의행동에의해서발생 사용자정의이벤트인경우에는명시적으로델리게이트객체를호출함으로써이벤트처리기를작동
[ 예제 6.4 - EventHandlingApp.cs] using System; public delegate void MyEventHandler() // 2 이벤트를위한델리게이트정의 class Button { public event MyEventHandler Push; // 3 이벤트선언 public void OnPush() { if (Push!= null) Push(); // 5 이벤트발생 class EventHandlerClass { public void MyMethod() { // 1 이벤트처리기작성 Console.WriteLine("In the EventHandlerClass.MyMethod..."); class EventHandlingApp { public static void Main() { Button button = new Button(); EventHandlerClass obj = new EventHandlerClass(); button.push += new MyEventHandler(obj.MyMethod); // 4 등록 button.onpush(); 실행결과 : In the EventHandlerClass.MyMethod...
이벤트처리기등록 델리게이트객체에메소드를추가 / 삭제하는방법과동일 사용연산자 = : 이벤트처리기등록 + : 이벤트처리기추가 - : 이벤트처리기제거 Event = new DelegateType(Method); // 이벤트처리기등록 Event += new DelegateType(Method); // 이벤트처리기추가 Event -= new DelegateType(Method); // 이벤트처리기제거
C# 언어에서의이벤트사용 프로그래머가임의의형식으로델리게이트를정의하고이벤트를선언할수있도록허용.NET 프레임워크는이미정의된 System.EventHandler 델리게이트를이벤트에사용하는것을권고 System.EventHandler delegate void EventHandler(object sender, EventArgs e); 이벤트와윈도우환경 이벤트는사용자와상호작용을위해주로사용 윈도우프로그래밍환경에서사용하는폼과수많은컴포넌트와컨트롤에는다양한종류의이벤트가존재 프로그래머로하여금적절히사용할수있도록방법론을제공한
[ 예제 6.5 - ClickEventApp.cs] using System; using System.Windows.Forms; class ClickEventApp : Form { public ClickEventApp() { 실행결과 : // 생성자 this.text = "ClickEventApp"; this.click += new EventHandler(ClickEvent); // 등록 //... 이벤트처리기... private void ClickEvent(object sender, EventArgs e) { MessageBox.Show(" sender = " + sender.gettype()); public static void Main() { Application.Run(new ClickEventApp());
Graphics(System.Drawing.Graphics) 클래스 System.Drawing 네임스페이스에포함 선, 사각형, 타원등과같은도형을그리는데필요한기본적인메소드들이존재 그래픽객체 도형을그리기위해필요한 Graphics 클래스의객체그리기판이되는대상객체를얻거나생성하는방법 1 Paint 이벤트처리기의매개변수 2 Control 클래스의 CreateGraphics() 메소드 3 Graphics.FromImage() 메소드
Paint 이벤트의매개변수 Paint 이벤트 : 폼을다시그려야할때발생하는이벤트. 처리기의두번째매개변수에그래픽객체가들어있음. 여기에그리기작업을하면폼에그려짐. Paint 이벤트처리기의메소드형식 private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.graphics; // 그래픽객체를이용한그리기작업 //... PaintEventArgs 클래스 Graphics 프로퍼티 : 그리기에필요한 Graphics 클래스의객체 ClipRectangle 프로퍼티는새로그려야하는영역
Control 클래스의 CreateGraphics() 메소드 Paint 이벤트처리기가아닌다른곳에서그리기를하고자할때사용. 메소드를사용하여그래픽객체를생성 Control 클래스의메소드이기때문에파생된모든클래스에서그래픽객체를만들수있음. 사용방법 private void DrawPrivateObject() { // 단계 1: 그래픽객체를생성한다. Graphics g = CreateGraphics(); //... // 단계 2: 그래픽객체를이용하여그리기를한다. //...
Graphics.FromImage() 메소드이미지에서만들어진그래픽객체이기때문에그리기작업의결과가화면에곧바로나타나지않음. 결과를화면에표시하려면이미지객체를화면에출력해야함. 그리기도중에발생할수있는깜박거림을제거하기위해사용. 사용방법 private void DrawOffScreenImage() { // 단계 1: 이미지객체로부터그래픽객체를생성한다. Image img = new Bitmap(w, h); Graphics bg = Graphics.FromImage(img); //... // 단계 2: bg에그리기작업을한다. //... // 단계 3: 결과이미지를표시하기위한그래픽객체를생성한다. Graphics fg = CreateGraphics(); //... // 단계 4: 이미지를화면에출력한다. fg.drawimage(img, 0, 0);
좌표와관련있는 Point 구조체와 Size 구조체, Rectangle 구조체색상을나타내는 Color 구조체도형을그리거나채우는데사용되는 Pen 클래스와 Brush 클래스글꼴을나타내는 Font 클래스이미지를나타내는 Image 클래스
설명평면상의한점을표시하기위한자료형 x 좌표와 y 좌표의형식으로위치를표시그리기뿐만아니라폼이나컨트롤에서위치를지정하는데도사용생성자 Point pt = new Point(); // (0, 0) 을나타냄. Point pt = new Point(x, y); // (x, y) 좌표를나타냄. 주요프로퍼티 X: X 좌표또는수평위치. Y: Y 좌표또는수직위치. IsEmpty: 빈구조체여부. 관련구조체 PointF 구조체 : 값을실수로표현. PointF -> Point 변환메소드 public static Point Ceiling(PointF value); public static Point Round(PointF value); public static Point Truncate(PointF value); // 올림 // 반올림 // 내림
설명사각형모양을갖는영역의크기를나타내기위해서사용되는구조체영역의크기는폭 (width) 과높이 (height) 로나타냄. 그리기뿐만아니라폼이나컨트롤에서사각형모양으로표시되는영역의크기를나타낼때도사용생성자 Size area = new Size(); Size area = new Size(Width, Height); 주요프로퍼티 Width: 가로폭. Height: 세로높이. IsEmpty: 빈구조체여부. 관련구조체 SizeF 구조체 : 값을실수로표현. SizeF -> Size 변환메소드 public static Size Ceiling(SizeF value); public static Size Round(SizeF value); public static Size Truncate(SizeF value); // 올림 // 반올림 // 내림
설명사각형모양을갖는영역의위치와크기를나타내기위해서사용 Point 구조체와 Size 구조체의개념을모두가지고있는구조체사각형이나또는폼과컨트롤의위치와크기를동시에나타내기위해서사용생성자 Rectangle r = new Rectangle(); Rectangle r = new Rectangle(Point, Size); Rectangle r = new Rectangle(X, Y, Width, Height); 주요프로퍼티 X: 사각영역의왼쪽상단의 X 좌표. Y: 사각영역의왼쪽상단의 Y 좌표. Width: 사각영역의가로폭. Height: 사각영역의세로높이. Left/Top: 사각영역의왼쪽 X 좌표 / 위쪽의 Y 좌표 Right/Bottom: 사각영역의오른쪽 X 좌표 / 아래쪽의 Y 좌표 Location: 사각영역의시작위치 (Point(X, Y)) Size: 사각영역의크기 (Size(Width, Height)) IsEmpty: 빈구조체여부.
관련구조체 RectangleF 구조체 : 값을실수로표현. RectangleF -> Rectangle 변환메소드 public static Rectangle Ceiling(RectangleF value); public static Rectangle Round(RectangleF value); public static Rectangle Truncate(RectangleF value); // 올림 // 반올림 // 내림 주요메소드 Contains(): 점이나영역의포함여부를알려준다. Inflate(): 지정된크기만큼영역을확장한다. Intersect(): 두영역의교차영역을구한다. IntersectsWith(): 두영역의교차여부를알려준다. Offset(): 영역을지정된크기만큼이동한다. Union(): 두영역을포함한최소영역을구한다.
설명 색을 RGB(Red, Green, Blue) 형식으로나타낸구조체 RGB마다각각 0~255 값을가짐. 투명도값인 A(Alpha) 을가질수도있음. 생성자 Color c = Color.FromArgb(R, G, B); Color c = Color.FromArgb(A, R, G, B); Color c = Color.FromKnownColor(KnownColor.Member); Color c = Color.FromName("ColorName");
KnownColor 열거형 시스템색상 : 윈도우의구성요소의색을나타내는색상. 그외색상
사용법 // 1 프로퍼티를이용하여객체생성. Color c = Color.White; // 2 미리정의된열거형상수를이용하여객체생성. Color c = Color.FromKnownColor(KnownColor.White); // 3 미리정의된색상이름을이용하여객체생성. Color c = Color.FromName("White"); // 4 RGB 값을이용하여객체생성. Color c = Color.FromArgb(255, 255, 255); 프로퍼티 R: 빨간색 (red) 의값 (0 255). G: 녹색 (green) 의값 (0 255). B: 파란색 (blue) 의값 (0 255). A: 투명도 (Alpha) 의값 (0 255). IsEmpty: 빈구조체여부.