최근 수정 시각 : 2024-12-11 15:37:31

C#

파일:하위 문서 아이콘.svg   하위 문서: C#/문법
,
,
,
,
,
#!wiki style="display: inline; display: none;"
, }}}
[include(틀:링크시 주의, 링크=C\ 또는 # 또는 C#)]
C# 관련 틀
[ 펼치기 ㆍ 접기 ]

[[컴퓨터공학|컴퓨터 과학 & 공학
Computer Science & Engineering
]]
[ 펼치기 · 접기 ]
||<tablebgcolor=#fff,#1c1d1f><tablecolor=#373a3c,#ddd><colbgcolor=#0066DC><colcolor=white> 기반 학문 ||수학(해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학(환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학(형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학 ||
하드웨어 구성 SoC · CPU · GPU(그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품
기술 기계어 · 어셈블리어 · C/C++ · C# · Java · Python · BIOS · 절차적 프로그래밍 · 객체 지향 프로그래밍 · 해킹 · ROT13 · 일회용 비밀번호 · 사물인터넷 · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시(SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화 · 하드웨어 가속
연구

기타
논리 회로(보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 운영 체제 · 데이터베이스 · 프로그래밍 언어{컴파일러(어셈블러 · JIT) · 인터프리터 · 유형 이론 · 파싱 · 링커 · 난해한 프로그래밍 언어} · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩(유니코드 · MBCS) · 네트워크 · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도(최적화) · 소프트웨어 개발 방법론 · 디자인 패턴 · 정보처리이론 · 재귀 이론 · 자연어 처리(기계 번역 · 음성인식) · 버전 (버전 관리 시스템 · Git · GitHub)

파일:Microsoft 로고.svg파일:Microsoft 로고 화이트.svg
{{{#!wiki style="margin:0 -10px -5px; min-height:calc(1.5em + 5px); word-break:keep-all"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin:-6px -1px -11px"
<colbgcolor=#393939,#737373><colcolor=#fff>제품군
하드​웨어Surface · Xbox · HoloLens · PixelSense · Zune · Pluton · IVAS
소프트​웨어Windows · Office · Edge · Media Player · Hyper-V · Defender · Visual Studio Code · Visual Studio · Windows Terminal · Microsoft Store · Xbox App · PowerToys · Internet Explorer · MS-DOS · Windows Movie Maker · Autoruns · Clipchamp
서비스Microsoft Azure · OneDrive · Microsoft Copilot · Bing · LinkedIn · Microsoft Docs · Skype · MSN · 정품인증 · Xbox Game Pass · Xbox Cloud Gaming · Xbox network
관련 기술ASF · ASP · Blazor · COM · DCOM · DirectX · 파일 시스템(FAT · NTFS · ReFS) · MFC · .NET(.NET Core · .NET Standard · C# · F# · Visual Basic .NET · Windows Forms · WPF · UWP · .NET MAUI · ASP.NET · ML.NET) · OLE · Q# · Silverlight · Visual Basic · VBA · WASAPI · Windows 커널 · Windows 디자인 · Windows API · Windows Runtime(UWP · WinUI 3) · WMA · WMV · Xamarin · XNA · 하복 엔진 · SAMI · PowerShell · Windows Modern Standby
산하 계열사 및 사업부GitHub · .NET Foundation · Microsoft Gaming · LinkedIn
관련 인물빌 게이츠(은퇴) · 폴 앨런(은퇴) · 스티브 발머(퇴사) · 게이브 뉴웰(퇴사) · 마이크 이바라(퇴사)
사티아 나델라 · 필 스펜서 · 브래드 스미스
기타제니맥스 미디어 인수 · 액티비전 블리자드 인수 · 시작 메뉴 · 빌 게이츠의 굴욕
관련 틀365 제품군 · 하드웨어 제품군 · Surface 제품군 · Windows 제품군}}}}}}}}}

