#!wiki style="display: inline; display: none;"
, }}}
[include(틀:링크시 주의, 링크= C\ 또는 # 또는 C#)]
C# 관련 틀 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
<colcolor=#67217A,#A179DC> C# | |
개발 | Microsoft |
버전 | 13(2024년 11월 업데이트) |
| |
[clearfix]
1. 개요
#!syntax csharp
Console.WriteLine("Hello, World");
2000년 7월에 개최되었던 Professional Developers Conference(PDC)에서[1] .NET 프로젝트와 함께 발표된 객체 지향 프로그래밍 언어. 한국어로 쓸 때는 '씨샵', '씨 샤프' 등으로 쓴다. 마이크로소프트에서 개발되었으며, 1983년에 등장한 C++와 1995년에 등장한 Java에서 강한 영향을 받았다. 확장자는 .cs다.
온라인상으로 코드를 실행시켜 보고 싶다면 여기로.
MS에서 자기들 만의 Java를 개발하겠다는 목적이었던 만큼 Windows 플랫폼에서는 Java 이상의 위상을 가지고 있으며 Java가 오라클의 정책 때문에 한 풀 꺾인 것과는 반대로 .NET 프레임워크를 오픈소스로 공개하는 파격적인 정책을 통해서 단순히 Windows에 국한된 언어가 아닌 Java 이상으로 다양한 분야에 쓰이는 언어가 되었다.
2. 명칭
이름의 유래는 두 가지에서 따왔다고 한다. # 첫 번째 의미는 음악에서 유래한 것으로, 도(C)에 반음(♯)을 올린 것.[2] MS에서는 출판물 등에서 키보드의 # 대신 유니코드의 반음 올림 기호( ♯, U+266F)를 쓰기도 한다. 기본 음과 동일하되 한 단계 더 높음을 상징한다고.두 번째 의미는 많은 사람들이 알고 있듯이 C++ ++라는 뜻이다. ++++을 세로로 쌓으면 시각적으로 # 모양이 되기 때문. 한때 해커들 사이에서 유행했었던 리트의 일종이다.
++ ++
|
→ | # |
한때 ++++을 쌓아 #이라는 건 사실이 아니고 사람들이 만든 농담이네 마네 하였으나, 명명 당시 실제로는 여러 의미를 다 고려한 중의적인 내용이라고 한다.
여담으로 초기 이름은 Cool(C-like Object Oriented Language) 이었다고 한다. 확장자가 .Cool이면 재밌을 것 같다는 이유 등으로 직원들에게 인기 있는 이름이었으나, Cool이라는 단어로는 검색을 하면 다른 것들이 훨씬 많이 나올 것이기 때문에 도중에 바꿨다고. 아니나 다를까 Cool보다도 훨씬 자주 쓰는 동사를 이름으로 가진 프로그래밍 언어는 검색 편의성이 영 좋지 못하다. 현재는 스탠퍼드 대학교의 모 교수가 Cool이라는 이름으로 프로그래밍 언어를 개발했다고 한다.[3]
3. 역사
1995년에 Java가 나오자 MS에서도 썬 마이크로시스템즈와 라이센스를 맺은 뒤 독자적인 Java 확장 언어 비주얼 J++를 만들었다. 그런데 썬에서 개발한 JVM에 MS가 임의로 부가 기능을 추가하면서 썬과 특허권 소송이 걸리는 바람에, MS의 Visual Studio에서 비주얼 J 시리즈와 MS VM(MS 버추얼머신)을 사용할 수 없게 되었다. 하지만 Java라는 언어 자체가 매력적인 언어이고 MS 역시 이를 버릴 수 없다고 생각한 것인지, 1999년부터 개발에 착수하고 2000년에 .NET 프로젝트와 함께 C#이라는 이름으로 새로운 언어를 발표한다.C# 2.0까지는 ECMA 및 ISO 두 곳 모두에 표준이 등재되어 있으나, 이후 버전은 C# 5.0만이 ECMA 표준이 등재되어 있다.
플랫폼은 .NET Framework와 .NET Core 기준이며, 전자와 구분이 다른 Microsoft .NET Standard는 여기에 기재하지 않는다.
버전 | 플랫폼 | 표준 | 출시일 | Visual Studio 대응 버전 | 변경 사항 |
1.0 | .NET Framework 1.0 | ECMA-334 | 2002년 1월 | .NET 2002 | 링크 |
1.1 | .NET Framework 1.1 | 2003년 4월 | .NET 2003 | - | |
2.0 | .NET Framework 2.0 | 2005년 11월 | 2005 | 링크[4] | |
3.0 | .NET Framework 2.0~3.5 | - | 2007년 11월 | 2008 | 링크[5] |
4.0 | .NET Framework 4.0 | - | 2010년 4월 | 2010 | 링크[6] |
5.0 | .NET Framework 4.5 | ECMA-334 | 2012년 8월 | 2012 | 링크[7] |
6.0 |
.NET Framework 4.6 .NET Core 1.0 .NET Core 1.1 |
- | 2015년 7월 | 2015 | 링크[8] |
7.0 | .NET Framework 4.6.2 | - | 2017년 3월 | 2017 v15.0 | 링크[9] |
7.1 |
.NET Framework 4.7 .NET Core 2.0 |
- | 2017년 8월 | 2017 v15.3 | 링크[10] |
7.2 | .NET Framework 4.7.1 | - | 2017년 11월 | 2017 v15.5 | 링크[11] |
7.3 |
.NET Framework 4.7.2 .NET Core 2.1 .NET Core 2.2 |
- | 2018년 5월 | 2017 v15.7 | 링크[12] |
8.0 |
.NET Framework 4.8 .NET Core 3.0 .NET Core 3.1 |
- | 2019년 9월 | 2019 v16.3 | 링크[13] |
9.0 | .NET 5.0 | - | 2020년 11월 | 2019 v16.8 | 링크[14] |
10.0 | .NET 6 | - | 2021년 11월 | 2022 | 링크 |
11.0 | .NET 7 | - | 2022년 11월 | 2022 v17.4 | 링크[15] |
12.0 | .NET 8 | - | 2023년 11월 | 2022 v17.8 | 링크[16] |
13.0 | .NET 9 | - | 2024년 11월 | 2022 | 링크[17] |
4. 문법
자세한 내용은 C#/문법 문서 참고하십시오.5. 특징
5.1. Java와의 비교
Java가 자바 가상 머신이 필요하듯이 C#은 닷넷이 필요하다. 닷넷 대신 비교적 작은 사이즈의 가상머신에 올려서 실행시키는 방법도 있다.성능 관련해서는, 사실 Java가 처음 나왔을 때 성능 때문에 많은 포화를 맞았고 C#이 상대적으로 큰 논란 없이 입성하기는 했다. 일단은 Java보다 차세대 언어이므로 Java보다 성능적으로 우위인 부분이 많긴 하지만(비슷한 코드에서 평균적으로 10~20% 정도 더 빠르다.) 여전히 C/C++보다는 다소 느리다. 이는 가상머신 언어의 태생적인 한계점이라고 할 수 있다.[18]
그래서인지 .NET 7에서 실행 속도를 개선하기 위해 아예 네이티브 코드로 컴파일시키는 .NET Native AOT가 나왔다. Java와 상호 호환되는 Kotlin도 네이티브 컴파일을 지원한다는 점을 생각하면 비슷한 언어끼리는 서로 닮아가는 모양이다.
5.2. 호환성 및 범용성
라이벌 격인 Java에 비해 MS라는 특정 플랫폼에 강하게 묶여있다는 인식이 널리 퍼져있지만, 공식적으로 2016년에 발표된 .Net Core부터 리눅스를 공식지원했으며, .Net Core 3.0부터는 macOS에서도 잘 동작한다. TIOBE 기준 점유율 측면에서 한때 Objective-C가 C#보다 우위에 있기도 했지만, Objective-C는 Swift의 등장 때문에 점유율이 크게 내려가고 있어 2016년 4월 현재 C#이 Objective-C보다 크게 앞서고 있다. 다만 Swift가 큰 폭으로 오르고 있는 중. #물론 밑에 서술할 모노 덕분에 Objective-C보다는 범용성이 훨씬 높다. 유니티 엔진의 기본 개발 언어이기도 하다. 크라이엔진도 결국 유니티 엔진에 익숙해진 개발자들을 끌어오기 위해 C# 지원을 시작했다. 언리얼 엔진도 마이크로소프트 소속 개발자들이 제작한[19] MonoUE라는 플러그인을 설치하면 C# 사용이 가능하다. C#으로 Android와 iOS용 앱, macOS용 Cocoa 기반 프로그램을 개발할 수 있도록 해 주는 Xamarin이라는 프레임워크가 있다. 원래 서드파티 상용 프레임워크였으나, MS에 인수되었고, 이후 Visual Studio 2015에 기본 탑재되었다.
이렇게 MS가 노선을 바꾸면서 C#의 지원범위는 점점 늘어나서 리눅스[20]와 임베디드[21] 분야까지 섭렵 가능한 매우 넓은 분야를 커버할 수 있는 언어가 되었다.
UI 쪽으로도 C#을 필두로 MAUI를 지원하면서 IOS, Android까지 크로스플랫폼이 가능해 졌으므로 이전에 존재하던 제약들이 많이 사라졌다.
Visual Studio의 확장 프로그램(플러그인) 개발에 쓰이는 언어이기도 하다.
5.3. .NET Native AOT
자세한 내용은 Microsoft .NET 문서의
.NET Native AOT
부분을
참고하십시오.5.4. 모노
윈도우 이외의 운영체제에서도 C# 사용이 가능하도록 모노라는 프로젝트가 진행 중이다. 아직 그다지 완전하다고 볼 수는 없다. MonoDevelop/Xamarin Studio IDE가 제공되어, 개발도 다른 플랫폼에서 할 수는 있지만 Visual Studio만큼의 편의성을 제공하지는 못한다.[22]MS는 오랫동안 오픈 소스 진영에 배타적인 태도를 보여 왔다. MS가 만들지 않은 프레임워크는 대부분의 기존 프로그램(.NET 프레임워크용으로 만든)이 잘 안 돌아가 무용지물이 될 위험성이 존재했으며, 닷넷에 공개되지 않은 기술, 또는 MS가 특허를 가지고 있는 기술을 사용하면 나중에 특허 소송으로 프로젝트를 아예 끝장낼 가능성을 완전히 배제할 수 없었다. 이 때문에 리처드 스톨먼 등 여러 사람이 'C#과 모노를 써서는 안 된다'고 한 적도 있다. MS에서는 2006년 커뮤니티 공약이라는 것을 발표하면서 ECMA 표준에 의한 구현에 대해서는 특허권을 주장하지 않기로 했지만, 얼마 지나지 않아 모노의 주 구성 요소 대부분이 저 커뮤니티 공약의 적용 범위에 포함되지 않는다는 것이 밝혀졌다. 즉, 모노가 아직도 언제든지 특허 소송을 통해 없어질 수 있다는 것이 밝혀져 모노 위험 요소설이 다시 부상하였다.
그러나 2010년대 이래 MS는 친(親) 오픈 소스적인 행보를 보여, 2014년엔 닷넷을 오픈 소스로 공개하였으며[23], MS가 모노 프로젝트의 주요 메인테이너인 Xamarin을 인수하면서 이러한 우려는 종식되었다. 그 후 MS가 Xamarin 인수 이후 사실상 프로젝트 자체가 MS로 넘어갔다.[24] Git 기여자를 보면 Microsoft 개발자가 대다수다. 2015년 4월 29일에 배포된 Mono 4.0 버전에서는 아예 닷넷의 오픈소스 플랫폼인 .NET Core가 적용되었다.
2017년 5월에 Visual Studio의 macOS 버전이 공개되어서[25], macOS에서도 정식으로 C# 개발을 할 수 있게 되었다.
자신이 유료 IDE에 돈을 지불할 의향이 있다면 JetBrains의 Rider라는 선택지가 있다. Java용 IDE로 유명한 IntelliJ IDEA를 베이스로 하고 있어 리눅스를 포함한 크로스플랫폼이 지원되고 완성도가 높으며, MonoDevelop보다 훨씬 뛰어난 코드 컴플리션 및 리팩토링 기능을 제공한다. 또한 유니티 엔진과의 연동도 뛰어나다.
5.5. .NET Core
마이크로소프트가 C#, VB.NET 등 모든 닷넷 프레임워크 기반 언어를 Windows, macOS, Linux 기반에서 돌아가도록 만든 오픈 소스 프레임워크이다. 모노와 .NET Core 프레임워크 모두 오픈소스 기반이나, 모노의 경우 GTK#이라는 다중 플랫폼 GUI를 지원하지만 .NET Core의 경우는 2.x 버전까지 오로지 콘솔 프로그램 개발만을 지원했으나, 버전 3부터는 MS 윈도우 시스템 하에서 WPF와 WinForms를 지원한다.5.6. Windows Forms vs WPF
WPF(Windows Presentation Foundation)는 Windows Forms의 부족한 기능 및 디자인 기능을 대처하기 위해서 있는 디자인 특화 사용자 인터페이스이다.Windows API를 사용하는 Windows Forms와 다르게 WPF는 DirectX 기반으로 동작하며, 윈도우를 생성하는 네이티브 함수인
CreateWindow
는 창에만 한정되고 나머지는 직접 그리게 된다.[26] 따라서 버튼의 각도를 변경하는 등 Windows Forms에서 기능상 한계로 불가능한 것들이 가능하다!코드로 UI를 만드는 Windows Forms와 달리 WPF는 XML 기반 마크업 언어인 XAML을 사용한다.[27] 윈폼과 비교했을 때 컨트롤에서 차이가 있으며, 따라서 윈폼을 사용하다가 WPF를 처음 사용한다면 XAML 부분에서 어려움이 있을 수 있다. 그래서 Visual Studio에서 블렌드(Blend for Visual Studio)라는 별도의 디자이너 IDE가 있을 정도.[28]
Windows Forms를 쓰든 WPF를 쓰든 본인 자유이지만, 일반 프로그램 외에서 유니버셜 윈도우 앱(UWP)과 안드로이드와 아이폰 앱을 만들 수 있는 Xamarin은 XAML 언어를 기본으로 사용하고 있기 때문에 UI 디자인을 예쁘게 꾸미고 싶다면 배우는게 좋다. 아니면 기본적인 것(애니메이션 같은 복잡한 기능 등 제외)만 배우고 포토샵이나 일러스트 등으로 UI에 사용할 사진을 만들고 그걸로 쓰면 될 것이다.
WPF 컨트롤은 Windows Forms에서도 사용할 수 있다.
간단한 비교로 적어보았다.
-
렌더링
Windows Forms는 CPU 렌더링 방식( Windows API)이며 연산량이 적고 메모리를 많이 먹지 않아서 비교적으로 가벼운 편이다. 다만 애니메이션 구현이 어렵고 기본적으로 동기 방식이다.
WPF는 DirectX 렌더링 방식이기 때문에 연산량이 많고(백터 방식), Windows Form과 다르게 무겁고, 메모리를 많이 먹는 편이지만 애니메이션 구현이 쉬우며 기본적으로 비동기 방식이다. -
컨트롤과 코드 비하인드
Windows Forms는 초보자가 사용하기 좋으나 디자인 패턴이 제한적이고 바인딩에 대하여 추가적인 리소스가 있는 편이다.
WPF는 모던한 디자인 패턴이 가능하고, 바인딩을 염두에 두고 설계되었지만 초보자가 사용하기에는 어렵다.[29] -
그래픽
Windows Forms는 CPU 렌더링이 기본이며 GPU 렌더링이 가능하나 어렵고, 스레드 관리가 귀찮음을 유발하며 프레임 개념에 접근이 어렵다.
WPF는 GPU로 렌더링이 가능하고 스레드 관리와 프레임에 대한 접근이 쉬운 편이다. -
커뮤니티 크기
Windows Forms는 출시된 후 오랜 시간이 지났기 때문에 자료가 많고 외부 컨트롤 라이브러리가 많다! 참고로 대부분의 외부 렌더링 라이브러리의 경우 GDI를 통해서 그리는 경우가 있는데, 이 경우 WPF와의 성능 차이가 상당히 난다.
WPF는 최근에 나온 기술이라 자료가 적고 현재 외부 컨트롤 라이브러리가 많아지고 있는 중이다. 다만 일부 외부 렌더링된 컨트롤을 가져오는 경우 성능이 떨어질 수 있다. -
엔터프라이즈 레벨
Windows Forms는 Windows Forms로 만든 프로그램의 크기와 부하가 일정하게 커지며 퍼포먼스 개선이 힘든 편이다. 따라서 디자이너와의 협업이 거의 불가능하다.
WPF는 WPF로 만든 프로그램의 크기가 커져도 부하가 크게 증가하지 않는다. 프레임 세팅이나 다른 렌더링 설정으로 퍼포먼스 개선이 어느 정도 가능하다. 그리고 디자이너와 분리된 상태에서의 협업이 가능하다.
6. 라이브러리
아무래도 MS 가 주도해서 개발한 만큼 MS가 주도한 프로젝트가 많다.- MS 계열
- Windows Forms
- ASP .NET
- Blazor
- WPF
- WinUI - UWP를 계승한 UI 프레임워크다. WPF와 비슷하지만, 호환되진 않는다. 여담으로 기본 컨트롤이 Fluent 디자인을 따르고 있어 Windows 11에 어울리는 앱을 만들기 좋은편이다.
- .NET MAUI
- 비 MS 계열
- Avalonia UI - 한때는 .NET 재단이 관리하던 때가 있었으나 2024년 기준으로 닷넷 제단과의 협력에서 벗어나 별개의 프로젝트로 운영된다.
- Uno Platform - Avalonia UI와 비슷하다.
7. 통합 개발 환경(IDE)
- Visual Studio - 다운로드 ( Visual Studio for Mac - 다운로드)
- Rider - 다운로드[30]
- Visual Studio Code - 다운로드 + C# 플러그인
8. 완성도와 점유율
현재 C#의 시장 점유율은 높은 편이고, 언어의 완성도도 현존하는 언어 중 괜찮다는 평이 많다. C++는 생산성이 너무 떨어지고, Java의 경우 여러가지로 제약이 많아 아쉬운 점을 C#이 덜어주고 있다는 것. 코드기어(구 볼랜드)에서 Delphi와 C++Builder를 개발하여 유명해진 Anders Hejlsberg를 영입해 만들었는지라 컴포넌트 개발 환경이 우수하다. 엄청난 생산성을 자랑하던 델파이와 개발환경이 거의 유사하기 때문에 델파이의 개발자들은 거의 C# 개발자로 넘어갔다. Visual Studio 6의 비주얼 베이직과 델파이/C++ Builder/C#을 비교해 보면 서로 간에 안드로메다 급으로 차이가 난다. 뿐만 아니라 GUI를 만들 때도 C#(윈폼/WPF)이 월등히 편리하다.[31] 윈도우즈 개발자들이 UI 작업 이야기 할 때 뭔가 이슈가 있다면 C# 개발자들은 그걸 아주 쉽게 생각한다. 하지만 C++, 특히 MFC 개발자들은... 사실 MFC의 경우 단순히 Win32 API의 래핑수준을 넘지 못하지만, C#의 UI 컴포넌트는 근본 설계부터 컴포넌트 구조를 위해 설계되었으니 당연한 부분이다.MS사의 개발 도구에서 C#을 강력히 밀어줬는데도 불구하고 2005년 이전까지만 해도 C#의 점유율이 크게 낮았다. 전문가들에게는 C++, 초보자들에게는 VB 6.0에게 밀렸기 때문이다. 하지만 2010년 이후로는 C++의 점유율이 서서히 낮아지고 있는 반면 C#의 점유율은 크게 높아졌다. C#은 강력한 reflection 구조를 갖고 있기 때문에 인텔리센스(자동완성)를 언어 차원에서 지원하므로, Visual Studio 2002~2005 버전을 써 본 사람은 C#과 C++의 인텔리센스 기능이 얼마나 차이가 났는지 기억할 것이다.[32]
그래도 초기에는 MS에 종속된 언어라는 이미지가 강했는데다가 당시 .NET는 비공개적이라 Java급으로 MS의 고소 영향력에서 벗어날 수 없다는 이미지도 있어 윈도 밖으로는 그다지 인지도가 있는 언어는 아니었다. 하지만 사티아 나델라 체계에서 .NET의 권한을 .NET 재단에 넘기고 코어를 오픈소스로 전환함과 동시에 새로운 시대에 맞춘 각종 프레임워크(ASP.NET Core, Blazor) 등을 내놓으며 전세계적으로 Java에 맞먹는 보편적으로 쓰이는 언어에 올라오는데 성공했다.
한국에서는 그다지 많이 쓰이는 언어는 아닌데 전자정부표준프레임워크때문에 국내 웹개발 백엔드 부분이 Java+Spring에 묶여있기 때문이다. 한국에서 주로 C#이 쓰이는 분야는 게임, 제조업, 의료업계에서 주로 쓰이며 전자정부프레임워크를 쓸 일이 없는 게임회사나 제조업계는 C#의 ASP.NET 그리고 ASP.NET Core 또한 활발히 사용중이다.
9. 학습
9.1. 도서
- 시작하세요! C# 10 프로그래밍
- 이것이 C#이다 - 입문서로 보일 수 있으나 초보자용 도서는 아니다.
- C#을 다루는 기술 - Stack Overflow에서 한 때 1위 답변자이자 현재도 상위 0.01% 답변자로 유명한 구글 엔지니어 존 스킷(Jon Skeet)이 저술한 C# in Depth 네 번째 개정판의 한국어 번역서로 저자의 경험에 맞춰 C# 자체를 좀 깊게 파고드는 내용이라 입문서는 아니다. 11 ~ 13장 보기, 공식 홈페이지
- C# 6.0 완벽 가이드 - 프로그래밍의 기본과 C#에 도입된 여러 개념을 체계적으로 알려주기에 기본 개념을 익히는 입문서로 적합하다. 이 책은 원래 C# in a Nutshell이라는 영문 서적의 번역서인데, 원서의 경우 C# 12.0 버전까지 나와 있다.
9.2. 웹사이트
- 마이크로소프트 - C#의 개발사답게 홈페이지에서 다양한 형태의 학습 자료를 제공하고 있다.
- C# 가이드
- 공식 컬렉션 Learn C# - C# 코드를 입력하고 실행해가며 학습이 가능하다.
- .NET 자습서 - 웹상으로 제공되는 자습서. 원한다면 PDF 파일로도 받을 수 있다.
- 닷넷노트 - C# 교과서의 저자가 운영하는 웹사이트로 C# 외에도 다양한 언어에 대한 강의가 제공된다.
- 코드카데미 C# 문법 치트시트 - Codecademy에서 문법이 간단히 정리된 글을 보거나, 무료 학습 코스를 들을 수 있다.
- C# 스터디 - C# 입문자 가이드, 응용 프로그래밍, 알고리즘 퀴즈, C# 최신 버전에 대한 정보 등을 포함하고 있다.
- C# key concepts on Exercism - 강의 및 실습 제공
9.3. 위키독스
- C# 프로그래밍 입문 - Do it! C# 프로그래밍 입문의 내용을 무료로 볼 수 있다.
9.4. 유튜브
10. 기타
- 기본적으로 C언어의 포인터 변수를 허용하지 않는다. 다만 unsafe 키워드[33]를 사용하면 C언어 형태의 포인터 변수를 선언하고 사용할 수 있다. 또한 마샬링 계열에서의 사용이나, 윈도우 Handle 오브젝트를 제어하기 위한 IntPtr이라는 포인터 클래스가 선언되어 있다. 포인터 변수를 지원하지 않는 대신 ref, out 키워드를 사용하여 포인터와 유사하게 작업할 수 있다. 연속된 메모리 영역을 조작할 땐 Span<T>를 사용할 수 있다.
-
C/C++로 만들어진 동적 링크 라이브러리(.dll) 사용은
DllImport를 통해 사용 가능하다.[34] 그렇다고 ntoskrnl.exe의 함수를 쓰는 것은 불가능하다.
이를 통해 OpenCV 같은 C++ 라이브러리를 C#에서 쓸수 있게 해주는 래퍼 라이브러리를 만들수 있다. - C#으로 빌드된 .dll의 경우, 프로젝트에서 참조하거나(컴파일 타임), System.Reflection.Assembly로 런타임 도중에 가져와서 사용 가능하다.
- 웹 애플리케이션 개발용으로는 ASP.NET을 밀어주고 있다. 이는 Java의 JSP에 대응되는 것으로, 기본적인 사항은 거의 비슷하다. 기업에서 주로 쓰고 있으나, 윈도우 서버( 인터넷 정보 서비스)를 비롯한 각종 라이선스 비용 문제 등으로 JSP만큼 크게 활성화되지 못했다. 2014년의 .NET 오픈소스화 이후, macOS와 리눅스에서도 돌아가는 오픈소스 구현체인 ASP.NET Core가 등장했지만 해외에서는 많이 사용하지만 국내에서는 흥하지 못하고 있다. JSP를 주로 쓰는 곳은 비교적 보수적인 SI나 관공서, 대기업 등이어서 ASP.NET으로 넘어갈 의향이 없고, 최신 기술에 민감한 회사들은 쉽고 간편하게 웹 애플리케이션을 만들 수 있는 Express나 Django, Ruby on Rails 등으로 넘어갔기 때문이다.
- 또한 플래시의 대항마로 실버라이트를 야심차게 내놓았으나 대차게 망해 버렸다.[35] HTML5가 부상하면서, 안 그래도 불안하던 실버라이트의 입지는 사실상 끝나버렸다 봐도 과언이 아니다. MS는 망조가 든 실버라이트를 살리기 위해 Windows Phone 7의 개발 언어로 쓸 수 있게 하는 등 많은 노력을 기울였으나, 그 WP7이 망했다.(...) 현재는 HTML5에 대응하는 Blazor로 바뀌었다.
- 작년까지 C#을 기반으로 하는 프레임워크인 모바일 크로스 플랫폼 개발 환경으로 Xamarin을 밀어주었으나, 초반에 다른 프레임워크가 없을 때 핫하게 치고 들어갔지만 후에는 플러터, 리액트 네이티브 등의 차세대 프레임워크에 밀려, 결국 Microsoft가 Xamarin를 지원 종료하고, 이를 일부 계승한 MAUI를 내놓았지만 아직까진 불안정한 편이다.
- ECMA와 ISO/IEC 표준으로 지정된 언어이며 C# 6.0 버전부터는 해당되지 않는다.
- 2012년 들어 처음으로 점유율에서 C++을 추월했다. 다만 C#이 성장한 것보다는 C++의 점유율이 많이 하락한 것으로 보인다. 한때는 넘사벽의 1, 2위( Java, C)의 위치에 닿을 가능성이 가장 높은 언어로 점쳐졌으나, C++이 다시 3위 자리를 탈환하고 그 다음 자리를 Python이 치고 들어오면서 성장세가 주춤하고 있다.
- 마이크로소프트의 XBOX 개발용 간이(?) 플랫폼인 XNA에 사용되는 언어. C#에 비하면 VB.NET은 더 쉽고, VB.NET마저 싫다면 어도비 에어밖에 방법이 없다.
- 유니티 엔진의 스크립트 언어[36][37]로도 쓰인다. 이쪽은 모노 기반. 최신 버전 설치시 GTK C#이 함께 설치된다. PS Vita의 공개용 게임 개발 툴[38]에도 사용된다.
- Stride 엔진 및 Godot 엔진의 스크립트 언어이기도 하다. 유니티와 차이점이라면 런타임으로 Microsoft .NET을 채택하여 최신 버전의 C#을 사용할수 있다는 점이다.
- C#의 전체적인 부분에 대한 튜토리얼 동영상.
11. 관련 문서
[1]
2011년부터 매년 개최되고 있는 Build의 전신이다.
[2]
피아노로 치면 첫 번째 검은 건반에 해당하며, 레(D)에 반음(♭)을 내린 D♭과 같은 음이다. 다만
19-TET에선 C♯과 D♭이 다른 음이다.
[3]
컴파일러 강의를 위해 만든 언어라고 한다.
[4]
제네릭, 파셜(partial. 한 클래스를 여러 파일로 나눌 수 있는 기능) 타입, 열거자(iterator), nullable, 속성 멤버, 정적 클래스, 대리자(delegate) 추가.
[5]
암시적 형식의 로컬변수(var), 객체 및 컬렉션 초기자, 자동구현 속성(get; set; 만으로 getter/setter 메소드가 구현되는 편의 기능), 익명 타입, 확장 메소드(기존 클래스에 확장되는 메소드로, 지정 타입에 메소드처럼 사용은 가능하나 해당 타입의 접근 제한된 멤버는 접근 불가능), 질의 표현식(흔히 아는 Linq의 시초), 람다 식, 표현식 구조, 파셜 메소드 추가.
[6]
동적 바인딩(dynamic, 초기화 후에도 다른 타입으로 값을 할당할 수 있는 특징이 있다), 이름있는 선택적 메소드 인자(arguments) 추가.
[7]
비동기 메소드(async/await), 호출 정보 특성 추가.
[8]
Roslyn 기반의 동적 컴파일러, 네임스페이스 정의란에 정적 타입 별칭 정의, 예외 필터, 비동기 try/catch/finally 구문, 자동구현 속성 할당, 읽기 전용 속성 기본값 할당, 멤버에 표현식 지원, 계층형 null 체크, 치환형 문자열 식, nameof 식(주로 멤버 및 타입 등 정의된 명칭을 정확하게 문자열로 표현하는 식), Dictionary 초기자 추가.
[9]
추가된 것도 있고 아직 나오지 않은 것도 있지만 일단 예정된 기능으로는 이진값 할당(0b00100 식으로 초기화), 수 구분자(사람이 구분 가능하도록 수를 언더바(_)로 구분되며 컴파일 시 무시된다), 지역 함수(메소드 구문 내 함수 정의 및 사용 가능), switch 문에 타입 구분 추가, 참조형 리턴(return), 튜플 식(4.0부터 추가되었으며 이번 튜플은 단순한 타입이 아닌 식으로 제공된다), out var(기존에는 out 인자에 할당 전 별도로 변수를 선언해야 했으며, 여기서는 메소드 호출 내에 바로 선언이 가능하다), 패턴 매칭, 레코드 타입(단순한 getter/setter 클래스로 간결하게 정의 가능), await 비동기 구문 범용성 강화 기능 추가.
[10]
async main, 기본 리터럴 표현식, 인퍼드 튜플 엘리먼트 네임 지원.
[11]
값 유형을 갖는 참조 시멘틱, 숫자 리터럴의 밑줄, private와 protected 접근 한정자 지원.
[12]
고정된 필드 접근, 패턴을 지원하는 모든 유형의 고정 명령문 사용, 참조 지역 변수의 재할당, 추가 제네릭 제약 조건 사용, 스택 배열 배열에 이니셜 라이저 사용 지원.
[13]
Null 가능한 참조 유형, async 스트림 지원, Index 타입 추가, Range 타입 추가, 인터페이스 멤버의 디폴트 구현, 재귀 패턴 허용, 표현식 전환 지원, 타겟 타입의 새로운 표현식 지원.
[14]
레코드 형식 도입, Init 전용 setter 추가, 최상위 문 지원
[15]
Int128 추가
[16]
컬렉션 식 및 인터셉터 추가
[17]
이스케이프 시퀸스 '\\e' 및 암시적 인덱스 엑세스 추가
[18]
설계 철학부터가 차이가 크다. 메모리 직접 관리를 배제하는 Java/C#과 메모리를 수동으로 관리하는 C/C++는 아예 다른 세계의 언어라고 보면 된다.
[19]
마이크로소프트에서 공식적으로 지원하는 것은 아니다.
[20]
.NET CORE와 .NET5
[21]
.NET NANO.
[22]
특히 macOS상에서는 여타 GTK# 개발 프로그램처럼 한글 입력에 문제가 있어 국내 개발자들의 불편을 사고 있다.
[23]
관련 문서.
[24]
원래의 개발사는
노벨 사(社)이었다.
[25]
사실 Xamarin Studio를 MS가 사들인 뒤 UI 디자인과 이름만 바꾼 것이다.
[26]
여기서 윈도우(운영체제 이름이 아닌 '창'을 의미)는 창뿐만 아니라 컨트롤도
게임 아니다크로스플랫폼을 지원하며, 비영리용으로 무료로 쓸수 있다.
[31]
언어 디자이너인 Anders Hejlsberg가 뛰어난 개발 생산성을 자랑하는
델파이 개발환경에서 좋은 점만을 골라서 가져왔다.
[32]
개발툴 수준에서 C#을 얼마나 밀어주는지는 단순히 위저드만 봐도 차이가 난다. 단위 테스트를 만들 때 C#의 위저드는 클릭 몇 번이면 끝나지만 C++은... 아무리 언어의 기본적 차이가 있다고 치더라도 Google의 GTest와 비교해보면 MS의 C++ 지원은 업무태만 수준이다.
[33]
Visual Studio에선 '안전하지 않은 코드'를 체크, .csproj 파일을 수정할땐 '<AllowUnsafeBlocks>true</AllowUnsafeBlocks>'를 삽입하면 된다.
[34]
이 함수는
Windows API 사용에도 쓰인다.
[35]
사실 웹 UI 시장에서 실버라이트의 출시가 늦은 편은 아니었다. 하지만 문제는 동시에 출발한 Flex가 웹계의 MS 취급을 받던 Adobe의 물건이었다는 사실.
[36]
다만 유니티 엔진 자체의 런타임은 C++로 돌아간다. 그래서 C#을 DLL로 한 번 번역하고, 이를 다시 C++로 번역하는 2중 컴파일을 거치기 때문에 퍼포먼스의 제약이 있다.
[37]
여러 제약사항과 함께 아직까진 C# 9.0 밖에 지원하지 못한다.
[38]
서드파티에서 사용하는 정식 툴이 아니라 PSN 마켓용 개발 툴을 말한다.
CreateWindow
함수에 의해 만들어진 또 하나의 '윈도우'이다. 하지만 WPF는 CreateWindow를 창에만 사용하고 컨트롤은 DirectX으로 직접 그리기 때문에 WPF의 컨트롤은 윈도우가 아니다. 따라서 Spy++에서 WPF 프로그램은 창만 보이고 컨트롤은 나오지 않는 이유다.
[27]
사실 WPF에서도 코드로도 UI를 만들 수 있다. WPF는 XAML 내용을 해석하여 UI 코드를 만드는 것이기 때문이다.
[28]
물론 블렌드에서는 코드를 짜고, 컴파일 및 실행이 가능하다. 그저 디자인에 불필요한 기능들을 제거한 것뿐이다.
[29]
Windows Forms는 C# 하나만을 사용하는 반면, WPF는 XAML이라는 XML 기반의 마크업 언어로 UI를 작성하기 때문이다. 애니메이션도 역시 XAML로 작성한다.
[30]
JetBrains 사에서 만든 .NET 통합 개발 환경이다.