C# 같이 따라가기 - slog

C#은 버젼 9까지 발전하면서 다양한 변화가 있었습니다. 주목해야 할 변화를 기록하면서 사용해보고 숙달하는데 목적을 두고 정리해보겠습니다

이글을 보시는 분들은 잘 안쓰는 기능을 한번 같이 써보면서 의미를 생각해보고 자신의 코드에 같이 적용해 보도록 합시다

좋아요 1

C# 1은 다음의 기능이 포함되어 있습니다. C# 개발자라면 거의 대부분 사용하는 기능들이 되는데요,

  • 클래스 (class)
  • 구조체 (struct)
  • 인터페이스 (interface)
  • 이벤트 (event)
  • 속성 (property)
  • 대리자 (delegate)
  • 연산자 및 식
  • 특성 (attribute)

C# 1부터 event와 delegate가 포함되어 있었다는 것은 흥미롭습니다. event 및 delegate가 Windows Forms의 이벤트를 언어에서 지원해주기 위해 디자인 된것이라 추측해봅니다.

C# 2에서 비로서 제네릭이 추가되었습니다. 공변성 및 반공변성은 잘 모르시는 분들도 계실 것 같은데, 배열 형식, 대리자 형식 및 제네릭 형식 인수가 암시적으로 참조 변환할 수 있게 해줍니다. (형 변환이 아닙니다)

  • 제네릭 (generic)
  • 부분 형식 (parital type)
  • 무명 메서드
  • Nullable 값 형식
  • 반복기
  • 공변성 (covariance) 및 반공변성 (contravariance)

C# 3에서 극적인 변화가 일어나기 시작합니다 (제 기준입니다 ^^;) 코딩의 편리성을 위해 많은 개선이 이루어졌으며 특히, 자동 구현 속성은 거의 대부분의 C# 프로그래머가 애용하는 기능입니다.
그리고 무명 형식람다식이 추가되어 쿼리 식에서 유용하게 사용할 수 있게 됩니다.
제 추측으로는 쿼리 식 LINQ에 대응하기 위해 이러한 기능들이 추가 된게 아닌가 생각해 봅니다.

쿼리 식, 식 트리, 부분 메서드는 잘 안쓰는 기능이 될 것 같네요

  • 자동 구현 속성
  • 무명 형식
  • 쿼리 식
  • 람다 식
  • 식 트리
  • 확장 메서드
  • 암시적 형식 지역 변수
  • 부분 메서드
  • 개체 및 컬렉션 이니셜라이져

C# 6 ~ 8의 정리를 잘 해주셨습니다.

