이 글은 기억하기 위해 요약하여 메모해둔 것 아무리 기억력이 좋아도 메모만큼은 아니니까 세상에 가장 흐린 먹물도 가장 좋은 기억력보다 낫다.
- C#에서는 new를 사용하여 인터페이스로부터 직접 객체를 생성하지 못한다. new object()는 System.Object 객체를 생성하는 것과 같다.
- C# const는 컴파일시 상수값이 지정되고, readonly는 런타임시 값이 지정된다.
- enum 멤버에 어떤 값을 할당하기 위해서는 상수이거나 리터럴(Literal) 값이어야 한다.
- enum 요소는 값이 컴파일시에 이미 확정되어야 하며, 리터럴이거나 상수를 사용한다.
- 모든 .NET 클래스는 System.Object로부터 파생된다.
- System.ConsoleColor은 Enum 타입으로 Value Type이기 때문에 NULL을 가질 수 없다.
- DateTime 타입은 Value Type으로 C#의 null을 할당할 수 없다.
- async와 await는 비동기 프로세싱에 사용되고, lock은 쓰레드의 배타적 자원 사용에 사용된다. sealed는 해당 클래스가 다른 파생클래스의 베이스로 사용될 수 없도록 한다.
- Nullable 타입은 NULL을 가질 수 없는 Value 타입을 위한 것이며, 이미 NULL을 가질 수 있는 string과 같은 Reference 타입에 적용되지 않는다.
- Exception은 프로그램 실행 중 즉 런타임시에 발생한다.
- 추상메서드는 abstract 키워드를 메서드에 사용하며, 구현이 필요 없으므로 Body를 구현하지 않는다.
- int는 Int32에 해당된다. C#의 uint는 System.UInt32에 해당된다.
- using 은 namespace 밖이나 안에 사용할 수 있고, nested namespace 바로 안에서도 사용할 수 있다. 하지만, 클래스 내에서는 사용할 수 없다.
- 인터페이스는 행위(Behavior)를 정의하는 것으로 데이타를 저장하는 클래스 필드는 포함할 수 없다. 속성, 이벤트는 컴파일러에 의해 메서드 형태로 변경된다.
- .NET에서 동적 배열로는 ArrayList 혹은 List<T> 등이 있으며, 연결리스트로는 LinkedList<T> 클래스가 있다. 이진트리는 기본적으로 제공되지 않으며, 사용자가 만들어 사용하여야 한다.
- yield 키워드는 집합적인 데이타셋으로부터 하나씩 데이타를 호출자에게 보내주는 역할을 한다. C# yield return는 컬렉션 중 하나의 데이타를 리턴하며, yield break는 컬렉션 루프를 빠져나오는데 사용된다.
- 네임스페이스는 클래스들을 논리적인 그룹으로 묶는데 유용하게 사용된다. 클래스는 네임스페이스 없이도 정의 될 수 있지만, 거의 모든 경우 네임스페이스를 정의하는 것이 일반적이다.
- static은 정적 클래스,메서드, 필드 속성, 이벤트, 생성자 등에 사용된다. static은 Destructor 앞에 사용될 수 없으며, 또한 정적(static) 클래스는 Destructor 자체를 가질 수 없다.
- LINQ의 OrderBy() 메서드에 의해 복수의(3개) 데이타 결과가 생성되므로 Single() 혹은 SingleOrDefault()를 적용하면 런타임 에러가 발생한다.SingleOrDefault()은 데이타가 하나일 경우는 해당 데이타를, 만약 하나도 없을 경우는 null을 리턴한다.
- default를 Generics에 사용한 예로, T가 Reference Type이면 null이고, Value Type이면 해당 Value 타입의 디폴트 값이 설정된다. string은 Reference Type이므로 null이 할당된다.
- class, struct, enum은 타입(Type)이며, 인터페이스는 그 선언 안에 Type을 가질 수 없다.
- C#에서 @ 심벌을 사용할 때는?
- 1. 문자열 앞에 사용하여 해당 문자열 안의 Escape 문자를 무시하고 문자 그대로 인식할 때
- 2. 한 문자열 변수에 여러 줄의 문자열을 지정하는 경우
- 3. C# 키워드 앞에 붙여 일반 변수명으로 사용할 때
- 익명 타입 (Anonymous Type)의 속성은 생성후 읽기 전용이므로 수정할 수 없다.
- 확장메서드는 인터페이스에 적용될 수 있으며, 사실 많은 LINQ 확장 메서드들이 인터페이스를 대상으로 실행되고 있다. ex) IList<int> n = new List<int> { 1, 2 }; bool ok = n.Any();
- LINQ to Objects 를 사용하기 위해 모든 컬렉션이나 Type은 반드시 IEnumerable<T> 인터페이스를 구현해야 한다.
- var는 컴파일시에 결정되는 모든 타입을 할당할 수 있으며, 메서드 안에서만 사용된다. 즉 클래스 필드등으로 사용될 수 없다.
- partial 키워드를 Class, Struct, Method, Interface에 사용할 수 있다.
- 로컬변수에 대한 Implicit Typing을 위해 사용되는 var에는 NULL을 할당할 수 없다.
- 확장메서드는 1개 이상의 파라미터를 가지며, 첫 파라미터는 반드시 this를 적어 어떤 타입에 해당 확장메서드가 적용되는지를 나타낸다.
- Java의 synchronized 는 C#의 lock 과 비슷한 기능을 한다. stackalloc 은 unsafe 모드에서 스택에 메모리를 할당할 때 사용한다.
- 다른 언어/Culture 에 대해 Satellite Assembly를 만들어 리소스를 Localization 한다.
- 전처리기 사용 불가 #include는 C/C++에서 사용할 수 있으나 C#에서는 사용할 수 없다.
- LinkedList는 포인터를 이용하여 링크를 구성하는데, C# / .NET의 관점에서는 다음 list item에 대한 객체 Reference를 가지고 링크를 구성한다.
- int.TryParse()는 만약 변환이 실패하면 out 파라미터에 0을 설정한다.
- as 는 레퍼런스 타입이나 Nullable 타입에만 적용할 수 있다. DateTime은 값 타입으로 이런 표현을 사용할 수 없다.
- yield는 Iterator를 위해 사용된다.
- .0에서 비동기 처리를 손쉽게 구현하기 위해 async 와 await 키워드를 도입하였다.
- 배열은 배열요소의 크기가 미리 정해진 고정배열과 각 차원별 크기가 동적인 가변배열로 나눌 수 있다. 고정배열은 컴파일시 미리 그 크기가 알려지는 것으로 모든 배열차원의 크기가 미리 상수로 정해져야 한다. 가변배열은 첫번째 배열차원만 배열크기가 정해지고 나머지 차원은 런타임시 동적으로 지정하게 된다. ex) int [][] a = new int [10][] 는 되지만 int [][][] b = new int [10][2][] 는 사용불가
- Generics를 선언할 때, 타입 파라미터가 Value Type인지, Reference 타입인지, 또는 어떤 특정 클래스 혹은 인터페이스로부터 파생된 타입인지를 지정할 수 있다.
- struct는 상속(inheritance)를 지원하지 않지만, 인터페이스를 구현할 수는 있다. struct는 Value 타입으로 다른 메서드로 값을 전달할 때 복사해서 전달한다.
- C#에서 추상클래스나 인터페이스로부터 객체를 생성할 수 없다.
- 런타임시 Serialization이 실행될 때 CLR은 해당 객체 및 객체 내부에 포함한 된 객체가 Serializable 인지를 체크하여 만약 아니면 Exception을 발생한다.
- 익명타입은 Immutable Type으로써 생성시 한번 속성을 지정하면 차후에 이를 변경할 수 없다. 즉 익명타입의 속성은 Read-only이다. 익명타입에는 메서드나 이벤트를 설정할 수 없다.
- abstract class는 일반적으로 abstract method를 포함하지만, 반드시 포함해야 하는 것은 아니다.
- namespace 바로 밑에 정의되는 클래스에는 private, protected, protected internal 등을 사용할 수 없다. 만약 접근제한자를 쓰지 않으면 이는 internal 과 같다.
- 컴파일러가 자동으로 생성하는 디폴트 생성자는 항상 베이스 클래스를 호출한다.
'Program > C#' 카테고리의 다른 글
[C#] 링크드 리스트 (Linked List) (0) | 2019.01.23 |
---|---|
[C#] 동적 배열 (Dynamic Array) (0) | 2019.01.23 |
[C#] Nullable 타입의 도입 (0) | 2019.01.23 |
[C#] MVC View (0) | 2019.01.23 |
[C#] MVC Model (0) | 2019.01.23 |