C#

최근 편집: 2023년 4월 11일 (화) 18:09
(C Sharp에서 넘어옴)


C#Microsoft, Hewlett-Packard, Intel의 세 회사가 합작해 만든 컴퓨터 언어로, Java의 대항마로 개발되었다. 현재는 Microsoft만 언어 표준 정의 및 개발을 하고 있다. 공식 C# 컴파일러는 C# 6.0 컴파일러부터 Roslyn으로 개발된 컴파일러를 사용하며, 비공식 C# 컴파일러로 Mono C# 컴파일러가 있다. 이 컴파일러들은 C# 원시 코드를 CIL 어셈블리 코드로 변환하는 기능을 수행한다. C#의 런타임으로는 .NET Framework를 사용하며, 이를 사용할 수 없는 환경에서는 Mono 런타임을 사용한다. 런타임에는 JIT 컴파일러가 내장되어 있어 CIL 어셈블리 코드를 CPU 네이티브 코드로 변환하여 캐시해서 사용한다.

이름의 유래는 C++++으로, ++ 두 개를 위아래로 배치하여 #을 사용하는 것으로 알려져 있다. 다만 #이라는 글자가 URI에서 해당 문자 뒤의 모든 문자를 무시하는 문자이기 때문에 각종 위키 문서 등에서는 # 문자 대신 Sharp 등 단어를 사용하는 등 불편함이 있다.

JIT 컴파일러 언어이긴 하지만 CPU 명령어로 변환하는 프로그램 등을 이용하여 네이티브 프로그램으로 변환할 수도 있다. 실제로 이런 원리로 iOS 앱이나 COSMOS 운영체제를 개발할 수 있고 셰이더 프로그램을 개발할 수도 있다.

역사

C# 언어는 초기에 마이크로소프트의 주도 하에 휴렛 팩커드, 인텔의 지원에 힘입어 개발된 언어이다. Java 언어에 대항하여 개발이 시작되었는데, 이 배경에는 마이크로소프트의 비주얼 J++ 및 마이크로소프트 JVM을 이유로 썬 마이크로시스템즈에 의해 소송당한 이유가 크다.

닷넷 프레임워크 2.0과 함께 배포된 C# 2.0은 ECMA[1]ISO[2]에 표준으로 등록되었다. 다만 이후 새 버전들은 5.0을 제외하면 ISO에 개정안이 제출되지 않았다. ECMA에는 1.0버전부터 최신 버전인 7.0까지 모두 등록되어 있다.

C# 2.0이 사용되던 시기에는 수세 리눅스로 유명한 노벨 사의 한 프로그래머가 Mono라는 런타임 및 C# 컴파일러를 개발했는데, 많은 오픈소스 커뮤니티 사용자들은 C#을 사용할 경우 마이크로소프트의 특허 침해로 인한 위기를 맞을 수 있다며 우려했으며, 많은 언어 이용자들을 확보해야 하는 마이크로소프트는 Mono를 상당히 반겨했으며 절대로 C# 및 닷넷으로 특허권을 행사하지 않겠다고 약속했다.

특징

기본적인 문법은 Java에서 계승되었으나, 상당히 많은 프로그래밍 언어의 문법들이 참고되어 적용되었다. 이를 테면 함수형 언어의 특징이 녹아있는 Lambda 문법, 두 개의 함수가 교차 실행되는 Coroutine 문법, DBMS에서 사용하는 SQL 문법이 차용된 Linq 문법, 인터프리터 언어에서 자주 쓰이는 동적 객체 및 동적 타입, PHP스위프트 등에서 유용하게 쓰이는 형태의 문자열 보간 문법 등 상당히 많은 언어들이 분석 및 참고되어 새 버전에 계속 추가되고 있다.

C#의 새 버전은 보통 닷넷 프레임워크의 주 버전이 개정될 때 갱신되는데, 최신 버전의 C# 문법은 이전 버전 닷넷 프레임워크에서도 사용할 수 있다. 다만 개발 도구를 업데이트 해야 사용할 수 있기 때문에 최신 문법을 이용하려면 최신 버전의 비주얼 스튜디오를 사용해야 한다.

  • C# 초기 버전에서는 Java의 언어적 특성을 많이 차용했고 C++의 문법을 최대한 사용하려고 노력한 흔적이 보인다. 실제로도 Java 사용자 지분을 가져오기 위해 Java와 비슷한 문법을 통해 C#과 Java 간의 코드 변환 도구도 제공하고 아예 Java의 jar 파일을 참조하여 사용하는 기능도 지원했다. C# 2.0에서 추가된 제네릭 프로그래밍의 경우 C++의 템플릿 프로그래밍보다는 Java의 제네릭 프로그래밍 쪽에 더 초점을 맞추어 개발되었다.
  • C# 3.0부터는 LINQ 문법을 추가하여 SQL과 같은 쿼리 형태로 사용하는 기능을 추가하여 SQL에 익숙한 개발자 등이 환영했다. 또한 Lambda 문법이 추가되어 함수형 언어의 특성을 가져오기도 했다.
  • C# 4.0에서 추가된 Covariant 및 Contravariant 제네릭 타입은 제네릭 타입에 있어서의 객체지향적인 문법을 강화했다. 그러면서도 선택적 인자 문법의 추가로 C++이나 Visual Basic에서 지원하던 매개변수 기본 값의 지원을 시작해 생산성을 향상시켰다.
  • C# 5.0에서 추가된 async 및 await 문법을 통해 비동기 연산에 강한 언어적 특성이 추가되었다.
  • C# 6.0에서 추가된 String Interpolation 기능은 Swift 등에 있던 기능을 가져온 것으로, 형식 문자열을 사용해야 했던 기존 방식의 불편함을 많이 해소하여 생산성을 향상시켰다.