SeeRoE님의 블로그 입니다.
[C#] C# 버전별 주요 변화 (tistory.com)

C# 4에 추가된 `명명된/선택적 인수’가 C# 개발자가 애용하는 기능이 아닐까 합니다. 그 이외에 다음의 기능이 추가 되었습니다.

C#4에 추가된 대부분의 기능은 COM 형식에 대한 대응으로 보입니다. 가령, Excel을 COM으로 접근하게 되면 굉장히 긴 인자를 접하게 되는데, 명명/선택 인수를 통해 필요한 것만 취할 수 있게 되었고, COM 개체를 dynamic으로 접근해서 사용상의 이점또한 얻습니다.

제네릭 공변 및 반공변은 개념은 바로 알아먹지만 실사용에 적용할 때 어려움이 있는데요, 다음의 글을 참조해봅시다.

정성태 님의 블로그 입니다. 해당 내용 및 링크도 같이 봅시다.
.NET Framework: 743. C# 언어의 공변성과 반공변성 (sysnet.pe.kr)

  • 동적 바인딩 (dynamic)
  • 명명된/선택적 인수
  • 제네릭 공변(covariant) 및 반공변(contravariant)
  • 포함된 interop 형식

C# 5에서 두번째 변혁이 일어납니다(역시 제 기준입니다; ). 바로 비동기를 언어에서 지원하게 된 것인데요, C# 5은 이 비동기 멤버만으로도 의미있는 버젼업이라고 생각합니다.

비동기 프로그래밍은 익숙하지 않으면 낫설고 다양한 문제가 발생할 수 있는 코딩을 하게 됩니다. 언어에서 비동기의 흐름을 동기적으로 표현하게 해주는 async/await을 사용하게 되면, 비동기 처리에 대한 깊은 이해가 없어도, 어느정도의 비동기 처리를 가능하게 해줍니다.

호출자 정보 특성의 경우, C# 프로그래머라면 항상 아쉬웠던 부분이였을 텐데요, 여전히 사용방법이 아쉽지만 특성(attribute)를 통해 사용할 수 있게 되었습니다.

  • 비동기 멤버
  • 호출자 정보 특성

C# 6은 생산성을 증대하는데 초점을 두었습니다.

자동속성 이니셜라이져, Null 전파자, 문자열 보간은 C# 프로그래머들이 애용하는 기능일 것 같고, 정적 가져오기, 예외필터, 식 본문 멤버, nameof 연산자는 친숙하지 않을 수 있는데요,

예외필터 (try-cache, switch) 및 식 본문 멤버는 자주 쓰다보면 유용함을 느낄 수 있고,
nameof 연산자의 경우, 리팩토링으로 관련된 이름을 동시에 바꿀 수 있기 때문에 유용합니다. (버그를 줄여주는 역할)

  • 정적 가져오기 (using static)
  • 예외필터 (when)
  • 자동속성 이니셜라이져
  • 식 본문 멤버 (member => expressing)
  • Null 전파자 (aaa?.bbb)
  • 문자열 보간
  • nameof 연산자

C# 7.0 ~ 7.3에는 다양한 기능들이 추가되었습니다. 제 기억으로는 github에서 다양한 참여가 이루어지면서 개선에 반영되었던 것으로 기억합니다.

  • 튜플 및 무시 항목
  • 패턴 일치
  • async Main 메서드
  • 로컬 함수
  • 추가 식 본문 멤버
  • throw 식
  • default 리터럴 식
  • 숫자 리터럴 구문 개선 사항
  • out 변수
  • 뒤에 오지 않는 명명된 인수
  • private protected 액세스 한정자
  • 향상된 오버로드 확인
  • 안전하고 효율적인 코드를 작성하는 방법 - 참조 의미 체계를 사용하는 값 유형으로 작동할 수 있는 구문 개선 조합

C# 8 추가 기능입니다. 다양한 추가 기능 추가되고 보완되었습니다.

  • 읽기 전용 멤버
  • 기본 인터페이스 메서드
  • 패턴 일치 개선 - switch 식, 속성, 튜플, 위치 패턴
  • using 선언
  • 정적 로컬 함수
  • 삭제 가능한 ref struct
  • nullable 참조 형식
  • 비동기 스트림
  • 인덱스 및 범위
  • null 병함 할당
  • 관리되지 않는 생성 형식
  • 중첩 식의 stackalloc
  • 보간된 약어 문자열의 향상된 기능

C# 9 추가 기능입니다. github의 활동으로 인해 참 많은 기능이 보완되고 추가가 됩니다;

정성태님이 정리하신 글을 참고하면 도움이 많이 됩니다.

.NET Framework: 947. C# 9.0 - (1) 대상으로 형식화된 new 식(Target-typed new expressions) (sysnet.pe.kr)
.NET Framework: 948. C# 9.0 - (2) localsinit 플래그 내보내기 무시(Suppress emitting localsinit flag) (sysnet.pe.kr)
.NET Framework: 949. C# 9.0 - (3) 람다 메서드의 매개 변수 무시(Lambda discard parameters) (sysnet.pe.kr)
.NET Framework: 950. C# 9.0 - (4) 원시 크기 정수(Native ints) (sysnet.pe.kr)
.NET Framework: 951. C# 9.0 - (5) 로컬 함수에 특성 지정 가능(Attributes on local functions) (sysnet.pe.kr)
.NET Framework: 953. C# 9.0 - (6) 함수 포인터(Function pointers) (sysnet.pe.kr)
.NET Framework: 956. C# 9.0 - (7) 패턴 일치 개선 사항(Pattern matching enhancements) (sysnet.pe.kr)
.NET Framework: 958. C# 9.0 - (8) 정적 익명 함수 (static anonymous functions) (sysnet.pe.kr)
.NET Framework: 959. C# 9.0 - (9) 레코드(Records) (sysnet.pe.kr)
.NET Framework: 961. C# 9.0 - (10) 대상으로 형식화된 조건식(Target-typed conditional expressions) (sysnet.pe.kr)
.NET Framework: 962. C# 9.0 - (11) 공변 반환 형식(Covariant return types) (sysnet.pe.kr)
.NET Framework: 963. C# 9.0 - (12) foreach 루프에 대한 GetEnumerator 확장 메서드 지원(Extension GetEnumerator) (sysnet.pe.kr)
.NET Framework: 964. C# 9.0 - (13) 모듈 이니셜라이저(Module initializers) (sysnet.pe.kr)
.NET Framework: 965. C# 9.0 - (14) 부분 메서드에 대한 새로운 기능(New features for partial methods) (sysnet.pe.kr)
.NET Framework: 966. C# 9.0 - (15) 최상위 문(Top-level statements) (sysnet.pe.kr)
.NET Framework: 974. C# 9.0 - (16) 제약 조건이 없는 형식 매개변수 주석(Unconstrained type parameter annotations) (sysnet.pe.kr)

  • 레코드 (record)
  • init 전용 setter
  • 최상위 문
  • 패턴 일치 개선
  • 원시 크기 정수
  • 함수 포인터
  • localsinit 플래그 내보내기 무시
  • 대상으로 형식화된 새 식
  • 정적 무명 함수
  • 대상으로 형식화된 조건식
  • 공변 반환 형식
  • foreach 루프에 대한 확장 GetEnumerator 지원
  • 람다 무시 항목 매개 변수
  • 로컬 함수의 특성
  • 모듈 이니셜라이저
  • 부분 메서드에 대한 새로운 기능