프로그래밍 사이트 선정 프로그래밍 언어 순위 목록
{{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all"
{{{#!wiki style="display: inline-table; min-width: 25%; min-height: 2em;"
{{{#!folding [ IEEE Spectrum 2024 ]
{{{#!wiki style="margin: -5px 0"
<rowcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 직업 부문 상위 10개 프로그래밍 언어
1 Python 1 SQL
2 Java 2 Python
3 JavaScript 3 Java
4 C++ 4 TypeScript
5 TypeScript 5 SAS
6 SQL 6 JavaScript
7 C# 7 C#
8 Go 8 HTML
9 C 9 Shell
10 HTML 10 C++
}}}
}}}
}}}
[ Stack Overflow 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=#FFA500><tablebgcolor=#fff,#222> 2024년 Stackoverflow 설문조사 기준 인기 상위 25개 프로그래밍 언어 ||
1 JavaScript 14 Rust
2 HTML, CSS 15 Kotlin
3 Python 16 Lua
4 SQL 17 Dart
5 TypeScript 18 어셈블리어
6 Bash 19 Ruby
7 Java 20 Swift
8 C# 21 R
9 C++ 22 Visual Basic
10 C 23 MATLAB
11 PHP 24 VBA
12 PowerShell 25 Groovy
13 Go
[ TIOBE 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=deepskyblue><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 MATLAB
2 C++ 12 Delphi / Object Pascal
3 C 13 PHP
4 Java 14 Rust
5 C# 15 Ruby
6 JavaScript 16 Swift
7 SQL 17 Assembly language
8 Visual Basic 18 Kotlin
9 Go 19 R
10 Fortran 20 Scratch
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px);"
{{{#!folding [ 21위 ~ 50위 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
21 COBOL 36 Scala
22 Classic Visual Basic 37 Transact-SQL
23 LISP 38 PL/SQL
24 Prolog 39 ABAP
25 Perl 40 Solidity
26 (Visual) FoxPro 41 GAMS
27 SAS 42 PowerShell
28 Haskell 43 TypeScript
29 Dart 44 Logo
30 Ada 45 Wolfram
31 D 46 Awk
32 Julia 47 RPG
33 Objective-C 48 ML
34 VBScript 49 Bash
35 Lua 50 Elixir
}}}}}}}}} ||
[ PYPL 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=green><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 Objective-C
2 Java 12 Go
3 JavaScript 13 Kotlin
4 C# 14 MATLAB
5 C/C++ 15 PowerShell
6 R 16 VBA
7 PHP 17 Dart
8 TypeScript 18 Ruby
9 Swift 19 Ada
10 Rust 20 Lua

}}} ||
프로그래밍 언어 목록 · 분류 · 문법

TIOBE 선정 올해의 프로그래밍 언어 / C#
{{{#!folding [펼치기 / 접기] 2022년
C++
2023년
C#
미정
}}} ||


<colcolor=#67217A,#A179DC> C#
파일:C# 로고.svg
개발 Microsoft
버전 13(2024년 11월 업데이트)
파일:홈페이지 아이콘.svg | 파일:GitHub 아이콘.svg파일:GitHub 아이콘 화이트.svg
1. 개요2. 명칭3. 역사4. 문법5. 특징
5.1. Java와의 비교5.2. 호환성 및 범용성5.3. .NET Native AOT5.4. 모노5.5. .NET Core5.6. Windows Forms vs WPF
6. 라이브러리7. 통합 개발 환경(IDE)8. 완성도와 점유율9. 학습
9.1. 도서9.2. 웹사이트9.3. 위키독스9.4. 유튜브
10. 기타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. 문법

파일:상세 내용 아이콘.svg   자세한 내용은 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#으로 AndroidiOS용 앱, macOSCocoa 기반 프로그램을 개발할 수 있도록 해 주는 Xamarin이라는 프레임워크가 있다. 원래 서드파티 상용 프레임워크였으나, MS에 인수되었고, 이후 Visual Studio 2015에 기본 탑재되었다.

이렇게 MS가 노선을 바꾸면서 C#의 지원범위는 점점 늘어나서 리눅스[20]와 임베디드[21] 분야까지 섭렵 가능한 매우 넓은 분야를 커버할 수 있는 언어가 되었다.

UI 쪽으로도 C#을 필두로 MAUI를 지원하면서 IOS, Android까지 크로스플랫폼이 가능해 졌으므로 이전에 존재하던 제약들이 많이 사라졌다.

Visual Studio의 확장 프로그램(플러그인) 개발에 쓰이는 언어이기도 하다.

5.3. .NET Native AOT

파일:상세 내용 아이콘.svg   자세한 내용은 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에 돈을 지불할 의향이 있다면 JetBrainsRider라는 선택지가 있다. JavaIDE로 유명한 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 계열
  • 비 MS 계열
    • Avalonia UI - 한때는 .NET 재단이 관리하던 때가 있었으나 2024년 기준으로 닷넷 제단과의 협력에서 벗어나 별개의 프로젝트로 운영된다.
    • Uno Platform - Avalonia UI와 비슷하다.

7. 통합 개발 환경(IDE)

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. 도서

9.2. 웹사이트

9.3. 위키독스

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으로 넘어갈 의향이 없고, 최신 기술에 민감한 회사들은 쉽고 간편하게 웹 애플리케이션을 만들 수 있는 ExpressDjango, 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] 여기서 윈도우(운영체제 이름이 아닌 '창'을 의미)는 창뿐만 아니라 컨트롤도 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 통합 개발 환경이다. 게임 아니다크로스플랫폼을 지원하며, 비영리용으로 무료로 쓸수 있다.[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 마켓용 개발 툴을 말한다.