C#
-
18장. 사용자 정의 특성CLR Via C# 2022. 3. 16. 21:56
사용자 정의 특성은 코드에 표기를 해서 특별한 기능을 수행할 수 있도록 해주며, 모든 종류의 메타데이터 테이블 내의 항목에 추가적인 정보를 부가할 수 있다. 사용자 정의 특성의 사용 사용자 정의 특성에 대해서 가장 먼저 알아두어야 할 내용은 이 메커니즘이 단순히 특정 대상에 대해 추가적인 정보를 부가하는 방법이며, 구체적으로 살펴보더라도 컴파일러가 관리 모듈의 메타데이터상에 추가적인 정보를 부가하는 것에 불과하다는 것이다. 대부분의 특성은 컴파일러 자체에는 아무런 의미가 없으며, 컴파일러는 그저 소스 코드에서 특성을 찾아 메타데이터에 적절한 정보를 부가하는 것이 전부다. C#에서는 특성을 적용할 때 접두사의 형태로 적용 대상을 지정할 수 있는데, 많은 경우에 있어 접두사를 명시하지 않으면 컴파일러가 특성..
-
17장. 델리게이트CLR Via C# 2022. 3. 9. 15:21
델리게이트는 .NET Framework의 콜백 함수 메커니즘이다. 이는 네이티브 C/C++과 달리 타타입 안정성을 준수하는 메커니즘이다. using System; using System.Windows.Forms; using System.IO; internal delegate void Feedback(int value); public sealed class Program{ public static void main() { Program p = new Program(); Feedback fb1 = new Feedback(p.FeedbackToFile); fb1(1); Feedback fb2 = new Feedback(FeedbackToConsole); fb2(2); } private void Feedback..
-
16장. 배열CLR Via C# 2022. 2. 28. 16:02
모든 배열 타입은 암묵적으로 System.Array 추상 클래스로부터 상속을 받으며, 이 타입은 또 다시 System.Object로부터 상속을 받는다. 모든 배열들은 참조 타입이며, 모든 배열 인스턴스들은 관리되는 힙 메모리 공간에 할당되고, 응용프로그램의 변수 또는 필드에 배열에 대한 참조가 저장되며 배열의 각 요소들이 직접 할당되는 것은 아니다. 배열의 메모리 블럭에는 배열의 요소들(값 혹은 참조) 뿐만 아니라 타입 객체 포인터, 동기화 블록 인덱스, 배열의 차원, 배열 내의 각 차원별 하한(거의 대부분 이 설정 값은 0일 것이다), 배열 내의 각 차원별 길이 등이 들어있다. 흔히 첫번째 요소가 인덱스 0부터 시작하는 1차원 배열(Zero-based Arrays), 이러한 배열을 흔히 SZ 배열, 또..
-
15장. 열거 타입과 비트 플래그CLR Via C# 2022. 2. 23. 13:52
열거 타입 열거 타입 enum은 기호 이름과 연결되는 값의 쌍을 묶어서 정의하는 타입이다. 기호의 이름에 연결된 숫자 값을 하드코딩된 숫자로 사용하는 대신, 열거 타입을 사용해야 하는 대에는 이유가 있다. 열거 타입을 사용하면 프로그램을 좀 더 쓰고 읽고 관리하는 것을 쉽게 해준다. 또한 기호에 대응되는 숫자 값이 변하더라도 프로그램을 다시 컴파일하기만 하면 되므로 쉽게 값을 변경시킬 수 있다. 열거 타입은 보통 강력한 타입으로 취급된다. 예를 들어 만약 Color.Orange 값을 Fruit 열거 타입을 매개변수로 받는 메서드에 전달하려고 하면 컴파일러가 오류가 있음을 알려준다. 모든 열거 타입은 System.Enum 타입을 상속하는데, System.Enum은 System.ValueType을 상속하고,..
-
14장. 문자, 문자열, 텍스트 사용하기CLR Via C# 2022. 2. 21. 21:28
System.String 타입 String 타입은 변경할 수 없는 문자들의 순서 열이다. String 타입은 Object 타입을 직접 상속하기 때문에 참조 타입으로 분류되며, 따라서 String 타입과 그 내부의 배열은 항상 힙에 할당되고 절대 스레드의 스택 영역에는 할당되지 않는다. C#을 포함한 많은 프로그래밍 언어들이 String을 기본 타입으로 간주하는데, 컴파일러가 문자열 리터럴을 소스 코드상에서 직접 표현할 수 있도록 한다. 컴파일러는 리터럴 문자열을 모듈의 메타데이터 영역에 배치하고, 실행 시점에 이 메타데이터를 메모리에 로드한 후 참조하게 된다. // String s = "Hi\nthere."; String s = "Hi" + Environment.NewLine +"there." // 위에..
-
13장. 인터페이스CLR Via C# 2022. 2. 16. 19:35
클래스를 상속받으면 상위 클래스의 메서드의 원형과 구현부를 제공받는다. 인터페이스를 상속받으면 해당 인터페이스의 메서드 원형만 받을 뿐 구현은 하위 클래스에서 해줘야 한다. 인터페이스 정의하기 인터페이스에는 메서드 외에 이벤트, 매개변수 없는 속성, 인덱서 등이 포함될 수 있다. 이 모두는 결국 메서드를 지칭하기 위한 구문상 편의사항이기 때문에 가능하다. 하지만 인터페이스는 생성자 메서드를 정의할 수 없으며 인스턴스 필드들도 정의할 수 없다. C#에서는 interface 키워드를 사용하여 새로운 인터페이스에 이름을 부여하고 인스턴스 메서드의 원형들을 포함할 수 있다. 관례상 인터페이스 타입의 이름 앞에는 보통 대문자 I를 붙여주어 소스 코드상에서 해당 타입이 인터페이스임을 쉽게 알아챌 수 있도록 한다. ..
-
12장. 제네릭(Generics)CLR Via C# 2022. 2. 12. 01:35
제네릭 클래스나 메서드에서는 를 붙여 정의한다. 앞의 T와 같이 데이터 타입으로 지정하는 변수를 타입 매개변수(Type Parameter)라고 한다. 여기서 T는 변수의 타입이 된다. 또한 제네릭 타입을 사용할 때 지정하는 데이터 타입을 타입 인자(Type Argument)라고 부른다. 제네릭의 사용 이점은, 지정된 타입과 호환되지 않는 경우 컴파일 오류가 발생해줘서 타입 안정성을 보장해주고, 캐스팅이 필요없어 간결하고 직관적이며, 박싱이 일어나지 않아 더 나은 성능을 보인다. Framework Class Library(FCL)에서의 제네릭 대부분의 제네릭 컬렉션 클래스들은 System.Collections.Generic 네임스페이스와 System.Collections.ObjectModel 네임스페이스 ..
-
11장. 이벤트CLR Via C# 2022. 2. 7. 16:57
타입 내에 이벤트를 정의하면, 이벤트는 등록된 메서드들을 리스트로 관리하기 때문에 리스트에 메서드 등록/해지가 가능하고, 이벤트가 발생하면 리스트 컬렉션 안에 추가된 모든 메서드들에게 이벤트가 발생하였음을 알려준다. 다음의 단계를 따라서 이벤트를 사용하면 좋다. 1단계 : 이벤트 수신자들에게 보내야 하는 추가적인 정보들을 포함하는 타입을 정의하기 보통 추가적인 정보는 단일 클래스로 캡슐화 시켜 보낸다. 보통 System.EventArgs 타입을 상속한 타입으로 정의하여 이벤트 핸들러로 전달하는 것이 일반적이다. 이 타입은 이름에도 EventArgs라는 접미사를 관습적으로 붙여서 사용한다. internal class NewMailEventArgs : EventArgs { private readonly St..