C#

최근 수정 시각:

이 문서로 오는 링크를 만들 때는 [[C\#]] 또는 [[C##]]을(를) 사용해야 합니다. 자세한 내용은 이 문서를 참고해 주세요.

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

TIOBE에서 선정한 프로그래밍 언어 월간 점유율 순위 (2018년 4월 기준)

1. Java

2. C

3. C++

4. Python

5. C#

15.777%
0.21% 증가

13.589%
6.62% 증가

7.218%
2.66% 증가

5.803%
2.35% 증가

5.265%
1.69% 증가

6. Visual Basic .NET

7. PHP

8. JavaScript

9. SQL

10. Ruby

4.947%
1.70% 증가

4.218%
0.84% 증가

3.492%
0.64% 증가

2.650%
2.65% 증가

2.018%
0.29% 감소

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




using System;

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


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

1. 개요[편집]

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

1.1. 이름에 대해[편집]

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

++
++

#


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

2. 역사[편집]

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

3. 특징[편집]

3.1. Java와의 관계[편집]

실질적으로 언어의 구조를 보면 기본 구조가 Java와 유사하다. C++의 형식과 Java의 기본 틀이 합쳐진 구조이며 양쪽의 장점만을 흡수했다는 평가를 받는 편이다. 애초에 C# 프로젝트의 핵심인물이었던 Anders Hejlsberg의 목표가 "현대적인 개발언어의 장점을 취합"한 언어를 만드는 것이었으니...

대략 C#과 Java의 관계를 보면, C++와 C가 하는 거의 모든 걸 할 수 있으면서 거기 더해서 수많은 기능들을 넣은 것과 비슷한 루트를 따라가고 있다. 초창기에는 C#이 Java를 쫓아가는 모양새였으나, 현재 C#은 오만가지 기능들을 탑재해서 기능 면에서는 Java를 큰 차이로 앞서가고 있다. 그리고 덕분에 C++가 과거 받았던 비판들, "배우기가 점점 어려워진다"는 이야기가 솔솔 나오고 있다. 하지만, 일단 배워 놓고 보면[2] 사용성에 있어서만큼은 현존 최강의 언어 중 하나라고 볼 수 있다.

Java가 자바 가상머신이 필요하듯이 C#은 닷넷 프레임워크가 필요하다.[3] Java가 단일 언어 다중 플랫폼(윈도우, 리눅스, 유닉스 등)이라면, .NET 프레임워크는 다중 언어(VB, C++, C#, J# 등) 단일 플랫폼이다.[4] 허나 Java는 Clojure, Scala, Kotlin 등등 JVM을 사용하는 다른 언어가 나오면서, 닷넷 프레임워크는 Windows RT가 등장하면서 모두 옛말이 되어버렸다. 지금은 둘 다 다중 언어 다중 플랫폼.(...)

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

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

물론 밑에 서술할 모노 덕분에 Objective-C보다는 범용성이 훨씬 높다. 단 Windows Forms나 WPF는 오픈소스 구현이 완전하지 못하기 때문에[6], GUI 프로그램은 대부분 GTK# 같은 서드파티 GUI 라이브러리를 사용한다. 유니티 엔진의 기본 개발 언어이기도 하다. 크라이엔진도 결국 유니티 엔진에 익숙해진 개발자들을 끌어오기 위해 C# 지원을 시작했다.

C#으로 안드로이드iOS용 앱, macOSCocoa 기반 프로그램을 개발할 수 있도록 해 주는 Xamarin이라는 프레임워크가 있다. 원래 서드파티 상용 프레임워크였으나, MS가 쇼미더머니를 시전해 MS에 인수되었고, 이후 Visual Studio 2015에 기본 탑재되었다.

3.3. 모노[편집]

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

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

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

그러나 2010년대 이래 MS는 친(親) 오픈소스적인 행보를 보여, 2014년엔 닷넷을 오픈소스로 공개하였으며[8], MS가 모노 프로젝트의 주요 메인테이너인 Xamarin을 인수하면서 이러한 우려는 종식되었다. 그후 MS가 Xamarin 인수 이후 사실상 프로젝트 자체가 MS로 넘어갔다.[9] Git 기여자에서 보면 Microsoft 개발자가 대다수다.

2015년 4월 29일에 배포된 Mono 4.0 버전에서는 아예 닷넷의 오픈소스 코드(.NET Core)가 적용되었다.

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

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월

[11]

3.0

.NET Framework 2.0~3.5

-

2007년 11월

[12]

4.0

.NET Framework 4.0

-

2010년 4월

[13]

5.0

.NET Framework 4.5

ECMA-334

2012년 8월

[14]

6.0

.NET Framework 4.6

-

2015년 7월

[15]

7.0

.NET Framework 4.7

-

2017년 3월

[16]

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

현재는 C# 언어의 점유율도 높은 편이고, 언어의 완성도는 현존하는 언어 중 가장 괜찮다는 평이 많다. Java의 경우 여러가지로 제약이 많아 아쉬운 점을 C#이 덜어주고 있다는 의견도 많다. 코드기어(구 볼랜드)에서 Delphi와 C++Builder를 개발하여 유명해진 Anders Hejlsberg를 영입해 만들었는지라 컴포넌트 개발 환경이 우수하다. 엄청난 생산성을 자랑하던 델파이와 개발환경이 거의 유사하기 때문에 델파이의 개발자들은 거의 C# 개발자로 넘어갔다. 비주얼 스튜디오 6의 비주얼 베이직과 델파이/C++ Builder/C#을 비교해 보면 서로 간에 안드로메다 급으로 차이가 난다. 뿐만 아니라 GUI를 만들 때도 C#이 월등히 편리하다.[17] 윈도우즈 개발자들이 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++의 인텔리센스 기능이 얼마나 차이가 났는지 기억할 것이다.[18]

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

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

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

  • 또한 플래시의 대항마로 실버라이트를 야심차게 내놓았으나 대차게 망해 버렸다.[19][20] 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의 공개용 게임 개발툴[21]에도 사용된다.


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