C#

최근 수정 시각:

위키의 기술적 문제로 인하여 이 문서로 오는 링크를 만들 때는 아래와 같이 입력해야 합니다. 자세한 내용은 이 문서를 참고해 주십시오.

[[C\#]] 또는 [[C##]]

파일:나무위키프로젝트.png
이 문서는 나무위키 프로그래밍 프로젝트에서 다루는 문서입니다.
해당 프로젝트 문서를 방문하여 도움이 필요한 문서에 기여하여 주세요!


using System;

namespace HelloWorld
{
    class Hello
    {
        static void Main()
        {
            Console.WriteLine("Hello, world!");
        }
    }
}

TIOBE에서 선정한 프로그래밍 언어 월간 점유율 순위

[ 펼치기 · 접기 ]

1. Java

2. C

3. C++

4. Python

5. VB .NET

16.139%
+2.37% 증가

14.662%
+7.34% 증가

7.615%
+2.04% 증가

6.361%
+2.82% 증가

4.247%
+1.20% 증가

6. C#

7. PHP

8. JavaScript

9. SQL

10. Objective-C

3.795%
+0.28% 증가

2.832%
-0.26% 감소

2.831%
+0.22% 증가

2.334%
+2.33% 증가

1.453%
-0.44% 감소

2018년 7월 기준이며, 전년 동월 대비 변화 수치이다. 자세한 내용은 TIOBE에서 확인할 수 있으며, 기준은 다음과 같다.


1. 개요
1.1. 이름에 대해
2. 역사3. 특징
3.1. Java와의 관계3.2. 호환성 및 범용성3.3. 모노3.4. .NET Core
4. 버전5. 완성도와 점유율

1. 개요[편집]

2000년 7월 마이크로소프트에서 개발된 객체 지향 프로그래밍 언어. '씨샵' 또는 '씨샾'이라고 읽는다. 1983년에 등장한 C++와 1995년에 등장한 Java에서 강한 영향을 받았다.

1.1. 이름에 대해[편집]

이름의 유래는 두 가지에서 따왔다고 한다.# 첫 번째 의미는 음악에서 유래한 것으로, 도(C)에 반음(#)을 올린 것.[1] MS에서는 출판물 등에서 키보드의 #(원래는 해시 기호) 대신 유니코드의 진짜 반음 올림 기호(, U+266F)를 쓰기도 한다. 두 번째 의미는 많은 사람들이 알고 있듯이 C++ ++라는 뜻이다. ++++을 세로로 쌓으면 시각적으로 # 모양이 되기 때문.

++
++

#


여담으로 초기 이름은 Cool이었다고 한다. 확장자가 .Cool이면 재밌을 것 같다는 이유 등으로 직원들에게 인기 있는 이름이었으나, Cool이라는 단어로는 검색을 하면 다른 것들이 훨씬 많이 나올 것이기 때문에 도중에 바꿨다고. 아니나 다를까 Cool보다도 훨씬 자주 쓰는 동사를 이름으로 가진 프로그래밍 언어는 검색 편의성이 영 좋지 못하다.

2. 역사[편집]

Java가 나오자 MS에서도 썬 마이크로시스템즈와 라이센스를 맺은 뒤 독자적인 Java 확장 언어 비주얼 J++를 만들었다. 그런데 썬에서 개발한 JVM에 MS가 임의로 부가 기능을 추가하면서 썬과 특허권 소송이 걸리는 바람에, MS의 비주얼 스튜디오에서 비주얼 J 시리즈와 MS VM(MS 버추얼머신)을 사용할 수 없게 되었다. 하지만 Java라는 언어 자체가 매력적인 언어이고 MS 역시 이를 버릴 수 없다고 생각한 것인지, 다음 시리즈인 .NET Framework에서 C#이라는 이름으로 새로운 언어를 발표한다.

3. 특징[편집]

3.1. Java와의 관계[편집]

Java가 자바 가상머신이 필요하듯이 C#은 닷넷 프레임워크가 필요하다.[* 닷넷 프레임워크 대신 비교적 작은 사이즈의 가상머신에 올려서 실행시키는 방법도 있다!

3.2. 호환성 및 범용성[편집]

언어적으로는 Java와 유사하지만, MS라는 특정 플랫폼에 강하게 묶여있다는[2] 특성으로 애플Objective-C와 자주 비교가 된다. TIOBE 기준 점유율 측면에서 한때 Objective-C가 C#보다 우위에 있기도 했지만, Objective-C는 Swift의 등장 때문에 점유율이 크게 내려가고 있어 2016년 4월 현재 C#이 Objective-C보다 크게 앞서고 있다. 다만 Swift가 큰 폭으로 오르고 있는 중.#

물론 밑에 서술할 모노 덕분에 Objective-C보다는 범용성이 훨씬 높다. 유니티 엔진의 기본 개발 언어이기도 하다. 크라이엔진도 결국 유니티 엔진에 익숙해진 개발자들을 끌어오기 위해 C# 지원을 시작했다. 언리얼 엔진도 마이크로소프트 소속 개발자들이 제작한[3] MonuUE라는 플러그인을 설치하면 C# 사용이 가능하다. C#으로 안드로이드iOS용 앱, macOSCocoa 기반 프로그램을 개발할 수 있도록 해 주는 Xamarin이라는 프레임워크가 있다. 원래 서드파티 상용 프레임워크였으나, MS가 쇼미더머니를 시전해 MS에 인수되었고, 이후 Visual Studio 2015에 기본 탑재되었다.

비주얼 스튜디오의 확장 프로그램(플러그인) 개발에 쓰이는 언어이기도 하다.

3.3. 모노[편집]

윈도우 이외의 운영체제에서도 C# 사용이 가능하도록 모노라는 프로젝트가 진행 중이다. 아직 그다지 완전하다고 볼 수는 없다. MonoDevelop/Xamarin Studio IDE가 제공되어, 개발도 다른 플랫폼에서 할 수는 있지만 비주얼 스튜디오만큼의 편의성을 제공하지는 못한다.[4]

MS는 오랫동안 오픈소스 진영에 배타적인 태도를 보여 왔고, 닷넷에 공개되지 않은 뭔가, 또는 MS에 특허가 있는 것을 넣어서 MS가 만들지 않은 프레임워크는 대부분의 기존 프로그램(.NET 프레임워크용으로 만든)이 잘 안 돌아가는 무용지물이 되거나, 나중에 특허 소송으로 프로젝트를 아예 개발살낼 가능성을 완전히 배제할 수 없었다. 이 때문에 리처드 스톨먼 등 여러 사람이 'C#과 모노를 써서는 안 된다'고 한 적도 있다. 결국 MS는 2006년 커뮤니티 공약이라는 것을 발표하면서 ECMA 표준에 의한 구현에 대해서는 특허권을 주장하지 않기로 하였다.

하지만, 얼마 지나지 않아 모노의 주 구성 요소 대부분이 저 커뮤니티 공약의 적용 범위에 포함되지 않기 때문에 모노가 아직도 언제든지 특허 소송을 통해 개발살날 수 있다는 것이 밝혀져 모노 위험 요소설이 다시 부상하였다.

그러나 2010년대 이래 MS는 친(親) 오픈소스적인 행보를 보여, 2014년엔 닷넷을 오픈소스로 공개하였으며[5], MS가 모노 프로젝트의 주요 메인테이너인 Xamarin을 인수하면서 이러한 우려는 종식되었다. 그후 MS가 Xamarin 인수 이후 사실상 프로젝트 자체가 MS로 넘어갔다.[6] Git 기여자를 보면 Microsoft 개발자가 대다수다. 2015년 4월 29일에 배포된 Mono 4.0 버전에서는 아예 닷넷의 오픈소스 플랫폼인 .NET Core가 적용되었다.

2017년 5월에 비주얼 스튜디오의 macOS 버전이 공개되어서[7], macOS에서도 정식으로 C# 개발을 할 수 있게 되었다.

자신이 유료 IDE에 돈을 지불할 의향이 있다면 JetBrains의 Rider라는 선택지가 있다. JavaIDE로 유명한 IntelliJ IDEA를 베이스로 하고 있어 리눅스를 포함한 크로스플랫폼이 지원되고 완성도가 높으며, MonoDevelop보다 편리하고 다양한 기능을 제공한다. 또한 유니티 엔진과의 연동도 뛰어나다.

다만, GUI 개발을 위한 Windows Forms나 WPF(Windows Presentation Foundation) 라이브러리는 Windows APIDirectX를 활용하고 있기 때문에 .NET Core에 포함되지 않았다. 크로스플랫폼 GUI 개발 시스템으로는 GTK#이 지원되며, GTK#은 MonoDevelop의 UI 부분에도 사용되었다. 그러나 WPF에 비하면 기능 면에서는 부족한 부분이 많고 참고할 만한 자료 또한 상대적으로 적은 편이다. 현재까지 크로스플랫폼 GUI 개발은 C++ 기반의 Qt가 최선이라고 봐야 한다.

3.4. .NET Core[편집]

위의 모노 문단에서 .NET Core가 짤막하게 언급되었으나, 자세한 내용은 이 문단에서 언급하도록 하겠다.


마이크로소프트가 C#, VB.NET 등 모든 닷넷 프레임워크 기반 언어를 Windows, Linux, Mac 기반에서 돌아가도록 만든
오픈소스 프레임워크이다.

모노와 .NET Core 두 프레임워크 모두 오픈소스 기반이나, 모노의 경우 GTK# 이라는 다중 플랫폼 GUI를 지원한다.
하지만 .NET Core의 경우는 오로지 콘솔 프로그램 개발만을 지원한다는 단점이 있다.
그러나 2019년 초반에 공개 예정인 .NET Core 3.0에서는 GUI를 지원하게 될 것이라는 루머도 돌고 있다.
그리고 만약 .NET Core 3.0에서 GUI를 지원하지 않게 되더라도, 현제 .NET Core 2.0으로 GUI를 구현할 수 있는 오픈소스가 존재한다.
이름은 "Avalonia Framework" 이다. (아쉽게도 Xaml 형식의 디자인만을 지원한다) Avalonia 프레임워크 공식 사이트

4. 버전[편집]

2.0 까지는 ECMA 및 ISO 두 곳 모두에 표준이 등재되어 있으나, 이후 버전은 5.0만이 ECMA 표준이 등재되어 있다.

플랫폼은 .NET Framework 기준이며, .NET Core의 전신이며 전자와 구분이 다른 .NET Standard 표준은 여기에 기재하지 않는다.

버전

플랫폼

표준

출시일

변경사항

1.0

.NET Framework 1.0

ECMA-334

2002년 1월

-

1.1

.NET Framework 1.1

2003년 4월

-

2.0

.NET Framework 2.0

ECMA-334

2005년 11월

[8]

3.0

.NET Framework 2.0~3.5

-

2007년 11월

[9]

4.0

.NET Framework 4.0

-

2010년 4월

[10]

5.0

.NET Framework 4.5

ECMA-334

2012년 8월

[11]

6.0

.NET Framework 4.6

-

2015년 7월

[12]

7.0

.NET Framework 4.7

-

2017년 3월

[13]

5. 완성도와 점유율[편집]

현재는 C# 언어의 점유율도 높은 편이고, 언어의 완성도는 현존하는 언어 중 가장 괜찮다는 평이 많다. Java의 경우 여러가지로 제약이 많아 아쉬운 점을 C#이 덜어주고 있다는 의견도 많다. 코드기어(구 볼랜드)에서 Delphi와 C++Builder를 개발하여 유명해진 Anders Hejlsberg를 영입해 만들었는지라 컴포넌트 개발 환경이 우수하다. 엄청난 생산성을 자랑하던 델파이와 개발환경이 거의 유사하기 때문에 델파이의 개발자들은 거의 C# 개발자로 넘어갔다. 비주얼 스튜디오 6의 비주얼 베이직과 델파이/C++ Builder/C#을 비교해 보면 서로 간에 안드로메다 급으로 차이가 난다. 뿐만 아니라 GUI를 만들 때도 C#(WPF)이 월등히 편리하다.[14] 윈도우즈 개발자들이 UI 작업 이야기 할 때 뭔가 이슈가 있다면 C# 개발자들은 그걸 아주 쉽게 생각한다(구현도 마찬가지). 하지만 C++(특히 MFC) 개발자들은... 그저 야근야근하며 울지요 사실 MFC의 경우 단순히 Win32 API의 래핑수준을 넘지 못하지만, C#의 UI 컴포넌트는 근본 설계부터 컴포넌트 구조를 위해 설계되었으니 당연한 것일지도.

MS사의 개발 도구에서 C#을 강력히 밀어줬는데도 불구하고 2005년 이전까지만 해도 C#의 점유율이 크게 낮았다. 전문가들에게는 C++, 초보자들에게는 VB 6.0에게 밀렸기 때문이다. 하지만 2010년 이후로는 C++의 점유율이 서서히 낮아지고 있는 반면 C#의 점유율은 크게 높아졌다. C#은 강력한 reflection 구조를 갖고 있기 때문에 인텔리센스(자동완성)를 언어 차원에서 지원하므로, 비주얼 스튜디오 2002~2005 버전을 써 본 사람은 C#과 C++의 인텔리센스 기능이 얼마나 차이가 났는지 기억할 것이다.[15]

언어적 특성으로 따지면 경쟁관계에 있는 언어는 Java라고 할 수 있는데, 처음 만들어질 때부터 Java를 많이 참고했으며 Java의 태생적 문제를 모두 해결하고 유용한 기능을 더한 형태이기 때문에 C#이 월등하다고 볼 수 있다. 하지만 이것이 시장성으로 이어지지는 않고 있는데, 많은 솔루션들이 웹으로 컨버전되고 있는 시대적 특성 때문에 웹이 아닌 데스크톱 애플리케이션 분야의 시장이 줄어들고 있기 때문이다. C#도 ASP.NET이라는 웹 언어가 있기는 하지만, JSPPHP 등에 크게 밀리는 상황으로 점유율이 매우 낮다. 특히 .NET Core가 나오기 전까지는 서버 OS가 많은 로열티를 발생시키는 MS Windows로 제한되었다는 점이 낮은 점유율에 크게 일조하였다. 하드웨어 제어나 공장 등 웹으로의 전환이 불가능에 가까운 환경에서는 어느 정도 경쟁력이 있긴 하지만, 닷넷 프레임워크 자체가 워낙 거대한 탓에 잘 선택되지 않는다. 그래도 최근에는 그러한 장비들의 환경 역시 성능이 많이 올라와서 부담이 덜어지고 있다는 것이 그나마 희망이긴 한데, 이쪽은 워낙 구(舊)버전이 유지되는 특성이 강하다 보니 C++와의 경쟁이 쉽지 않다.

  • 기본적으로 C언어포인터 변수를 지원하지 않는다. 다만 unsafe 키워드를 사용하면 C언어 형태의 포인터 변수를 선언하고 사용할 수 있다. 또한 마샬링 계열에서의 사용이나, 윈도우 Handle 오브젝트를 제어하기 위한 IntPtr이라는 포인터 클래스가 선언되어 있다.

  • 웹 애플리케이션 개발용으로는 ASP.NET을 밀어주고 있다. 이는 Java의 JSP에 대응되는 것으로, 기본적인 사항은 거의 비슷하다. 기업에서 주로 쓰고 있으나, 비싼 윈도우 서버(인터넷 정보 서비스)를 비롯한 각종 라이선스 비용 문제 등으로 개인 웹호스팅 쪽은 크게 활성화되지 못했다. 2014년의 .NET 오픈소스화 이후, 오픈소스 ASP.NET 구현체인 ASP.NET Core가 등장했다. macOS리눅스용도 있는 것이 특징이지만...그리 흥하지는 못하고 있다.

  • 또한 플래시의 대항마로 실버라이트를 야심차게 내놓았으나 대차게 망해 버렸다.[16][17] HTML5가 부상하면서, 안 그래도 불안하던 실버라이트의 입지는 사실상 끝나버렸다 봐도 과언이 아니다. MS는 망조가 든 실버라이트를 살리기 위해 Windows Phone 7의 개발 언어로 쓸 수 있게 하는 등 많은 노력을 기울였으나, 그 WP7이 망했다.(...)

  • ECMA와 ISO/IEC 표준으로 지정된 언어이며 C# 6.0 버전부터는 해당되지 않는다.

  • 2012년 들어 처음으로 점유율에서 C++을 추월했다. 다만 C#이 성장한 것보다는 C++의 점유율이 많이 하락한 것으로 보인다. 한때는 넘사벽의 1, 2위(Java, C)의 위치에 닿을 가능성이 가장 높은 언어로 점쳐졌으나, C++이 다시 3위 자리를 탈환하고 그 다음 자리를 Python이 치고 들어오면서 성장세가 주춤하고 있다.

  • 마이크로소프트의 XBOX 개발용 간이(?) 플랫폼인 XNA에 사용되는 언어. C#에 비하면 VB.NET은 더 쉽고, VB.NET마저 싫다면 어도비 에어밖에 방법이 없다.

  • 유니티 엔진의 스크립트 언어로도 쓰인다. 이쪽은 모노 기반. 최신 버전 설치시 GTK C#이 함께 설치된다. 완벽한 GTK C#으로 전환된 것인지는 추가바람. PS Vita의 공개용 게임 개발툴[18]에도 사용된다.


[1] 피아노로 치면 첫 번째 검은 건반에 해당한다.[2] C#에 모노가 있고, Objective-C에 GNUSTEP이 있긴 하지만, 실질적으로 C#은 MS 플랫폼을 벗어나면 거의 안 쓰이고, Objective-C는 애플 플랫폼 외에는 거의 안 쓰인다. 덕분에 메이저 언어 중에서는 사실상 C/C++, Java, Python만이 멀티 플랫폼 언어라 할 수 있다.[3] 마이크로소프트에서 공식적으로 지원하는 것은 아니다.[4] 특히 macOS상에서는 여타 GTK# 개발 프로그램처럼 한글 입력에 문제가 있어 국내 개발자들의 불편을 사고 있다.[5] 관련 문서.[6] 원래의 개발사는 노벨 사(社)이었다 [7] 사실 Xamarin Studio를 MS가 사들인 뒤 UI 디자인과 이름만 바꾼 것이다.[8] 제네릭, 파셜(partial. 한 클래스를 여러 파일로 나눌 수 있는 기능) 타입, 열거자(iterator), nullable, 속성 멤버, 정적 클래스, 대리자(delegate) 추가.[9] 암시적 형식의 로컬변수(var), 객체 및 컬렉션 초기자, 자동구현 속성(get; set; 만으로 getter/setter 메소드가 구현되는 편의 기능), 익명 타입, 확장 메소드(기존 클래스에 확장되는 메소드로, 지정 타입에 메소드처럼 사용은 가능하나 해당 타입의 접근 제한된 멤버는 접근 불가능), 질의 표현식(흔히 아는 Linq의 시초), 람다 식, 표현식 구조, 파셜 메소드 추가.[10] 동적 바인딩(dynamic, 초기화 후에도 다른 타입으로 값을 할당할 수 있는 특징이 있다), 이름있는 선택적 메소드 인자(arguments) 추가.[11] 비동기 메소드(async/await), 호출 정보 특성 추가.[12] Roslyn 기반의 동적 컴파일러, 네임스페이스 정의란에 정적 타입 별칭 정의, 예외 필터, 비동기 try/catch/finally 구문, 자동구현 속성 할당, 읽기 전용 속성 기본값 할당, 멤버에 표현식 지원, 계층형 null 체크, 치환형 문자열 식, nameof 식(주로 멤버 및 타입 등 정의된 명칭을 정확하게 문자열로 표현하는 식), Dictionary 초기자 추가.[13] 추가된 것도 있고 아직 나오지 않은 것도 있지만 일단 예정된 기능으로는 이진값 할당(0b00100 식으로 초기화), 수 구분자(사람이 구분 가능하도록 수를 언더바(_)로 구분되며 컴파일 시 무시된다), 지역 함수(메소드 구문 내 함수 정의 및 사용 가능), switch 문에 타입 구분 추가, 참조형 리턴(return), 튜플 식(4.0부터 추가되었으며 이번 튜플은 단순한 타입이 아닌 식으로 제공된다), out var(기존에는 out 인자에 할당 전 별도로 변수를 선언해야 했으며, 여기서는 메소드 호출 내에 바로 선언이 가능하다), 패턴 매칭, 레코드 타입(단순한 getter/setter 클래스로 간결하게 정의 가능), await 비동기 구문 범용성 강화 기능 추가.[14] 언어 디자이너인 Anders Hejlsberg가 뛰어난 개발 생산성을 자랑하는 델파이 개발환경에서 좋은 점만을 골라서 가져왔다.[15] 개발툴 수준에서 C#을 얼마나 밀어주는지는 단순히 위저드만 봐도 차이가 난다. 단위 테스트를 만들 때 C#의 위저드는 클릭 몇 번이면 끝나지만 C++은... 아무리 언어의 기본적 차이가 있다고 치더라도 Google의 GTest와 비교해보면 MS의 C++ 지원은 업무태만 수준이다.[16] 사실 웹 UI 시장에서 실버라이트의 출시가 늦은 편은 아니었다. 하지만 문제는 동시에 출발한 Flex가 웹계의 MS 취급을 받던 Adobe의 물건이었다는 사실.[17] 한국에선 대표적으로 아프리카TV가 실버라이트로 구현되어 있다.[18] 서드파티에서 사용하는 정식 툴이 아니라 PSN 마켓용 개발툴.