c#(26)
-
8장 - c# 3.0 - 2
확장 메서드 기존 클래스를 확장하면 방법.상속이 많이 쓰이지만 sealed로 봉인된 클래스이거나클래스를 상속받아 확장하면 기존 소스를 상속받은 클래스는 새로운 이름으로 바뀌어야 한다. 이런 방식이 싫다면 확장 메서드를 쓰면 된다.기존 클래스의 내부 구조를 전혀 바꾸지 않고 새 인스턴스 메서드를 추가할 수 있다. static class ExtensionMethodSample { // 확장 메서드는 반드시 static이어야 하고 // 확장하려는 타입의 매개변수를 this 예약어와 함께 명시 public static int GetWordCount(this string txt) { return txt.Split(' ').Length; } } namespace Extension { class Program { s..
2015.01.10 -
7장 - c#2.0 - 그외
?? 연산자 string txt = null; Console.WriteLine(txt ?? "(null)"); if, else나 3항 연산자인 ? : 를 사용할 필요없이 모 아니면 도로 사용할 수 있게 해주는 default 예약어 C#에서 변수를 명시적으로 초기화 하지 않았을 때 값형식은 0 참조형식은 null로 초기화 된다. 이렇게 미리 형식을 알고 있다면 초기화가 가능하겠지만 제네릭을 쓸 때는 미리 타입을 알 수 없으므로 뭔가 대책이 필요하다. 이때 default예약어를 쓰는데 default(T) 형식으로 쓴다. int t = default(int); Console.WriteLine(t); yield return / break 배열과 List등에 담긴 요소를 foreach로 순회할 수 있는 이유는 이..
2014.12.28 -
7장 - c#2.0 - 제네릭
으로 명시하며지정한 타입은 JIT 컴파일 타임에 기계어 코드를 만들어준다. 제네릭 클래스는public class GenericClass와 같은 형식. 제네릭 메서드는public static void Method1 (T item){}처럼 지정하면 된다. 제네릭은 박싱/언박싱으로 발생하는 힙낭비를 막고 코드 중복도 해결해 준다. 제약 조건 public class Utility { public static int Max(int item1, int item2) { if (item1.CompareTo(item2) >= 0) { return item1; } return item2; } } int 타입만 사용하는 이 코드를 제네릭을 적용하여 컴파일하면 어떻게 될까? public class Utility { publi..
2014.12.25 -
6장 - 리플렉션2 (확장모듈 만들어보기)
리플렉션을 이용한 확장 모듈 구현 대개 플러그인을 구현한 소프트웨어는 다음과 같은 동작 양식을 가진다. 1. exe 프로그램이 실행되는 경로 아래에 확장 모듈을 담도록 약속된 폴더가 있는지 확인2. 해당 폴더가있다면 그 안에 dll 같은 파일이 있는지 검사하고 로드3. 파일이 로드됐으면 사전에 약속된 조건을 만족하는 타입이 있는지 검사4. 조건에 맞는 타입이 있다면 생성하고, 사전에 약속된 메서드를 실행 이 조건에 맞춰다음과 같이 규칙을 정한다. 1. 확장모듈은 exe아래에 [plugin] 폴더2. 플러그인 타입조건은 타입에 [PluginAttribute] 라는 이름의 특성이 부여되어 있어야 함3. 호출된 메서드는 [StartupAttribute] 라는 이름의 특성이 부여되어 있어야 함. 다만 입력인자와..
2014.12.24 -
6장 - 리플렉션1
어셈블리 파일에는 메타데이터가 있음.BCL에서 제공하는 리플렉션 (Reflection) 관련 클래스를 이용하면 메타데이터 정보를 얻을 수 있다. -- 닷넷에서는 프로세스 구조가 다음과 같다. Exe 프로세스 = 1개의 공유 AppDomain + 1개의 기본 AppDomain-> 기본은 1개지만 임의의 수를 만들 수 있다. AppDomain이 만들어지면 그 내부에 어셈블리들이 로드되는데,리플렉션을 이용하면 현재 AppDomain의 이름과 그 안에 로드된 어셈블리 목록을 구할 수 있다. 1234567 AppDomain currDomain = AppDomain.CurrentDomain; Console.WriteLine(currDomain.FriendlyName); foreach (var item in curr..
2014.12.21 -
6장 - 3 (컬렉션)
Collections BCL에서는 System.Collections 하위에 관련 타입을 묶어서 제공가변 배열과 같은 기능을 편리하게 구현한 것들을 제공. System.Collections.ArrayList ArrayList는 object부터 이로 형변환 할 수 있는 모든 타입을 인자로 받아 다룰 수 있는 자료구조. ArrayList ar = new ArrayList(); ar.Add(3); ar.Add("Hello"); ar.Add(1.1); ar.Add("World"); // 포함 검사 Console.WriteLine("Contains(1) : " + ar.Contains(1)); // 삭제 ar.Remove("World"); foreach (var item in ar) { Console.WriteLi..
2014.12.20