C샵
using System;
class MainClass {
public static void Main (string[] args) {
Console.WriteLine ("You're watching NeWiki.");
}
}
C#[1]
마이크로소프트에서 내놓은 프로그래밍 언어로, #의 의미는 두 가지가 있다.
- 음악 기호로서 #은 반음 올린다(augmented, 증강)는 의미를 가지고 있다. 즉 C를 증강시켰다는 의미를 가지고 있다.
- #을 쪼개 보면 ++++가 된다. 즉 C++보다 더욱 더 진보된 언어라는 의미를 가지고 있다.
원래 MS는 자바를 윈도우 운영체제에서 돌릴 수 있는 J++이라는 것을 만든 적이 있었다. 윈도우 API에 접근해서 네이티브 프로그램을 만들 수 있는 기능을 지원했는데, 당시 소유권을 가지고 있던 선마이크로시스템즈에서는 자바의 플랫폼 독립이라는 특성을 훼손한 MS에게 소송을 걸어버렸고 결국 J++을 포기한 MS가 .NET 프레임워크를 내놓으면서 아예 새로 만든 것이 C#이다.
자바의 단점을 여러 가지로 개선시켰기 때문에 프로그래밍 언어 자체로 보면 장점이 많다. 한편으로는 자바 이후의 객체지향 언어들이 자바의 특징을 많이 이어받았기 때문에 C++의 개념을 많이 받은 C#는 차이점을 보이는데, 예를 들면 자바 계열 언어는 클래스 메소드가 기본적으로 오버로딩을 할 수 있고 메소드를 정의할 때 final 키워드를 줘야 오버로딩을 막을 수 있는 것과는 반대로 C#는 C++처럼 오버로딩이 기본적으로는 안 되고 메소드에 virtual 키워드를 줘야 오버로딩을 할 수 있다. 자바 프로그래머들에게는 미묘한 차이 때문에 헷갈리는 부분도 꽤 있지만 둘 다 알고 보면 C++를 조상으로 하고 있는지라 공통점이 훨씬 더 많아서 자바 프로그래머라면 C# 배우기가 어렵지 않고 그 반대도 마찬가지다.
C++ 프로그래머라면 좀 더 친숙한 부분이 많고, 특히 좀 더 편하게 프로그래밍 할 수 있다. 무엇보다도 가비지 컬렉션 기능을 기본 지원하므로 C++ 프로그래머들을 가장 괴롭히는 메모리 할당/반환 문제에서 해방될 수 있다. 예를 들어 C++라면 new 키워드로 새로운 클래스 객체를 만들었다면 더 이상 사용하지 않을 때 delete로 이를 해제해 주어야 한다. 클래스 안에서 새로운 메모리 할당이 있었다면 이 역시 해제해 줘야 한다. 그래서 C++에서는 소멸자 활용이 무척 중요했다.[2] 반면 C#에서는 가비지 컬렉터가 알아서 해제해 주므로 뒷일 생각 안하고 객체를 마음껏 만들어도 된다.[3] 반면 만악의 근원인 포인터 연산은 C++처럼 써먹을 수 있다. 다만 이 기능을 쓰려면 unsafe 키워드로 지정해 주고 /unsafe 옵션으로 컴파일 해야 한다. 옵션의 이름에서 알 수 있는 것처럼 포인터 연산은 unsafe, 즉 안전하지 않으므로 안 쓸 수 있다면 안 쓰는 게 당연히 좋다. unsafe 옵션을 써야 할 정도로 포인터 연산까지 필요한 프로그램이라면 아마도 C#보다는 결국은 C/C++를 쓰겠지만.
MS라는 곳이 워낙에 오픈 소스에 대해 적대감이 많았고 MS 기술은 거의가 윈도우에서만 쓸 수 있었기 때문에 C# 역시 윈도우 전용 언어였다.[4] 이런 점에서는 애플 운영체에 묶여 있는 오브젝티브C나 스위프트와 비슷한 처지라 할 수 있다. 하지만 모노 프로젝트를 통해 .NET 프레임워크를 리눅스에서 쓸 수 있는 길이 열리면서 C#도 윈도우 감옥에서 벗어났고, 모노 프로젝트가 자마린으로 발전하면서 이제는 안드로이드, iOS, 윈도우 모바일까지 같이 지원하는 언어가 되어서 새롭게 조명을 받고 있다. 게다가 최근 MS가 오픈 소스를 포용하고 적극 활용하는 쪽으로 정책을 180도 바꾸면서 원래 유료였던 자마린까지 무료는 물론이고 아예 오픈 소스로 풀어버렸기 때문에 더더욱 관심이 커지고 있는 상태다. 아직까지 모바일 크로스플랫폼 개발 언어로는 자바스크립트가 널리 쓰이고 있지만 자마린의 성장세도 무시할 수 없는 수준이었으나... 리액트 네이티브에 Flutter까지 등장해서 많이 위축되긴 했다. 역시 MS는 모바일은 안 되나 봐... 자세한 내용은 자마린 항목 참조.
각주
- ↑ 미디어위키에서는 제목에 # 기호를 쓰면 표제어의 하부 섹션을 뜻하는 것으로 해석되기 때문에 표제어에 #를 쓰지 못한다. 그래서 표제어를 'C샵'으로 쓴 것. 표준 표기법으로는 C샤프가 맞지만 C샵이 워낙에 널리 퍼진지라...
- ↑ 다만 스마트 포인터 기능을 사용하면 delete를 사용하지 않아도 사용이 끝난 포인터가 해제되므로 한결 낫다.
- ↑ 다만 파일이나 데이터베이스 연결과 같은 자원을 새로 받았을 때는 다 쓰고 나서 빨리 해제하는 문제를 생각해 줘야 한다. 나중에 처리될 수도 있지만 가비지 컬렉터가 그 정도까지는 못할 수도 있는 데다가 이들 자원에는 그 수가 제한되어 있으므로 빨리 소진되어 오류를 일으키는 원인이 되기 때문이다. C#에서는 using을 잘 사용하면 간편하게 처리할 수 있다.
- ↑ 정확히는 C#은 .NET 프레임워크에 묶여 있는 언어였고 .NET이 윈도우 전용이었기 때문이다.