nullable을 제외하고는 솔직히 잘 사용을 안하는지라 까먹은 부분들이 많아서 다시금 한번 정리를 해보려고한다.
1.yield
yield는 C#에서 iterator(반복자)를 생성할 때 사용하는 키워드다. iterator는 반복 가능한 컬렉션을 만들기 위해 사용되며, 데이터의 소스를 순회하고 데이터를 하나씩 반환하는 데 사용된다.
예제코드
public IEnumerable<int> GetNumbers()
{
for (int i = 1; i <= 10; i++)
{
yield return i;
}
}
yield 키워드는 함수나 메서드 내부에서 사용되며, return 키워드와 비슷한 역할을 하지만, return 문이 함수나 메서드의 실행을 중지시키고 값을 반환하는 데 비해, yield 키워드는 현재의 실행 상태를 보존한 채로 함수나 메서드를 일시 중단하고 값을 반환합니다. 그리고 호출자가 다시 반복을 시작하면, 함수나 메서드는 마지막으로 실행되었던 지점에서부터 계속 실행됩니다.
+대용량의 데이터를 처리할 때, 일반적인 컬렉션을 사용하면 모든 데이터를 한 번에 메모리에 로드해야 하지만, yield를 사용하면 필요한 만큼 데이터를 반환할 수 있기 때문에 메모리 사용을 최소화할 수 있다.
2.nullable
기존의 값 형식(int, double 등)도 null 값을 가질 수 있다. ? 기호를 이용하여 변수 선언을 할 수 있다. 예를 들어, int? num = null;과 같이 표시. nullable을 이용하면 null 값을 사용하는 것이 가능해지므로, 기존에는 0이나 -1 등 특정 값으로 대체해야 했던 경우에도 null을 이용하여 코드를 더욱 명확하고 간결하게 작성할 수 있습니다.
3.C# 전처리기
C# 전처리기(Preprocessor)는 컴파일러가 소스 코드를 컴파일하기 전에 실행한다. #으로 시작하는 명령문을 사용하여 컴파일 전에 소스 코드에 특별한 처리를 할 수 있도록 지원합니다.
Ex)#define, #undef, #if, #else, #elif, #endif 등이 있으며, 이를 사용하여 조건부 컴파일, 코드 분기, 디버그 정보 출력 등의 작업을 수행할 때 사용 가능핟.
유니티에서 #if UNITY_IOS 이런식으로 많이 사용한다. 필자의 경우 맥북과 윈도우 컴퓨터 두개를 이용하여 게임을 제작하는데 IOS, Android 게임에 사용하는 라이브러리를 양쪽 다 사용한다는 보장도 없고, 코드를 다르게 짤 수 없다.
이럴 때 이용하면 좋다. 애초에 컴파일을 하지 않기에 크로스 플랫폼 문제를 해결해준다.
4.C# 인덱서 정의
인덱서(Indexer)는 객체를 배열처럼 인덱스를 사용하여 접근할 수 있도록 해주는 메서드.
+인덱서 이름은 this로 고정.
class MyList
{
private int[] _array = new int[5];
// 인덱서
public int this[int index]
{
get { return _array[index]; }
set { _array[index] = value; }
}
}
class Program
{
static void Main(string[] args)
{
MyList list = new MyList();
list[0] = 1;
list[1] = 2;
list[2] = 3;
list[3] = 4;
list[4] = 5;
Console.WriteLine(list[0]); // 1
Console.WriteLine(list[2]); // 3
}
}
5.C# Anonymous Type (익명 타입)
C#에서 Anonymous Type은 컴파일 시간에 정의된 이름이 없는 클래스이다. 일반적으로 사용자가 정의한 클래스와 달리 클래스 이름을 명시적으로 지정하지 않아도 된다.(var 형식)
var person = new
{
Name = "Jihun",
Age = 11,
};
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");
보통 LINQ와 함께 사용된단다.
장점은 데이터를 간단하게 만들어서 사용할 수 있는 것이며, 예를 들어 데이터베이스에서 여러 필드를 조회한 후, 일부 필드만 사용해야 하는 경우에 익명 타입을 사용하면 해당 필드만 빠르게 추출이 가능하다.
6.확장메서드(Extension Method)
public static class ListExtensions
{
public static int CountEven(this List<int> list) //<--매개변수 문법
{
int count = 0;
foreach (int item in list)
{
if (item % 2 == 0)
{
count++;
}
}
return count;
}
public static bool IsAdult(this Person person)//Person 클래스 예제
{
return person.Age >= 18;
}
}
this List<int> list를 하면 <int> 형식 List에서 저 메서드를 사용가능하다. Person 클래스처럼 자신이 만든 클래스에도 사용 가능하다. 남이 만든 라이브러리를 사용하거나, 기존의 클래스를 확장하기 좀 그런 상황에 유용할듯.
7.partial 키워드
C#에서 partial 키워드는 클래스, 구조체, 인터페이스 등의 선언 시에 사용할 수 있는 키워드다. partial 클래스는 해당 클래스를 여러 파일에 나누어 작성할 수 있도록 하며, 각 파일에 있는 partial 클래스들은 컴파일 시 하나의 클래스로 병합!
public partial class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// 다른 파일에 있는 partial 클래스
public partial class Person
{
public string Address { get; set; }
public string PhoneNumber { get; set; }
}
8.dynamic 클래스
C#에서 dynamic 클래스는 컴파일 시간에 타입을 검사하지 않고 런타임에 변수의 타입을 동적으로 결정할 수 있도록 한다.예를 들어 객체의 프로퍼티나 메서드를 런타임 시에 동적으로 결정하여 호출이 가능하다.
dynamic dynamicVariable = "Hello, world!";
Console.WriteLine(dynamicVariable);
dynamicVariable = 123;
Console.WriteLine(dynamicVariable);
dynamicVariable = new List<int> { 1, 2, 3 };
Console.WriteLine(dynamicVariable.Count);
맨 마지막에 보면 dynamicVariable.Count 가 있는데 Count가 없음에도 불구하고 사용이 가능하다는 것은 컴파일 시간에 타입을 검사하지 않는다는 것을 의미한다.
'프로그래밍 언어 > c#' 카테고리의 다른 글
c#7.0 Tuple, Local Function, out, binary literal, Deconstructor (0) | 2023.04.29 |
---|---|
C# 7.0 패턴 매칭 (2) | 2023.04.29 |
C# 6.0 정리 (1) | 2023.04.24 |
C# abstract class, Interface (0) | 2023.04.24 |
c# Reflection, Attribute (0) | 2023.04.23 |