버전업이 될 때마다 다른 언어의 긍정적인 요소들을 적극적으로 차용하여 개발자들의 생산성을 향상시키면서도 되도록이면 해당 문법을 사용하지 않고도 개발이 가능하도록 유지하는 경향이 있다.

Mono

Mono는 .NET Framework 및 C# 컴파일러 등의 오픈소스 버전으로, Microsoft와는 전혀 상관 없이 개인이 제작을 시작하였다. 이후 Novell에서 관리되기 시작했고, WPF, WCF 등과 같은 규모가 큰 .NET Framework 구성요소들은 구현되지 않았으며 한동안 유니코드에 약한 모습을 보였다.

Novell에서 운영할 때는 자사 제품인 OpenSUSE등 Linux 위주에서 특히 강한 모습을 보였으나 Xamarin에서 인수한 뒤로는 Android, iOS 등에서의 동작을 최적화하는 등 더 나은 모습을 보여주었고, Microsoft에서 .NET CLR 관련 소스코드들을 모두 오픈한 뒤로는 Mono에서 일부 소스코드를 가져다 사용하는 등 점점 .NET Framework와의 차이점을 좁히고 있다.

현재 Xamarin이 Microsoft에 인수되었기 때문에 Mono도 Microsoft에서 관리하는 셈이 되었는데, 최근 Microsoft가 Linux나 OS X 등에서도 구동이 가능한 .NET Core CLR를 공개했기 때문에 점차 Mono를 폐쇄하거나 통합할 가능성이 있다.

국제 표준

C# 1.0, 1.1, 2.0은 ECMA 및 ISO 표준으로 등록되어 있다. 따라서 이 버전들은 규격을 마음대로 가져다 사용해도 큰 문제가 없다. 이후의 버전은 ECMA나 ISO 어느쪽에도 국제 표준으로 등록되지 않았지만 C# 5.0의 경우에는 2014년부터 ECMA 표준 등록 절차를 밟고 있다는 뜬소식은 있다.

용도

C#이 공개된 초기에는 C#을 이용할 수 있는 용도로는 Win32 응용프로그램, Win32 콘솔 응용프로그램, Win32 서비스, ASP.NET 웹 서비스 정도만 개발할 수 있었다.

C#이 구동되는 런타임인 닷넷 프레임워크가 지원하는 플랫폼의 한계가 컸기 때문인데, 이후로도 스티브 발머의 CEO 재임 기간에는 마이크로소프트와 관련된 플랫폼인 윈도우, 윈도우 CE윈도우 모바일, Zune, 윈도우폰, 엑스박스 360을 제외하면 ASP.NET 웹 서비스, 실버라이트 웹 플러그인 정도나 C#으로 개발할 수 있었고 이 외에는 정식 지원 플랫폼이 아닌 리눅스유닉스, macOS를 Mono를 이용해 구동하는 정도였다.

사티아 나델리가 마이크로소프트의 새 CEO가 된 이후로는 공식 지원 플랫폼의 범위가 넓어져서 C#의 최신 버전인 7.0을 개발할 수 있는 IDE인 Visual Studio 2017 기준으로 아래와 같은 플랫폼을 공식 지원하게 되었다.

오픈소스 버전인 Mono 런타임이 지원하는 플랫폼은 아래와 같다.

이 외에 Cosmos라는 프로젝트에서 C#을 이용해 운영체제를 개발할 수 있는 도구를 제공한다.[3]

개발 가능 소프트웨어의 종류

  • 명령프롬프트 응용프로그램 (Windows, Linux, OS X)
  • Windows Forms 응용프로그램
  • Windows Presentation Foundation 응용프로그램
  • Windows Communication Foundation 서비스
  • Silverlight 웹 플러그인
  • Silverlight for Windows Phone 애플리케이션
  • Windows 8/8.1(WinFX) 애플리케이션
  • Universal Windows App 애플리케이션
  • ASP.NET 웹 애플리케이션
  • ASP.NET 웹 서비스
  • Xamarin.Android 애플리케이션 (Android)
  • Xamarin.iOS 애플리케이션 (iOS)
  • Xamarin.Mac 애플리케이션 (OS X)
  • Unity 게임 응용프로그램 (Windows, Linux, OS X, Android, iOS, Windows Phone, Playstation, Xbox, ...)
  • Microsoft Office 플러그인
  • 운영체제 (COSMOS)
  • ...

자유 소프트웨어 진영에서의 우려

자유 소프트웨어 진영에서는 C# 언어 또는 Mono 런타임을 사용하는 것이 Microsoft에 의한 소송의 우려가 있다며 사용을 자제해달라는 말을 해왔다. Microsoft에서는 이를 반박해왔으며, 현재까지 C#을 Windows 이외의 플랫폼에서 사용하여 발생한 소송은 없다. 오히려 Microsoft 자신이 다른 플랫폼에의 C# 언어 개발 지원을 위해 Microsoft Visual Studio Code IDE와 .NET Core CLR을 공개하는 등 아낌없는 지원을 하고 있다.

부연 설명

  1. 편의상 아래의 런타임들을 제외한 모든 마이크로소프트 공식 런타임을 총칭
  2. 마이크로소프트 공식 오픈소스 버전 닷넷 런타임
  3. Xamarin 사에서 Mono를 기반으로 개발한 것을 마이크로소프트에서 사들였다

출처

  1. “Standard ECMA-334”. 《ECMA International》. 
  2. “ISO/IEC DIS 23270”. 《International Organization for Standardization》. 
  3. “COSMOS - C# Open Source Managed Operating System”.