C# 6.0 완벽 가이드/ C#과 .NET Framework 소개

(필요한 부분만 정리)

C#과 CLR의 관계

  • C#은 자동 메모리 관리와 예외 처리 같은 다양한 기능을 갖춘 런타임에 의존한다. C#의 설계는 해당 실행시점 기능들을 제공하는 Microsoft CLR의 설계와 밀접하게 대응된다.(비록 기술적으로는 C#이 CLR과 독립적이지만) 게다가 C#의 형식 체계는 CLR의 형식 체계와 밀접하게 대응된다.

CLR과 .NET Framework

  • .NET Framework는 CLR과 아주 다양한 라이브러리들의 집합으로 구성되어 있다. 그 라이브러리 집합에는 핵심 라이브러리들과 그 핵심 라이브러리들에 의존하는 응용 라이브러리들이 있다.
  • CLR은 관리되는 코드(managed code)를 실행하기 위한 런타임이다. C#은 여러 관리되는 언어(managed language) 중 하나인데, 관리되는 언어로 작성한 소스 코드를 컴파일하면 관리되는 코드가 생성된다. 관리되는 코드를 실행 파일(.exe) 또는 라이브러리(.dll) 형태로 만들고 그것을 형식 정보, 즉 메타자료(metadata)와 함께 하나의 패키지로 묶은 것을 어셈블리(assembly)라고 부른다.
  • 관리되는 코드는 중간 언어(intermediate language, IL)로 표현된다. 어셈블리를 적제(load)할 때 CLR은 어셈블리에 담긴 IL 코드를 해당 컴퓨터(x86 등) 고유의 기계어 코드로 변환한다. 이러한 변환을 담당하는 것이 CLR의 JIT(just-in-time) 컴파일러이다. 어셈블리는 원래의 원본 언어의 구성을 거의 그대로 유지하기 때문에 코드를 조사하기 쉽고 심지어 동적으로 생성하기도 쉽다.
    • ILSpy나 dotPeek, Reflector 같은 도구를 이용하면 IL 어셈블리의 내용을 조사하고 역컴파일 할 수 있다.
  • CLR은 여러 실행시점 서비스들의 호스트 역할을 한다. 그런 서시브들로는 이를테면 메모리 관리, 라이브러리 적재, 보안 서비스 등이 있다. CLR은 언어 중립적이므로 여러 언어(C#, F#, Visual Basic, .NET, Managed C++ 등)로 응용 프로그램을 개발하는 것이 가능하다.

C#과 WinRT

  • C#은 WinRT라 표기하는 Windows Runtime 라이브러리들과도 연동된다. WinRT는 언어 독립적이고 객체 지향적인 방식으로 라이브러리들에 접근하기 위한 실행 인터페이스이자 실행시점 환경이다. WinRT는 Windows 8 이상의 운영체제들과 함께 제공되며, 부분적으로는 Microsoft COM(Component Object Model)의 개선된 버전의 일부이다.
  • WinRT 라이브러리는 새로운 현대적 사용자 인터페이스(몰입적인 터치 우선 응용 프로그램의 작성을 위한)와 모바일 기기 고유의 기능(감지기, 문자 메시지 처리 등), 그리고 .NET Framework와 일부분 겹치는 다양한 핵심 기능성을 지원한다. 이처럼 겹치는 부분이 있기 때문에 Visual Studio에는 .NET Framework 중 WinRT와 겹치는 부분을 감추어 주는 Windows 스토어 프로젝트용 참조 프로파일(reference profile; .NET 참조 어셈블리들의 집합)이 있다.
  • WinRT와 통상적인 COM의 차이는 WinRT는 자신의 라이브러리들을 다양한 언어들에 투영한다는 것이다. 이 덕분에 그런 언어들(C#, VB, Javascript)에서 WinRT의 형식들은 마치 해당 언어를 위해 특별히 작성된 것처럼 보이게 된다. 예컨대 WinRT는 대소문자 규칙을 해당 언어의 표준에 맞게 적용시키며, 심지어는 일부 함수와 인터페이스를 변형하기도 한다.

C# 6.0의 새로운 기능과 특징

  • C# 6.0의 가장 큰 특징은 컴파일러를 완전히 C#으로 재작성했다는 것이다. 프로젝트 로슬린(Roslyn)이라고 알려진 새 컴파일러는 전체 컴파일 파이프라인을 라이브러리들을 통해서 외부로 노출하기 떄문에 누구라도 임의의 소스 코드에 대한 코드 분석을 수행할 수 있다. 컴파일러 자체는 오픈 소스이며 github.com/dotnet/roslyn에서 구할 수 있다.
  • 엘비스(Elvis) 연산자라고도 부르는 널 조건부 연산자(null-conditional operator)를 이용하면 메서드 호출이나 형식 멤버 접근 전에 명시적으로 널(null)을 점검해야 하는 번거로움을 피할 수 있다. 아래 예에서 result는 null로 평가 된다.
StringBuilder sb = null;
string result = sb?.ToString();
  • 표현식 본문 함수(expression-bodied function)는 표현식 하나로 이루어진 메서드나 속성, 연산자, 인덱서를 람다 표현식 형태로 간결하게 작성하는 기능이다.
public int TimesTwo (int x) => x * 2;
public string SomProperty => "속성 값";
  • 속성 초기치(property initializer)는 자동 속성에 초기 값을 배정한다.
public DateTime Create { get; set; } = DateTime.Now;
public DateTime Create { get; } = DateTime.Now; // 초기화되는 속성을 읽기 전용으로 만들 수도 있다.
  • 색인 초기치(index initializer)를 이용하면 인덱서를 제공하는 임의의 형식을 하나의 단계로 초기화할 수 있다.
new Dictionary<int, string>() { [3] = "three", [10] = "ten" }
  • 문자열 보간(string interpolation)은 string.Format 보다 간결한 방식으로 문자열을 서식화하는 기능을 제공한다.
string s = $"It is {DateTime.Now.DayOfWeek} today";
  • 예외 필터(exception filter)는 catch 블록에 조건을 적용할 수 있게 해준다.
try
{
    new WebClient().DownloadString("http://asef");
}
catch (WebException ex) when (ex.Status == WebExceptionStatus.Timeout)
{
    ....
}
  • using static 지시자는 주어진 형식의 모든 정적 멤버를 도입(import)한다. 그러면 그 멤버들은 별다른 한정(qualification) 없이 바로 사용할 수 있다.
using static System.Consol;

WriteLine ("Hello, World"); // Console.WriteLine이 아니라 그냥 WriteLine
  • nameof 연산자는 변수나 형식 또는 기타 기호의 문자열 이름을 돌려준다. 이를 활용하면 Visual Studio에서 기호의 이름이 변경 했을 때 코드가 망가지는 일을 피할 수 있다.
int capacity = 123;
string x = nameof (capacity); // x는 "capacity"
string y = nameof (Uri.Host); // y는 "Host"
  • 이제는 catch 블록과 finally 블록 안에서 await를 사용할 수 있다.

C# 5.0의 새로운 기능과 특징

  • C# 5.0의 가장 큰 특징은 async와 await를 통해서 비동기 함수(asynchronous function)를 지원한다는 것이다. 비동기 함수 덕분에 비동기 연속(asynchronous continuation)이 가능해졌다. 비동기 연속 기능을 이용하면 반응성 좋고 스레드에 안전한 리치 클라이언트(rich client) 응용 프로그램을 좀 더 손쉽게 만들어 낼 수 있다. 또한 비동기 함수는 입출력 한정(I/O-bound) 응용 프로그램을 고도로 동시적이고 효율적으로 구현하는데도 도움이 된다.

C# 4.0의 새로운 기능과 특징

  • 동적 바인딩
  • 생략 가능 매개변수와 명명된 인수
  • 제너릭 인터페이스와 대리자의 형식 가변성
  • COM 상호운용성 개선

C# 3.0의 새로운 기능과 특징

  • C# 3.0에 추가된 기능들은 대부분 LINQ(Lanquage Intergrated Query)와 관련된 것이다. LINQ  기능 덕분에 프로그래머는 질의문을 C# 프로그램 소스 코드 안에 직접 써 넣어서 그 정확성을 정적으로 점검할 수 있다. 또한 원격 자료원 뿐만 아니라 지역 컬렉션에 대해서도 질의를 수행할 수 있다. LINQ를 지원하기 위해 C# 3.0에 추가된 기능은 아래와 같다.
  • 지역 변수 형식의 암묵적 지정
  • 객체 초기치
  • 람다 표현식
  • 확장 메서드
  • 질의 표현식
  • 표현식 트리
  • 자동 속성
  • 부분 메서드
It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

The author

지성을 추구하는 디자이너/ suyeongpark@abyne.com

댓글 남기기