Microsoft PowerPoint - hci2-lecture7.ppt [호환 모드]

Similar documents
Microsoft PowerPoint - hci2-lecture7.ppt [호환 모드]

JAVA PROGRAMMING 실습 08.다형성

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

선형대수학 Linear Algebra

JVM 메모리구조

PowerPoint Presentation

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - hci2-lecture12 [호환 모드]

PowerPoint Template

PowerPoint Presentation

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

설계란 무엇인가?

(Microsoft PowerPoint - hci2-lecture12 [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - C++ 5 .pptx

C# Programming Guide - Types

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint Presentation

JAVA PROGRAMMING 실습 05. 객체의 활용

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

PowerPoint 프레젠테이션

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

Design Issues

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

슬라이드 1

윈도우시스템프로그래밍

JAVA PROGRAMMING 실습 02. 표준 입출력

제11장 프로세스와 쓰레드

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - CSharp-10-예외처리

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Lect07.pptx

<4D F736F F D20BEBEBCA520C4DAB5F920BFACBDC0202D20B8D6C6BC20BEB2B7B9B5E5BFCD20C0CCBAA5C6AE2E646F6378>

Microsoft PowerPoint - Chap12-OOP.ppt

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Visual Basic 반복문

슬라이드 1

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

17장 클래스와 메소드

chap 5: Trees

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

쉽게 풀어쓴 C 프로그래밍

C++ Programming

untitled

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerPoint Presentation

PowerPoint Presentation

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

PowerPoint Template

Microsoft PowerPoint - 2강

Microsoft PowerPoint - chap10-함수의활용.pptx

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

03_queue

Microsoft PowerPoint - 04-UDP Programming.ppt

PowerPoint Presentation

PowerPoint 프레젠테이션

untitled

Microsoft PowerPoint - ch07 - 포인터 pm0415

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

JAVA PROGRAMMING 실습 02. 표준 입출력

PowerPoint Presentation

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

교육자료

슬라이드 1

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

쉽게

Microsoft PowerPoint - CSharp-2-기초문법

gnu-lee-oop-kor-lec11-1-chap15

Chapter 4. LISTS

쉽게 풀어쓴 C 프로그래밊

Spring Boot/JDBC JdbcTemplate/CRUD 예제

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

JAVA PROGRAMMING 실습 09. 예외처리

DBMS & SQL Server Installation Database Laboratory

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

adfasdfasfdasfasfadf

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Chapter #01 Subject

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

JAVA PROGRAMMING 실습 02. 표준 입출력

초보자를 위한 C# 21일 완성

어댑터뷰

PowerPoint 프레젠테이션

LINQ의 개요

금오공대 컴퓨터공학전공 강의자료

Lab 3. 실습문제 (Single linked list)_해답.hwp

Network Programming

제 1장 C#의 개요

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

윈도우시스템프로그래밍

07 자바의 다양한 클래스.key

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Transcription:

Overview 고급 C# 프로그래밍 321190 2013 년가을학기 10/5/2013 박경신 속성 (Property), 인덱서 (Indexer) 대리자 (Delegate), 이벤트 (Event) 무명메소드 (Anonymous Method) 람다식 (Lambda Expression) 특성 (Attribute) 제네릭 (Generic) 컬렉션 (Collections) 파일입출력 (File I/O) 어셈블리 (Assembly) Property 속성이란클래스의속성을함수적동작에의하여표현하는구성요소 필드처럼보이지만실제로는메소드처럼동작 get, set 접근자에의하여표현 클래스의내부구조를추상적으로표현하여보호 내부적으로메모리가배정되지않음 메소드처럼동작하므로 virtual, static, abstract, override 키워드사용가능 Property 속성설명 name : private로설정된 Car 클래스의멤버필드 Name : public으로설정된 Car 클래스의속성 (Property) get : read 기능을수행하는메소드 set : write기능을수행하는메소드 value : set 접근자에게전달되는인자값 public class Car { private string name; public string Name { get { return name; set { name = value;

Property 속성종류 Read-Write 속성 : get, set 접근자모두를사용하며 property의가장일반적인모습 Read-only 속성 :get 접근자만프로퍼티에존재하며읽을수만있는읽기전용속성 Write-only 속성 : set 접근자만사용하며멤버필드에값을쓰기만할수있는속성 Static 속성 : 클래스레벨에존재하는속성으로, 개체를만들지않고도사용이가능하며,this 키워드사용이불가능 Property public class Car { private string name; public string Name { get { return name; set { name = value; public class PropertyTest { public static void Main(string[] args) { Car c = new Car(); // set연산자호출 c.name = 아반테 "; // get 연산자호출 Console.WriteLine(c.Name); Indexer 인덱서 (indexer) 란내부적으로객체를배열처럼사용할수있게해주는일종의연산자 속성과마찬가지로모습은필드이지만실제로는메소드로작동 인덱서특징 필드처럼보이지만실제로는메소드처럼동작 get, set 접근자에의하여표현 this 키워드를반드시사용 배열에접근하는것처럼 [] 기호를사용 Indexer public class FavoriteIndexer { private Hashtable myfavorite = new Hashtable(); public string this[string kind] { get { return (string)myfavorite[kind]; set { myfavorite[kind] = value; public class IndexerTest { public static void Main(string [] args) { FavoriteIndexer in = new FavoriteIndexer (); // string indexer 의 set 연산자호출 in["fruit"] = "apple"; in["color"] = "blue"; // string indexer 의 get 연산자호출 System.Console.WriteLine(in["fruit"]); // apple System.Console.WriteLine(in["color"]); // blue

Delegate & Event 대리자 (Delegate) Delegate 생성 Delegate +/- Operator 이벤트 (Event) Events 동작원리 Event 구성요소 이벤트핸들러대리자 (Delegate) 이벤트를발생시키는객체 (Publisher) 이벤트에응답하는객체 (Subscriber) 이벤트매개변수 (Event Argument) 9 Delegate 대리자특징 메소드를간접호출할때사용되는 method pointer 대리자의구조는함수의포인터 ( 주소 ) 를저장하는구조 저장되는함수의원형과대리자함수의원형은반드시같아야함 ( 매개변수리스트와반환값이동일 ) 객체지향의속성중에다형성과비슷한작업을수행 프로그램의실행시에생성 Method1(int x) DoWork() { {...... MethodX(100); MethodX delegate... Method2(int y) { caller contract... Implementer Delegate Delegate 정의, 생성및사용 delegate 키워드를사용하여정의 new 키워드를통하여생성 Delegate 호출로메소드간접호출 // 대리자정의 public delegate void DelegateMethod(int x); // 대리자가지칭할메소드구현 public static void CallbackMethod(int x) ){ Console.WriteLine(x); (); // 대리자생성및초기화 DelegateMethod dm = new DelegateMethod(CallbackMethod); // 또는 DelegateMethod dm = CallbackMethod; 간접호출될메소드... // 대리자를이용한메소드간접호출 dm(100); // CallbackMethod(100) 호출 11 Delegate public class Click { public void MouseClick(string what) { System.Console.WriteLine(" 마우스의 {0 버튼이클릭됐습니다.",what); public void KeyBoardClick(string i what) { System.Console.WriteLine(" 키보드의 {0 버튼이클릭됐습니다.",what); public delegate void OnClick(string what); // 대리자정의 public class DelegateTest { public static void Main(string[] args) { Click c = new Click(); OnClick dm = new OnClick(c.MouseClick); dm(" 왼쪽 "); // c.mouseclick( MouseClick( 왼쪽 ) 호출 dm = new OnClick(c.KeyBoardClick); dm(" 스페이스 "); // c.keyboardclick( 스페이스 ) 호출

Delegate 사용예 using System; class NumClass { public int number; public NumClass() { this.number =0; public void Plus(int value) { this.number += value; public void Minus(int value) { this.number -= value; public static void PrintHello(int value) { for(int i=0;i<value;i++) Console.WriteLine("Hello"); // Callback할메소드형식으로대리자선언 public delegate void Handler(int value); class DelegateTest { public static void Main() { NumClass c = new NumClass(); // 인스턴스메소드위임 Handler h = new Handler(c.Plus); // c.plus 대리자생성 h(10); // 대리자로 c.plus(10) 호출 => 10 Console.WriteLine( h(10)={0",c.number); // h(10)=10 c.plus(20); // 30 Console.WriteLine("c.Plus(20)={0",c.number); //c.plus(20)=30 h = new Handler(c.Minus); // c.minus 대리자생성 h(10); // 대리자로 c.minus(10) 호출 => 20 Console.WriteLine( h(10)={0",c.number); // h(10)=20 c.minus(20); // 0 Console.WriteLine( WriteLine("cMinus(20) c.minus(20)={0 {0",c.number); //cminus(20) //c.minus(20)=00 // 정적메소드위임 h = new Handler(NumClass.PrintHello); // 대리자생성 h(3); // 대리자로 NumClass.PrintHello(3) 호출 Hello 3 번출력 13 Multiple Delegate Delegate Operator Combine (+) : 대리자를결합하는연산자 Remove (-) : 대리자를제거하는연산자 public static void Main() { NumClass c = new NumClass(); Handler h = new Handler(c.Plus) + new Handler(c.Minus); // 대리자 Combine //h = (Handler) Delegate.Combine(new Handler(c.Plus), new Handler(c.Minus)); h(10); // c.plus(10) 와 c.minus(10) 를함께호출 Console.WriteLine("c.number={0",c.number); // c.number=0 h = h -new Handler(c.Minus); // 대리자 Remove //h = (Handler) Delegate.Remove(h, new Handler(c.Minus)); h(10); // c.plus(10) 만호출 Console.WriteLine("c.number={0",c.number); b // c.number=10 h += new Handler(NumClass.PrintHello); h(5); // c.plus(5) 와 NumClass.PrintHello(5) 를함께호출 Console.WriteLine("c.number={0",c.number); i b // c.number=15 14 Multiple Delegate delegate void StringHandler(string s); class DelegateTest { public static void Hello(string s) { Console.WriteLine("Hello {0!", s); public static void Bye(string s) { Console.WriteLine( Bye Bye {0!", s); public static void Main() { StringHandler x, y, z, w; // Hello 메소드를참조하는 x delegate 객체생성 x = new StringHandler(Hello); // Bye 메소드를참조하는 y delegate 객체생성 y = new StringHandler(Bye); // delegate x, y를결합하여 z delegate에대입 z = x + y; // 결합된 delegate z에서 x를제거한 w delegate w=z - x; 15 Console.WriteLine( 대리자 x 호출 "); x( X"); // Hello X! Console.WriteLine( 대리자 y 호출 "); y( Y"); // Bye Bye Y! Console.WriteLine( 대리자 z 호출 "); z( Z"); // Hello Z! Bye Bye Z! Console.WriteLine( 대리자 w 호출 "); w( W"); // Bye Bye W! Event Event란발생한사건을알리기위해보내는메시지 이벤트는마우스클릭, 키누름등동작의발생을알리기위해개체에서보내는메시지 GUI 컨트롤, 특정객체의상태변화를알리는신호로사용 이벤트, 이벤트발생기, 이벤트처리기로구성됨 이벤트송신기 (Publisher) 에서이벤트를발생시키고, 이벤트수신기 (Subscriber) 에서이벤트를캡처하여이벤트에응답 NET Framework에서의이벤트는 delegate 모델에기반 delegate 는이벤트에대해등록된이벤트처리기 (event handler) 목록을유지하여이벤트를발생시킨객체의발송자역할담당 16

Event 동작원리 이벤트송신기 (Publisher) 이벤트 (Event) 를발생하여특정객체 (Subscriber) 에게통지 이벤트수신기 (Subscriber) Publisher 특정이벤트발생시이벤트에반응하여처리할개체 Publisher로부터호출되어질이벤트처리메소드 (Event Handler) 를등록한객체 Event e Event Handler list == Delegate Invocation List Object1.method Subscribers Obj1 Request Object2.method Obj2 Delegate d Object3.method Obj3 17 Event 구성요소 이벤트핸들러대리자 (Delegate) 이벤트에응답하는메소드를가리키는대리자 닷넷프레임워크에서정의된 EventHandler 대리자형식으로선언 public delegate void EventNameEventHandler (Object sender, EventArgs e) Object sender 이벤트발생객체 EventArgs e 이벤트발생시넘겨줄추가정보, EventArgs 클래스로부터상속 추가정보를사용하지않는이벤트에대해서는닷넷프레임워크에서정의된 EventHandler 대리자이용 18 Event 구성요소 이벤트를발생시키는객체 (Publisher) 이벤트선언 event 키워드를사용하여대리자형식의필드처럼사용 인터페이스에서정의가능 public event EventNameEventHandler EventName; 이벤트를발생시키는내용을포함하는메소드 (OnEventName) 정의 이벤트를선언한클래스에서만이벤트호출 ( 발생 ) 하위클래스에서재정의하거나호출가능하도록 virtual 로정의 public class EventPub { public event MyEventEventHandler MyEvent; // 이벤트선언 protected virtual void OnMyEvent(EventArgs e) { if (MyEvent!= null) MyEvent(this, e); // 이벤트호출 ( 발생 ) 19 Event 구성요소 이벤트에응답하는객체 (Subscriber) 이벤트처리 (Event Handler) 메소드정의 이벤트핸들러대리자형식 하위클래스에서재정의하거나호출가능하도록 virtual 로정의 이벤트처리메소드를이벤트대리자에연결 ( 등록 ) class EventSub { virtual void MyEventH(Object sender, EventArgs e){... // 이벤트핸들러 EventPub p = new EventPub(); // publisher object EventSub s = new EventSub(); // subscriber object p.myevent += new MyEventEventHandler(s.MyEventH);// 이벤트핸들러등록 p.onmyevent(args); // 이벤트요청 20

Event 구성요소 이벤트매개변수 (Event Argument) 이벤트발생시추가할정보 이벤트핸들러로넘겨줄데이터 EventName EventArgs 클래스정의 System.EventArgs에서파생 // 이벤트매개변수클래스정의 (System.EventArgs 에서상속 ) class MyEventEventArgs : EventArgs { // 이벤트매개변수객체생성 MyEventEventArgs args = new MyEventEventArgs(..); // 이벤트발생시매개변수로처리 p.onmyevent(args); 21 Delegate 를통한이벤트처리 using System; namespace EventTest { public delegate void MyEventEventHandler(); // 대리자이벤트모델 class MyButton { // mybutton 클래스는윈도우응용프로그램이제공하는버튼컨트롤 public event MyEventEventHandler MyEvent; // 이벤트정의 public void OnMyEvent() { if (MyEvent!= null) MyEvent(); // 이벤트발생메소드 class EventTest { public EventTest() { // 이벤트를가지고있는 MyButton을객체로만듦 MBtt MyButton btt button1 = new MyButton(); MBtt // 이벤트에 button1_click을위임 button1.myevent += new MyEventEventHandler(this.button1_Click); // 이벤트에 button1 의이벤트를발생 button1.onmyevent(); void button1_click() { Console.WriteLine( 버튼에서이벤트발생 ); static void Main(string[] args) { EventTest e = new EventTest(); // 버튼에서이벤트발생 22 Delegate 를통한이벤트추가및제거 class EventTest { 클릭이벤트추가후버튼클릭 public EventTest() { -> 클릭이벤트발생 // 이벤트를가지고있는 MyButton을객체로만듦변경이벤트추가후버튼클릭 MyButton button1 = new MyButton(); -> 클릭이벤트발생 Console.WriteLine( 클릭이벤트추가후버튼클릭 ); -> 변경이벤트발생 // 이벤트에 button1_click을위임 button1.myevent 1M t += new MyEventEventHandler(this.button1_Click); th tt // 이벤트에 button1의이벤트를호출 button1.onmyevent(); // button1_click만호출 Console.WriteLine( 변경이벤트추가후버튼클릭 ); // 이벤트에 button1_change를위임 button1.myevent += new MyEventEventHandler(this.button1_Change); // 이벤트에 button1 의이벤트를호출 (Click + Change 호출 ) button1.onmyevent(); // button1_click & button1_change 함께호출 void button1_click() { Console.WriteLine( WriteLine( -> 클릭이벤트발생 ); void button1_change() { Console.WriteLine( -> 변경이벤트발생 ); static void Main(string[] args) { EventTest e = new EventTest(); 23 Event 에인자전달 delegate void ClickEventHandler(string label); // delegate event class MyButton { // MyButton 클래스는윈도우응용프로그램이제공하는버튼컨트롤 public event ClickEventHandler Click; // 이벤트정의 public void OnClick() { if (Click!= null) Click(label); // 이벤트발생메소드 public string Label { set { label = value; get { return label; string label; class EventTest { public EventTest() { // 이벤트를가지고있는 MyButton 을객체로만듦 MyButton button1 = new MyButton(); // 이벤트에 button1_label을위임 button1.label = 테스트 ; button1.click += new ClickEventHandler(this.button1_Label); // 이벤트에 button1의이벤트를호출 button1.onclick(); // button1_label 호출 void button1_label(string label) { Console.WriteLine( -> 클릭이벤트발생 : + label); static void Main(string[] args) { EventTest e = new EventTest();// -> 클릭이벤트발생 : 테스트 24

Anonymous Method 무명메소드 (Anonymous Method) 를사용하여메소드이름이아닌코드블록자체를대리자 (Delegate) 의매개변수로사용할수있음 별도의메소드를생성할필요가없으므로대리자를객체화하는데따르는코딩오버헤드를줄일수있음 public MyForm() { button1.click += new ClickEventHandler(button1_Click); void button1_click(object sender, EventArgs e) { MessageBox.Show(textBox1.Text); public MyForm() { button1.click += delegate(object sender, EventArgs e) { MessageBox.Show(textBox1.Text); 25 Lambda Expression 람다식 (Lambda Expression) 를사용하여더욱간단히바꿀수있음 public MyForm() { button1.click += delegate(object sender, EventArgs e) { MessageBox.Show(textBox1.Text); public MyForm() { button1.click += (sender, e) => MessageBox.Show(textBox1.Text); 26 C# Lambda Expression 람다식 (lambda expression) 은 =>( 이동 ) 연산자사용 람다식은 anonymous method와비슷하게익명함수 => 왼쪽에입력인자 (0~N개) 를, 오른쪽에실행식 / 문장을둔다. (input parameters) => expression (input parameters) => { statement 람다식의실행문장블록이 1 개일경우 { 괄호를생략가능 (x, y) => x == y (int x, string s) => slength s.length >x // 컴파일러가입력형식을유추못할때명시 () => Write( No ); // 입력매개변수가 0개이면, 빈괄호를지정 (p) => Write(p); str => >{MessageBo MessageBox.Show(str); // 문자열하나를받아메시지박스에출력 delegate int del(int i); del mydelegate = x => x*x; int j = mydelegate(5); // j=25 27 C# Delegate 발전과정 C# 1.0 명시적대리자 (delegate) 사용 C# 2.0 무명메소드 (anonymous method) 사용 C# 3.0 람다식 (lambda expression) 사용 delegate void TestDelegate(string s); static void M(string s) { Console.WriteLine(s); static void Main(string[] args) { // C# 1.0 TestDelegate testdelea= new TestDelegate(M); // C# 2.0 TestDelegate testdeleb= delegate(string s) { Console.WriteLine(s) ; // C# 3.0 TestDelegate testdelec= (s) => { Console.WriteLine(s) ; // invoke the delegates testdelea( Hello. My name is M and I write lines ); testdeleb( That's nothing. I'm anonymous and ); 28 testdelec( I'm a famous author. );

Attribute 특성 (Attribute) 은미리정의된시스템정보나사용자지정정보를대상요소 ( 어셈블리, 클래스, 구조체, 메소드등 ) 와연결시켜주는기능을가짐 Attribute 정보는 Assembly에 Metadata 형식으로저장됨 Attribute 형식 [attribute 명 ( positional_parameter, named_parameter=value,..)] Attribute는 [] 를사용하여, [] 안에 Attribute 이름, 지정위치매개변수와명명매개변수를기입 지정위치매개변수 (positional_parameter) 필수적인정보, 생성자매개변수에해당, 을사용하여값을기입 명명매개변수 (named_parameter) 선택적인정보, 속성에해당, = 를사용하여멤버필드와값을기입 내장특성에 Conditional, DllImport, AttributeUsage 등이 29 있음 Conditional Attribute Conditional 특성은조건부메소드를생성할때사용 특정전처리식별자에의해실행되는조건부메소드 C++ 에서 #if conditional #endif 전처리기지시문과유사 #define 유무에따라서호출이결정되는조건부메소드에사용 반드시 using System.Diagnostics를사용해야함 조건부메소드의반환형이 void 형을사용해야함 #define DEBUG // 만약 #undef DEBUG를하면 Conditional 부분이지나감 using System.Diagnostics; class ConditionalAttributeTest i ib { public static void Main() { [Conditional( DEBUG )] public static void DebugInfoPrint() {. // 요부분만호출 [Conditional( REGULAR )] public static void InfoPrint() {. 30 DllImport Attribute DllImport 특성은닷넷응용프로그램에서관리되지않는 DLL 함수또는메소드를사용할수있게하는특성 반드시 using System.Runtime.InteropService를사용해야함 아래예는, Win32 API의 MessageBox 함수를호출하는경우 using System.Runtime.InteropServices; class DllImportAttributeTest { [DllImport( User32 User32.dll dll, CharSet = CharSet.Auto)] public static extern int MessageBox(int h, String text, String title, uint type) public static void Main() { MessageBox(0, Test Win32 MessageBox, DllImportTest, 2); 31 Generic 제네릭 (Generic) 은다양한자료형에적용될수있는일반적인클래스를정의함 제네릭은사용할자료형을매개변수로전달받음 public class IntStack { int[] items; int count; public void Push(int item) { public int Pop() { public class FloatStack { float[] items; int count; public void Push(float item) { public float Pop() { public class Stack<T> { T[] items; int count; public void Push(T item) { public T Pop() {. Stack<int> istack = new Stack<int>(); istack.push(3); int x = istack.pop(); Stack<float> fstack = new Stack<float>(); fstack.push(3.0); float y = fstack.pop();

Collections 컬랙션 (Collections) 은객체를쉽게다룰수있도록여러가지클래스와인터페이스를미리정의한데이터구조 데이터구조란데이터를다루는방식을정의한것 프로그래머가일일이데이터구조를만드는불편함감소 컬랙션으로 ArrayList, SortedList, Hashtable, Stack, Queue, NameValueCollection 등이있음 컬랙션특징 데이터를보관할수있으며수정, 삭제, 삽입, 검색등의기능 컬랙션은클래스마다구현되어지는알고리즘 ( 예로, LinkedList, Hash, Stack, Queue 등 ) 이다를뿐같은부류임 동적으로메모리확장가능 Collections System.Collections의클래스와인터페이스 SortedList Stack, Queue BitArray NameValueCollections IEnumerable, IEnumerator ICollection IList IDictionary, IDictionaryEnumerator ICloneable ISerializable ArrayList Hashtable SortedList Class SortedList는 Hashtable과 ArrayList의혼합형 내부의데이터는키 (Key) 와값 (Value) 로이루어져있으며키를기준으로정렬되고키와인덱스로접근가능 내부적으로정렬된컬랙션을유지하고있는특징을가짐 public class SortedList: IDictionary, ICollection, IEnumerable, ICloneable SortedList t 특징 키의목록또는값의목록만반환하는메소드제공 내부적으로두개의배열, 즉키에대한배열과값에대한배열을유지하여요소를목록에저장 SortedList는각요소에대해키, 값또는인덱스의세가지방법으로접근 요소가삽입되면, 지정된키가이미존재하는검사 ( 중복키허용안함 ) SortedList Class SortedList 메소드 Add() 키와값으로데이터를삽입 Clear() 모든요소를제거 Contains() 특정키가들어있는지여부를확인 ContainsKey(), ContainsValue() 특정키 / 값이들어있는지여부확인 GetByIndex(), GetKey() 지정한인덱에서값 / 키를가져옴 GetKeyList() 키리스트를가져옴 Remove(), RemoveAt() 지정한키 / 인덱스로요소를제거 GetEnumerator() IDictionaryEnumerator 를반환

Queue Class Queue 는 FIFO(First-In, First-Out) 컬랙션 FIFO 먼저들어간데이터가제일먼저나오는메모리구조를클래스화 public class Queue: ICollection, IEnumerable, ICloneable Queue 메소드 Enqueue() 메소드는큐의첫위치에요소를삽입 Dequeue() 메소드는큐의마지막위치의요소를반환하고삭제 ( 반환되는데이터형은 object형 ) Peek() 메소드는마지막위치의요소를제거하지않고반환 ( 반환되는데이터형은 object형 ) Stack Class Stack 는 LIFO(Last-In, First-Out) 컬랙션 LIFO 제일마지막에들어간데이터가제일먼저나오는메모리구조를클래스화 public class Stack: ICollection, IEnumerable, ICloneable Stack 메소드 Push() 메소드는스택의맨위에요소를삽입 Pop() 메소드는스택의맨위에있는요소를삭제하고데이터반환 ( 반환되는데이터형은 object형 ) Peek() 메소드는스택의맨위에있는요소를제거하지않고반환 ( 반환되는데이터형은 object 형 ) ArrayList Class ArrayList 는 ILIST 를구현한대표적인클래스 ArrayList 는데이터를삽입했을때순서대로삽입되며중간삽입이나제거또한가능 public class ArrayList: IList, ICollection, IEnumerable, ICloneable ArrayList 메소드 Add(), AddRange() 메소드는데이터 / 데이터리스트삽입 Insert() 메소드는중간에데이터삽입 Remove(), RemoveAt(), RemoveRange() 메소드는해당요소제거또는인덱스로요소제거또는범위만큼요소제거 Sort() 메소드는요소정렬 GetEnumerator() 메소드는 IEnumerator 를반환 Hashtable Class Hashtable 은 IDictionary 를구현한대표적인클래스 내부의데이터는키 (Key) 와값 (Value) 을이용 public class Hashtable: IDictionary, ICollection, IEnumerable, Hashtable 메소드 ISerializable, IDeserializationCallback, ICloneable Add() 메소드는 ( 키, 변수 ) 로된데이터삽입 Clear() 메소드는모든요소제거 Remove() 메소드는키를확인하여요소삭제 ContainsKey(), ContainsValue() 메소드는특정키 / 값을포함하는지확인 CopyTo() 메소드는해쉬테이블에있는원소를 1차원배열로복사 Keys, Values 속성은 ICollection 으로반환 GetEnumerator() 메소드는 IEnumerator를반환

Collections Interface IEnumerable 인터페이스 GetEnumerator() IEnumerator 개체를반환 IEnumerator 인터페이스 내부에서 IEnumerable 을사용하여데이터검색기능제공 Current 속성 컬랙션에서현재객체에대한참조를반환 MoveNext() 다음요소로이동 Reset() Current 포인터를컬랙션의처음앞으로설정 ICollection 인터페이스 Count 속성 컬랙션의객체수를반환 IsSynchronized 속성 - 다중스레드된액세스를위해컬랙션에대한액세스를동기화한경우 true 반환 SyncRoot 속성 하나이상의코드문장이동시에한스레드에만실행되는것을확실하게하기위해잠그거나해제 CopyTo() 지정한배열위치부터컬랙션요소를배열로복사 Collections Interface IList 인터페이스 ICollection 인터페이스에서파생된것으로 IEnumerable과 ICollection 기능을모두포함 IsFixedSize 속성 리스트가고정길이리스트인지확인 IsReadOnly 속성 리스트가읽기전용인지확인 인덱서속성 인덱스값으로데이터를얻거나추가 Add() 리스트끝에데이터를추가 Clear() 리스트내의모든데이터를제거 Contains() 어떤데이터가리스트내에존재하는지여부확인 IndexOf() 리스트내의특정데이터의위치를반환 Insert() 리스트내의특정위치에데이터를삽입 Remove() 매개변수로입력된객체를리스트내에서제거 RemoveAt() 지정한인덱스의데이터를제거 Collections Interface IDictionary 인터페이스 순서에의존하는 IList와달리키와값으로대응시켜데이터를추출 IsFixedSize 속성 컬랙션의크기가정해져있는지검사 IsReadOnly 속성 컬랙션이읽기전용인지확인 Keys 속성 컬랙션내의모든키를나열 Values 속성 컬랙션내의모든값을나열 Add() 키와값을전달하여데이터를컬랙션에추가 Clear() 컬랙션의모든데이터를제거 Contains() 특정키가데이터와연관되어있는지검사 GetEnumerator() IDictionaryEnumerator 반환 Remove() 삭제할값의키를전달하여데이터를컬랙션에서제거 IDictionaryEnumerator 인터페이스 DictionaryEntry 속성 열거요소내의키와값을가져옴 Key 속성 열거요소내의키를가져옴 Value 속성 열거요소내의값을가져옴 LINQ C# 3.5 LINQ(Language Integrated Query) 쿼리 쿼리는데이터소스에서데이터를검색하는식 배열 / 데이터베이스에서조건에맞는자료만뽑는기능을제공 IEnumerable<T> (instance) = from ( 자동변수 ) in ( 배열 /DB) where ( 조건 ) select ( 리턴값 ) // 1. Data source int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 ; // 2. Query creation ( 짝수만선택 ) var numquery = from num in numbers where e (num % 2) == 0 select num; // 3. Query execution foreach (int num in numquery) Console.WriteLine( {0,1, i num);

LINQ 데이터소스 (DataSource) 데이터소스는 IEnumerable<T> 나 IQueryable<T> 인터페이스에서파생된것이면 LINQ를사용하여쿼리가능한형식임 테이터소스가쿼리가능한형식으로존재하지않는경우 LINQ 공급자가소스를나타내야함 // Create a data source from an XML document using System.Xml.Linq XElement contacts = XElement.Load(@ C:\myContactList.xml ); // LINQ to SQL Northwnd db = new Northwnd(@ C:\northwnd.mdf ); IQueryable<Customer> custquery = from cust in db.customers where cust.city == London select cust; LINQ 필터링 가장일반적인쿼리작업은 boolean 형식으로필터를적용하는것임 결과는 where 절을사용하여생성됨 && 및 연산자를사용하여 where 절에필요한만큼의필터식을적용가능 정렬 orderby절은반환된시퀀스의요소가정렬하고있는형식의기본비교자에따라정렬됨 var querylondoncustomers = from cust in db.customers where cust.city == London && cust.name == Devon orderby cust.name ascending select cust; LINQ 그룹화 group절을사용하면지정한키에따라결과를그룹화가능 그룹화결과를참조해야하는경우 into 키워드사용하여계속쿼리할수있는식별자를만들어야함 조인 데이터소스에서명시적으로모델링않된시쿼스간의연결생성 join절은 DB 테이블에직접작업하는대신개체컬랙션에대해작업 선택 ( 프로젝션 ) select 절에서쿼리결과를생성하고각반환된요소의형식지정 var querycustomers = from cust in db.customers group cust by cust.city into custgroup where custgroup.count() > 2 // 3 명이상의고객을포함하는그룹만반환 orderby custgroup.key select custgroup; LINQ 표준쿼리연산자확장메서드 LINQ의선언적쿼리구문은컴파일할때 CLR에대한메서드호출으로변환됨 이러한메서드호출은같은이름을사용하는표준쿼리연산자 Where, Select, GroupBy, Join, Max 및 Average 메서드구문을직접사용가능 int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 ; // Query Syntax var numquery1 = from num in numbers where (num % 2) == 0 orderby num select num; // Method Syntax var numquery2 = numbers.where(num => num%2 == 0).OrderBy(n=>n);

FILE I/O 스트림 (Stream) 자료의입출력을도와주는추상적인개념의중간매체 입력스트림 (Input Stream) 은데이터를스트림으로읽어들임 출력스트림 (Output Stream) 은데이터를스트림으로내보냄 스트림을사용하는곳 파일 키보드, 모니터, 마우스 메모리 네트워크 프린트 FILE I/O 입출력스트림 (Input/Output Stream) 클래스 FileStream 클래스 파일에스트림을생성하는클래스 BufferedStream 클래스 버퍼기능을가진바이트스트림 MemoryStream 클래스 메모리에입출력바이트스트림 TextReader & TextWriter 클래스 문자스트림입출력추상클래스 StringReader & StringWriter 클래스 string 입출력스트림 BinaryReader & BinaryWriter 클래스 데이터타입의메모리사이즈에따른바이너리입출력스트림 파일 (File) 과디렉토리 (Directory) 클래스 FileSystemInfo 파일시스템객체를나타내는기본클래스 Directory, DirectoryInfo 디렉토리를나타내는기본클래스 File, FileInfo 파일을나타내는기본클래스 Path 경로클래스 FILE I/O File 클래스 I/O 기본클래스로파일에관련된정보를제공하거나, FileStream의객체를생성하여파일의 I/O작업을수행 sealed 키워드를사용하여클래스의상속을막음 멤버메소드들이 public static으로선언 using System.IO 를사용 파일관련메소드제공 Create, Copy, Move, Delete 파일을생성, 복사, 이동, 삭제 Open, OpenRead, OpenText, OpenWrite 파일열기 AppendText 유니코드텍스트를추가하는 StreamWriter 생성 Exists 파일존재여부를확인 SetCreationTime, GetCreationTime 파일이생성된날짜와시간 SetAttributes, GetAttributes 파일의지정된 FileAttributes 등등 FILE I/O Directory 클래스 디렉토리생성, 이동, 삭제, 디렉토리존재여부, 하위디렉토리들의이름, 디렉토리내의파일이름의정보를알아내는데사용하는클래스 sealed 키워드를사용하여클래스의상속을막음 멤버메소드들이 public static으로선언 디렉토리관련메소드제공 CreateDirectory, Delete 디렉토리생성, 이동, 삭제 Exists 디렉토리존재여부를확인 GetFiles 디렉토리에있는파일목록배열반환 GetDirectories 디렉토리에있는하위디렉토리목록배열반환

FILE I/O Path 클래스 파일이나디렉토리의경로 (Path) 를확장및변경, 수정하는클래스 sealed 키워드를사용하여클래스의상속을막음 멤버필드와메소드들이 public static ti 으로선언 경로관련필드와메소드제공 DirectorySeparatorChar 디렉토리구분자캐릭터 Combine 경로들결합 GetFileName 경로에서파일이름을얻기 FILE I/O FileStream 클래스 파일입출력뿐만아니라파일과관련된다른운영체제의핸들 ( 파이프, 표준입력, 표준출력등 ) 을읽고쓰는데도유용하게사용 바이트스트림이아닌문자스트림을사용하기위해서는 FileStream을 StreamReader와 StreamWriter로변환하여사용 using System.IO; class FileTest { public static void Main() { FileStream fs = File.OpenRead( C:/Test.txt ); StreamReader r = new // 한글처리시필요 StreamReader(fs, System.Text.Encoding.Default); r.basestream.seek(0, S SeekOrigin.Begin); i i while(r.peek() > -1) { r.readline();. r.close(); FILE I/O using System.IO; class FileTest { public static void Main() { string path = @ C:\Output.txt ; @C:\Output.txt FileStream fs = new FileStream(path, FileMode.Create); StreamWriter w = new // 한글처리시필요 StreamWriter(fs, System.Text.Encoding.Default); t //w.basestream.seek(0, SeekOrigin.Begin); w.basestream.seek(0, SeekOrigin.End); // 맨뒤에추가 w.writeline(s); //. 중간생략 w.flush(); // 스트림에기록한모든데이터를밀어내는역할 wclose(); w.close(); Assembly COM 이미사용중인검증된코드의재사용을위해 COM 활용 서로다른언어로작성된 Binary 타입공유를위해 COM 서버생성 Client 에서 COM 서버를호출할때 COM 서버의버전을확인할수없음 COM 서버위치나이름이바뀌게되면 Registry의변경이쉽지않음 Assembly 어셈블리란.exe,.dll과같은프로그램의제일작은실행단위 배포의단위로써코드재사용및버전관리를가능하게하는단위 Class 접근제한자인 internal의허용단위 같은 COM DLL에대한서로다른버전동시제공가능 ( 즉, Client가원하는버전을파악하여해당버전을로딩 ) 어셈블리내에자신에대한메타데이터를포함하여배포는해당파일을원하는위치에복사함 ( 즉, Registry에등록하지않음 ) Native Code가아니라 MSIL이라는중간코드

Assembly 어셈블리의구성 Manifest - 다른어셈블리를참조한다면그정보가필요함 Type Metadata - 어셈블리안에존재하는클래스, 속성, 메소드, 변수등에대한정보 MSIL 컴파일했을때만들어지는실제실행파일 Resource - 어셈블리가사용하는리소스이며해당프로그램의이미지나텍스트, 아이콘등 Assembly ILDASM 도구 Visual C++ 의 dumpbin.exe나 Turbo C의 tdump.exe에해당하는유틸리티로실행파일의내부구조를보여줌 메니페스트메타정보를표시.assembly.class : 해당어셈블리내에존재하는클래스파일의정보를보여줌.method : 해당어셈블리내에존재하는메소드의정보를보여줌.ctor : constructor 파일의약자로생성자를의미 Assembly C# DLL 생성 새프로젝트 -> 템플렛 -> 클래스라이브러리선택 어셈블리로사용할기능은 *.cs 파일로작성 컴파일은 *dll *.dll 파일로작성 C# DLL 활용 해당어셈블리가필요한곳에서 DLL 참조하여사용 해당어셈블리의네임스페이스 using 어셈블리의속성, 메소드사용 Assembly csc 컴파일러를사용한 C# DLL 생성및활용예 Point 클래스와 Point3D 클래스를 PointLib 라이브러리로생성 csc /out:pointlib.dll /t:library Point.cs Point3D.cs PointTest t 클래스에서 PointLib 라이브러리사용 csc /out:pointtest.exe /reference:pointlib.dll PointTest.cs 작업한어셈블리참조추가하기