지난번에 CodeProject가 문을 닫았다는 글을 쓰면서 옛날 생각이 많이 났습니다.
그때 제가 CodeProject에서 가장 많이 찾아본 게 C# 관련 글이었어요. 그래서 오늘은 제가 좋아하는 언어 이야기를 좀 해볼까 합니다.
C#은 올해로 스물세 살입니다. 그 사이에 "자바 짝퉁"이라는 소리도 듣고, 윈도우에 갇혀 있다는 소리도 들었는데 지금은 둘 다 옛말이 됐습니다.
C#은 소송 때문에 태어났습니다
이 이야기를 알고 나면 C#이 왜 자바랑 그렇게 닮았는지 이해가 됩니다.

C#이 만들어지기까지 — 1996년부터 2002년까지
1996년에 마이크로소프트가 앤더스 헤일스버그라는 사람을 데려옵니다. 터보 파스칼과 델파이를 만든 사람이에요. 델파이 써보신 분들은 아실 텐데, 그 시절 윈도우 개발 도구 중에 정말 잘 만든 물건이었습니다.
그런데 이 사람이 마이크로소프트에서 처음 맡은 일이 자바 도구였습니다. Visual J++라고, 마이크로소프트가 만든 자바 개발 환경이었어요.
문제는 마이크로소프트가 여기에 윈도우 전용 기능을 슬쩍 넣었다는 겁니다. 자바의 "한 번 짜면 어디서나 돈다"는 약속을 깨는 짓이었죠. 썬 마이크로시스템즈가 1997년에 소송을 겁니다.
2001년에 썬이 이겼고, 마이크로소프트는 자바에서 완전히 손을 뗍니다. 그런데 자바를 못 쓰게 되니까 오히려 언어를 직접 만들 이유가 생긴 겁니다.
목표는 "VB만큼 생산적이면서 C++만큼 강력한 언어"였습니다. 초기 이름은 Cool이었다고 해요. 그대로 갔으면 지금 우리는 "쿨 개발자"라고 불렸을지도 모르겠네요. ^^
그렇게 2002년에 C# 1.0이 .NET Framework와 함께 나왔습니다. 자바 도구를 만들던 팀이 만들었으니 문법이 자바를 닮은 건 당연한 일이었고, 그래서 한동안 "자바 짝퉁"이라는 소리를 들었습니다.
그런데 짝퉁이 원본을 앞지르기 시작합니다
C#이 재밌는 건 버전마다 성격이 확 달라진다는 점입니다. 그냥 문법 설탕만 바른 버전도 있지만, 코드 짜는 방식 자체를 바꿔버린 버전이 세 번 있었습니다.

C# 주요 버전과 기능 (2002~2025)
2005년 C# 2.0의 제네릭이 첫 번째였습니다. 그전에는 ArrayList에 아무거나 집어넣고 꺼낼 때마다 캐스팅을 했어요. 실수로 다른 타입을 넣어도 컴파일은 잘 되고, 실행하다가 터졌습니다. 제네릭이 들어오면서 그 고생이 끝났습니다.
2007년 C# 3.0의 LINQ는 지금 봐도 대담한 결정이었다고 생각합니다. 컬렉션을 SQL처럼 다루겠다는 발상이었는데, 처음 봤을 때 "이게 언어 문법이라고?" 싶었어요.
var 성인 = 사람들.Where(p => p.나이 >= 20)
.OrderBy(p => p.이름)
.Select(p => p.이름);
지금은 자바 스트림이나 자바스크립트 배열 메서드로 다들 익숙하지만, 2007년에 이걸 언어에 넣은 건 C#이 먼저였습니다.
2012년 C# 5.0의 async / await가 세 번째입니다. 개인적으로는 이게 제일 크다고 봅니다. 비동기 코드를 동기 코드처럼 쓸 수 있게 만들었는데, 이 문법이 너무 잘 만들어져서 나중에 자바스크립트, 파이썬, 러스트가 거의 그대로 가져갑니다.
요즘 JS에서 await 쓰시는 분들 많으시죠. 그 문법의 원조가 C#입니다.
진짜 약점은 문법이 아니라 윈도우였습니다
사실 C#은 언어 자체로는 일찍부터 좋았습니다. 문제는 다른 데 있었어요.
윈도우에서만 돌아간다는 것이었습니다.
서버가 리눅스로 넘어가던 시기였는데 C#으로 짠 건 윈도우 서버에 올려야 했습니다. 라이선스 비용도 비용이고, 리눅스가 표준인 판에서 혼자 다른 길을 가는 셈이었죠. 그래서 언어는 좋은데 선택하기 어렵다는 말을 많이 들었습니다.

