C# 9.0 기능 설명
1. Top-Level Program (최상위 프로그램)
파이썬과 같은 간단한 프로그램이 점유율이 높아지면서 생겨난듯 ,,?
있어서 나쁠 것은 없지만 그렇게까지 필요한 기능인지는 모르겠다.
간단하게 설명하자면 기존에 존재하던 Main() 함수가 없이도 프로그램 진입점이 자동으로 설정된다!
using System;
int a = 100;
Console.WriteLine(a);
이런 식이다.
Main()이 없는데도 프로그램이 실행된다!
그러면 기존에 Main() 함수와 동시에 존재한다면 ? 어떠한 일이 발생하는지 궁금할 것이다.
우선적으로 최상위 코드부터 프로그램이 시작되게 된다. C# 컴파일러는 최상위 프로그램 때문에 Main 메서드를 무시한다는 경고 메시지를 내면서 최상위 코드를 실행한다. 결론적으로는 최상위 프로그램이 우선이라는 것이다.
그러나 프로그램당 단 한개만 사용이 가능하고(메인함수와 동일)
가독성 면에서 그렇게 좋은지도 모르겠기에 간단한 프로그램 작성 외에는 사용하지 않는 것을 추천한다.
2. Is not
기존의 is 키워드는 부정 연산이 따로 존재하지 않아서 !(dog is Dog)와 같은 키워드로 코딩해야했는데
if (a is not Dog)
{
}
처럼 사용이 가능하다. 이건 매우 좋은 기능인듯하다.
3.switch문 기능 추가
논리 패턴(Logical pattern)이 추가되었다.
static char GetGrade(int score)
{
char grade = score switch
{
>= 90 => 'A',
>= 80 => 'B',
_ => 'C'
};
return grade;
}
기존의 switch문보다 훨씬 편하게 논리 연산자로 구현이 가능하다.
4.새로운 new()의 타입 유추 기능
static void Main(string[] args)
{
Dog dog = new();
}
Dog인지 알아서 유추해서 new Dog() 키워드에서 new로 압축했다.
근데 기존의 var과 포지션이 비슷하다.
var dog = new Dog();와 크게 다른지는 모르겠는데
명확하게 Dog 키워드로 선언되었으니 지금의 타입 유추 new의 기능이 더 사용하기 좋을 것 같기는 하다.
5.공변 리턴 타입 (Covariant return type)
원래는 override 하려는 메서드의 원본의 리턴타입과 반드시 동일해야했다. 그러나 이제는 하위 타입으로도 재지정이 가능하다.
public virtual Animal ToAnimal();
//오버라이드한 메서드
public ovrride Animal ToAnimal()
{
}
그러나 이제는
public virtual Dog ToAnimal();
//오버라이드한 메서드
public ovrride Dog ToAnimal()
{
}
와 같이 Animal의 하위 타입인 Dog로도 override선언이 가능하다.
6.Native Int 타입 (nint, nuint)
Native Int란 플랫폼에 따라 다른 크기를 갖는 정수를 말하는데, 예를 들어 32비트 플랫폼에서는 32비트 정수가 되고, 64비트 플랫폼에서는 64비트 정수가 된다.
아래는 64비트와 32비트 프로그램의 다른점이다.
64비트와 32비트 프로그램이 다른점을 살펴보자.
32비트 프로그램은 4GB 램까지만 인식이 가능하다고 하고,
64비트는 사실상 제한이 거의 없다고 들은 적이 있을 것이다.
왜 이런 차이가 발생할까
말 그대로 32 bit 프로그램은
2^32의 메모리 주소를 가질 수 있다.
4,294,967,296 = 대충 512MB의 크기이다.
?? 그러면 4GB랑 512MB는 8배 차이가 나는데 뭔가 이상하지 않나요?
왜냐하면 컴퓨터 주소의 최소 단위는 1 byte이기 때문이다.
1 byte = 8bit이기 때문.
대부분의 프로그램 언어에서 boolean값을 나타낼 때 1byte의 크기를 사용하는 이유이다.
참과 거짓은 0과1 만으로 나타낼 수 있기에 사실상 1bit로 표현이 가능하겠지만. 최소 단위가 1byte이기 때문에..
그러면 4,294,967,296 * 8(byte의 크기) = 4GB가 맞다.
똑같이 계산해보면
2^64 = .. 사실상 제한이 없다는 이유를 알겠는가 ?
// 32bit로 컴파일되었을 때 4바이트 정수
nint a = 1000;
// 64bit로 컴파일되었을 때 8바이트 정수
nint b = 1000;
'프로그래밍 언어 > c#' 카테고리의 다른 글
C# 9.0 레코드 타입 (1) | 2023.05.16 |
---|---|
C# 8.0 Switch expression (0) | 2023.05.14 |
c# 8.0 정리 (0) | 2023.05.14 |
C# Var에 관해서 (0) | 2023.05.01 |
C#7.0 ref local, return, struct, Throw expression (0) | 2023.04.29 |