Overview 고급 C# 프로그래밍 321190 2009 년가을학기 10/12/2009 박경신 속성 (Property), 인덱서 (Indexer) 대리자 (Delegate), 이벤트 (Event) 무명메소드 (Anonymous Method) 특성 (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 { 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 (-) : 대리자를제거하는연산자 NumClass c = new NumClass(); Handler d = new Handler(c.Plus) + new Handler(c.Minus); // 대리자 Combine //d = (Handler) Delegate.Combine(new Handler(c.Plus), new Handler(c.Minus)); d(10); // c.plus(10) 와 c.minus(10) 를함께호출 Console.WriteLine("c.number={0",c.number); // c.number=0 d = d -new Handler(c.Minus); // 대리자 Remove //d = (Handler) Delegate.Remove(d, new Handler(c.Minus)); d(10); // c.plus(10) 만호출 Console.WriteLine("c.number={0",c.number); b // c.number=10 d += new Handler(NumClass.PrintHello); d(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); 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 MyEventHandler 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 MyEventHandler(s.MyEventH); // 이벤트핸들러등록 p.onmyevent(args); // 이벤트요청 20
Event 구성요소 이벤트매개변수 (Event Argument) 이벤트발생시추가할정보 이벤트핸들러로넘겨줄데이터 EventName EventArgs 클래스정의 System.EventArgs에서파생 // 이벤트매개변수클래스정의 (System.EventArgs 에서상속 ) class MyEventArgs : EventArgs { // 이벤트매개변수객체생성 MyEventArgs args = new MyEventArgs(..); // 이벤트발생시매개변수로처리 p.onmyevent(args); 21 Delegate 를통한이벤트처리 using System; namespace EventTest { public delegate void MyEventHandler(); // 대리자이벤트모델 class MyButton { // mybutton 클래스는윈도우응용프로그램이제공하는버튼컨트롤 public event MyEventHandler MyEvent; // 이벤트정의 public void OnMyEvent() { if (MyEvent!= null) MyEvent(); // 이벤트핸들러정의 class EventTest { public EventTest() { // 이벤트를가지고있는 MyButton을객체로만듦 MBtt MyButton btt button1 = new MBtt MyButton(); // 이벤트에 button1_click을위임 button1.myevent += new MyEventHandler(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 MyEventHandler(this.button1_Click); tt // 이벤트에 button1의이벤트를호출 button1.onmyevent(); Console.WriteLine( 변경이벤트추가후버튼클릭 ); // 이벤트에 button1_change를위임 button1.myevent += new MyEventHandler(this.button1_Change); // 이벤트에 button1 의이벤트를호출 (Click + Change 호출 ) button1.onmyevent(); 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 ClickEvent; // 이벤트정의 public void OnClickEvent() { if (ClickEvent!= null) ClickEvent(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.clickevent += new ClickEventHandler(this.button1_Label); // 이벤트에 button1의이벤트를호출 button1.onclickevent(); 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() { addbutton.click += new EventHandler(AddClick); void AddClick(object sender, EventArgs e) { MessageBox.Show(textBox.Text); public MyForm() { addbutton.click += delegate(object sender, EventArgs e) { MessageBox.Show(textBox.Text); 25 Attribute 특성 (Attribute) 은미리정의된시스템정보나사용자지정정보를대상요소 ( 어셈블리, 클래스, 구조체, 메소드등 ) 와연결시켜주는기능을가짐 Attribute 정보는 Assembly에 Metadata 형식으로저장됨 Attribute 형식 [attribute 명 ( positional_parameter, named_parameter=value,..)] Attribute는 [] 를사용하여, [] 안에 Attribute 이름, 지정위치매개변수와명명매개변수를기입 지정위치매개변수 (positional_parameter) 필수적인정보, 생성자매개변수에해당, 을사용하여값을기입 명명매개변수 (named_parameter) 선택적인정보, 속성에해당, = 를사용하여멤버필드와값을기입 내장특성에 Conditional, DllImport, AttributeUsage 등이 26 있음 Conditional Attribute Conditional 특성은조건부메소드를생성할때사용 특정전처리식별자에의해실행되는조건부메소드 C++ 에서 #if conditional #endif 전처리기지시문과유사 #define 유무에따라서호출이결정되는조건부메소드에사용 반드시 using System.Diagnostics를사용해야함 조건부메소드의반환형이 void 형을사용해야함 #define DEBUG // 만약 #undef DEBUG를하면 Conditional 부분이지나감 using System.Diagnostics; class ConditionalAttributeTest i ib { [Conditional( DEBUG )] public static void DebugInfoPrint() {. // 요부분만호출 [Conditional( REGULAR )] public static void InfoPrint() {. 27 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) MessageBox(0, Test Win32 MessageBox, DllImportTest, 2); 28
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 = Stack<int>(); istack.push(3); int x = istack.pop(); Stack<float> fstack = Stack<float>(); fstack.push(3.0); int 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() 지정한키 / 인덱스로요소를제거 GetNumerator() 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 속성 열거요소내의값을가져옴
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 { 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 { 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(); //. 중간생략 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 작업한어셈블리참조추가하기