.NET의 분화와 통합 (2002~2020)
커뮤니티가 Mono라는 걸 만들어서 리눅스와 맥에서 돌리긴 했습니다. 다만 공식이 아니다 보니 기능이 늦게 따라오고, 미묘하게 다르게 동작하는 부분도 있었어요. 나중에 이 Mono가 Unity와 Xamarin의 바탕이 됩니다.
그러다 2016년에 마이크로소프트가 결단을 내립니다. .NET Core를 밑바닥부터 새로 만들고 오픈소스로 공개한 거예요. 처음부터 리눅스와 맥을 지원하는 물건이었습니다.
같은 해에 Mono를 만들던 Xamarin을 인수하면서, 흩어져 있던 구현들이 한 지붕 아래로 모입니다.
그리고 2020년 11월에 .NET 5가 나오면서 이름에서 Core가 빠집니다. 이제 그냥 .NET 하나예요. 윈도우든 리눅스든 맥이든 iOS든 안드로이드든 같은 코드로 겨냥합니다.
20년 걸려서 자기 발목을 스스로 푼 셈입니다. 지금 C#으로 리눅스 서버 짜는 건 아무 일도 아니죠.
안 죽고 살아남은 이유
비슷한 시기에 나왔다가 사라진 언어가 많습니다. C#이 살아남은 이유를 생각해보면 두 가지인 것 같아요.
하나는 계속 바뀌었다는 겁니다. 제네릭, LINQ, async/await, 패턴 매칭, nullable 참조 형식, record까지. 20년 넘게 매번 새 버전을 내면서 문법을 계속 손봤습니다. 오래된 언어인데 최신 언어 문법을 대부분 갖고 있어요.
다른 하나는 자기 약점을 인정했다는 겁니다. 윈도우 전용이라는 게 발목을 잡는다는 걸 알고, .NET Framework를 사실상 버리고 새로 만들었습니다. 자기 자산을 버리는 결정이라 쉽지 않았을 텐데 그걸 했어요.
지난 글에서 CodeProject가 갖고 있던 기술 자료를 AI로 살리지 못하고 문을 닫았다고 썼는데, 비교해보면 대비가 뚜렷합니다. 한쪽은 자산을 붙잡고 있다가 사라졌고, 한쪽은 자산을 버리고 살아남았습니다.
남는 이야기
요즘 저는 안드로이드 앱을 만들고 있어서 C#을 쓸 일이 많지는 않습니다. 그래도 가끔 코드를 보면 반갑습니다.
소송에 져서 자바를 못 쓰게 된 회사가 홧김에 만든 언어가, 스물세 해 뒤에도 매년 새 버전을 내고 있다는 게 재밌지 않나요. 게다가 그 언어가 만든 async / await를 지금은 다른 언어들이 다 따라 쓰고 있고요.
혹시 C# 안 써보신 분이 계시다면 한번 구경해보시길 권합니다. 요즘은 맥에서도 dotnet 명령 하나로 시작할 수 있어요. 20년 전에 비하면 정말 좋은 세상입니다. ^^
'IT소식' 카테고리의 다른 글
| CodeProject가 사라졌습니다 (1999~2026), 그리고 개발자가 검색하지 않게 된 이야기 (0) | 2026.09.04 |
|---|---|
| 이더넷에 베팅하면 안 되는 이유 (0) | 2023.03.18 |
| 휴대폰이 당신을 염탐할 때 일어나는 일 (0) | 2023.03.18 |
| 업무용 개인비서 Microsoft 365 Copilot 소개 (0) | 2023.03.18 |
| 새로운 iPhone 14 및 iPhone 14 Plus 출시 (0) | 2023.03.16 |