9.0 · 버전 이력

C# 9.0

군더더기를 걷어내고 값을 담는 형식이 쉬워졌습니다.

2020.11 .NET 5
한눈에

무엇이 더해졌나

C# 9.0은 .NET 5와 함께 2020년 11월에 나왔습니다. 이 판의 성격은 군더더기 걷어내기입니다. 늘 적어야 했지만 뜻은 없던 것들을 없애고, 값을 담기만 하는 형식을 짧게 세울 수 있게 했습니다.

  • 최상위 문Main 을 적지 않아도 됩니다.
  • record — 값을 담는 형식을 한 줄로 세웁니다.
  • init 전용 속성 — 만들 때만 담고 그 뒤로는 못 바꾸게 합니다.
  • 패턴 매칭 강화and·or·not 과 범위로 견줍니다.
최상위 문

Main 을 적지 않아도 됩니다

화면에 한 줄을 찍는 프로그램에도 클래스와 Main 을 모두 적어야 했습니다. 배우는 사람은 아직 배우지 않은 것들을 먼저 적어야 했고, 익숙한 사람에게도 되풀이되는 군더더기였습니다.

C# 8 까지
using System;

class Program {
    static void Main(string[] args) {
        Console.WriteLine("Hello");
    }
}
C# 9 부터
Console.WriteLine("Hello");

컴파일러가 감쌀 Main 을 대신 만들어 줍니다. 사라진 것이 아니라 적지 않아도 되는 것입니다. 한 프로젝트에 한 파일만 이렇게 적을 수 있습니다 — 시작할 자리가 둘이면 어디서 시작할지 정할 수 없기 때문입니다.

C# 1.2 Hello World와 프로그램 구조 에서 자세히 다룹니다.

패턴 매칭

범위와 조합으로 견주기

C# 8.0의 switch 식에 적을 수 있는 것이 늘었습니다. 값이 무엇인지뿐 아니라 어느 범위에 드는지를 그대로 적고, and·or·not 으로 묶을 수 있습니다.

C# 8 까지
string grade;

if (score >= 90) grade = "A";
else if (score >= 80) grade = "B";
else grade = "C";
C# 9 부터
string grade = score switch {
    >= 90 => "A",
    >= 80 => "B",
    _ => "C"
};

C# 1.5 조건문 에서 자세히 다룹니다.

그 밖에

record 와 init

값을 담기만 하는 형식은 그때까지 클래스로 세워야 했고, 담을 것이 넷이면 필드·속성· 생성자·비교 방법을 모두 손으로 적어야 했습니다. record 는 그것을 한 줄로 줄입니다.

record Point(int X, int Y);

var a = new Point(1, 2);
var b = new Point(1, 2);

Console.WriteLine(a == b);   // True — 담긴 값이 같으면 같습니다

클래스였다면 a == b 가 거짓입니다. 서로 다른 자리에 만들어진 두 개이기 때문입니다. 이 차이는 클래스와 참조 형식을 알면 뚜렷해지며, 그쪽은 2부 객체지향에서 다룹니다.

배경
  • 이 판이 겨눈 것은 적어야 하는 것을 줄이는 것입니다.
  • 최상위 문은 배우기 시작하는 자리를 가볍게 하려는 것이었습니다.
  • record 는 값을 담는 형식이 흔한데도 손으로 적을 것이 많던 문제를 풀었습니다.