C#("C 샤프"로 읽음)은 Anders Hejlsberg가 이끄는 Microsoft 팀이 설계해 2002년에 처음 공개한 범용 프로그래밍 언어입니다. 정적 타입(모든 변수에 타입이 있고 프로그램 실행 전에 컴파일러가 검사), 객체 지향(코드를 클래스로 구성), 관리형(가비지 컬렉터가 메모리를 해제) 언어입니다. 최신 C#은 함수형 프로그래밍에서도 많은 것을 가져왔습니다: 람다, LINQ 쿼리, 패턴 매칭, 불변 레코드가 그렇습니다.
완전한 C# 프로그램입니다. 실행을 눌러 보세요:
출력:
Hello, Ada! It is 2026.
C#은 어디에 쓰이나
C#은 범용 언어라서 대부분의 소프트웨어 분야에서 볼 수 있지만, 주로 쓰이는 분야는 몇 가지로 정리됩니다:
- 게임. 가장 널리 쓰이는 게임 엔진 중 하나인 Unity의 스크립트 언어가 C#입니다. Godot도 C#을 지원합니다.
- 웹 백엔드. ASP.NET Core는 API, 웹사이트, 실시간 앱을 위한 .NET 웹 프레임워크입니다. 공개 벤치마크에서 가장 빠른 주류 웹 프레임워크 중 하나입니다.
- 데스크톱 앱. Windows에서는 WPF와 Windows Forms, 크로스 플랫폼에서는 .NET MAUI와 Avalonia를 씁니다.
- 클라우드와 서비스. Azure Functions, 백그라운드 워커, 컨테이너 기반 마이크로서비스.
- 도구와 자동화. 커맨드라인 도구, 빌드 스크립트, 데이터 처리.
특히 Microsoft 기술로 운영되는 기업과 게임 스튜디오에서 흔합니다. .NET MAUI(Xamarin의 후속)로 모바일 앱도 만들 수 있지만, Kotlin이나 Swift에 비하면 작은 영역입니다.
C#과 .NET은 같은 것이 아닙니다
C#은 언어입니다. .NET은 C#을 실행하는 플랫폼이며 세 부분으로 이루어져 있습니다:
- 런타임(CLR). C# 컴파일러는 기계어를 만들지 않습니다.
.dll이나.exe파일에 저장되는 중간 언어(IL)를 만듭니다. 프로그램이 실행되면 공용 언어 런타임(CLR)이 그 IL을 JIT(Just-In-Time) 방식으로 네이티브 코드로 컴파일하고, 가비지 컬렉터로 메모리를 관리하며, 타입 안전성을 보장합니다. - 기본 클래스 라이브러리. 컬렉션, 파일 접근, 네트워킹, 텍스트, 날짜, 스레딩:
System.*아래의 모든 것입니다. - SDK. 프로젝트를 만들고, 빌드하고, 테스트하고, 실행하는
dotnet명령입니다.
다른 언어(F#, Visual Basic)도 같은 IL로 컴파일되므로, C# 프로그램에서 F#으로 작성된 라이브러리를 사용할 수 있습니다.
플랫폼에는 두 세대가 있습니다. .NET Framework(2002년 1.0부터 4.8.1까지)는 Windows 전용이며 지금도 많은 기존 애플리케이션을 실행합니다. .NET(버전 5 이전 이름은 .NET Core)은 오픈 소스 크로스 플랫폼 후속작으로 Windows, Linux, macOS에서 실행됩니다. 새 작업은 .NET을 대상으로 하며, .NET 8이나 .NET 10 같은 짝수 버전은 3년간 장기 지원(LTS)을 받습니다.
C# 프로그램의 구조
C# 프로그램은 멤버(필드, 속성, 메서드)를 담은 타입(클래스, 구조체, 인터페이스, 열거형, 레코드)으로 이루어집니다. 실행은 Main이라는 정적 메서드에서 시작합니다. 네임스페이스는 관련 타입을 묶고, using 지시문을 쓰면 짧은 이름으로 타입을 가리킬 수 있습니다.
출력:
Maya: 21.00
Leo: 13.00
벌써 몇 가지가 보입니다. Order는 두 개의 속성(Customer, Total), 생성자, 메서드를 가진 클래스입니다. decimal은 금액용 타입이고, m 접미사는 decimal 리터럴을 뜻합니다. var는 컴파일러가 지역 변수의 타입을 추론하게 하고, List<Order>는 Order 객체만 받는 제네릭 컬렉션입니다. $"..." 안의 {order.Total:F2}는 숫자를 소수 둘째 자리까지 서식화합니다.
실제 프로젝트에서는 보통 클래스마다 파일을 따로 두고, 파일들을 함께 컴파일해 하나의 어셈블리를 만듭니다. 자세한 내용은 클래스와 객체를 참고하세요.
실제로 보는 정적 타입
컴파일러는 모든 식의 타입을 알고 있으므로, 많은 종류의 실수가 실행 중인 프로그램까지 가지 않습니다. int에 문자열을 대입하거나, 존재하지 않는 메서드를 호출하거나, 인수를 잘못된 순서로 넘기면 컴파일 시점에 해당 줄을 가리키는 오류로 실패합니다.
출력:
29.97
45
타입은 편집기 기능에도 쓰입니다. 자동 완성, 이름 바꾸기, "모든 참조 찾기"가 C#에서 정확한 이유는 도구가 컴파일러와 같은 타입 정보를 읽기 때문입니다.
C# 버전과 추가된 기능
2020년 C# 9 이후로는 매년 11월 새 .NET 릴리스와 함께 새 버전이 나옵니다. 그 전에는 2~3년마다 버전이 나왔습니다. 각 버전은 기존 코드가 계속 컴파일되도록 설계되고, 드문 예외(C# 14에서 속성 접근자 안의 field가 키워드가 된 것 등)는 호환성이 깨지는 변경으로 문서화되므로, C# 2용으로 작성한 프로그램은 오늘날에도 거의 항상 그대로 컴파일됩니다.
| 버전 | 연도 | 주요 추가 기능 |
|---|---|---|
| C# 2 | 2005 | 제네릭, nullable 값 형식(int?), 반복기(yield) |
| C# 3 | 2007 | LINQ, 람다 식, var, 개체 이니셜라이저, 확장 메서드 |
| C# 4 | 2010 | dynamic, 선택적 매개변수와 명명된 매개변수 |
| C# 5 | 2012 | async와 await |
| C# 6 | 2015 | 문자열 보간 $"...", nameof, null 조건부 ?. |
| C# 7 | 2017 | 튜플, out var, is를 이용한 패턴 매칭, 숫자 구분자 |
| C# 8 | 2019 | nullable 참조 형식, switch 식, 범위 s[1..4], ??=, 비동기 스트림 |
| C# 9 | 2020 | 레코드, init 접근자, 최상위 문, 대상 형식 new() |
| C# 10 | 2021 | 전역 using, 파일 범위 네임스페이스, 레코드 구조체 |
| C# 11 | 2022 | 원시 문자열 리터럴 """, required 멤버, 목록 패턴 |
| C# 12 | 2023 | 클래스의 기본 생성자, 컬렉션 식 [1, 2, 3] |
| C# 13 | 2024 | params 컬렉션, System.Threading.Lock 형식 |
| C# 14 | 2025 | 확장 멤버, 속성 안의 field 키워드 |
새 버전은 대부분 형식적인 코드를 줄여 줍니다. 다음 C# 9 이상 프로그램은 최상위 문(class Program도 Main도 없음), 레코드, switch 식을 사용합니다:
// C# 9 and later, in a .NET 6+ project (implicit usings import System)
var order = new Order("Maya", 21.00m);
Console.WriteLine(Shipping(order));
static string Shipping(Order o) => o.Total switch
{
>= 50m => "free shipping",
>= 20m => "standard shipping",
_ => "shipping fee applies"
};
record Order(string Customer, decimal Total);
같은 로직을 예전의 명시적인 스타일로 쓰면 다음과 같으며, C# 6 이후 모든 버전에서 컴파일됩니다:
출력:
standard shipping
두 형태 모두 올바른 C#입니다. 기존 코드, 튜토리얼, Unity 프로젝트에서는 예전의 명시적인 스타일을, 새 .NET 프로젝트에서는 짧은 스타일을 보게 됩니다.
LINQ: 언어 안에서 데이터 쿼리하기
LINQ(Language Integrated Query, C# 3)는 사람들이 C#을 좋아하는 이유로 자주 꼽는 기능입니다. 메서드를 연결해 어떤 컬렉션이든 필터링, 정렬, 그룹화, 변환할 수 있습니다:
출력:
95, 91, 88, 72
Average: 78.0
Best: 95
같은 문법이 메모리 안의 리스트에도, Entity Framework를 통한 데이터베이스 테이블에도, XML에도 동작합니다. 자세한 내용은 LINQ에서 다룹니다.
C#은 첫 언어로 좋을까?
C#은 Python보다 처음에 요구하는 것이 많습니다. 타입을 선언하고, 문장을 세미콜론으로 끝내고, 코드를 클래스 안에 넣어야 합니다. 그 대신 컴파일러가 실수를 일찍 잡아 주고, 도구(Visual Studio, VS Code, Rider)가 훌륭하며, 개념이 Java, TypeScript, Kotlin, C++로 그대로 이어집니다. Unity 게임을 만들거나 .NET 회사에서 일하고 싶다면 당연한 선택입니다. 목표가 데이터 분석이나 머신러닝이라면 Python의 생태계가 더 큽니다.
시작하려면 .NET SDK를 설치하고 dotnet new console을 실행하거나, Hello World부터 시작해 이 페이지들의 예제를 바로 실행해 보세요.
자주 묻는 질문
C#이란 무엇인가요?
C#("C 샤프"로 읽음)은 Microsoft에서 만들어 2002년에 처음 공개된 정적 타입, 객체 지향 범용 프로그래밍 언어입니다. 소스 코드는 중간 언어로 컴파일되고, .NET 런타임이 이를 기계어로 바꾸며, 메모리는 가비지 컬렉터가 관리합니다. 웹 백엔드, Unity 게임, 데스크톱 앱, 클라우드 서비스, 각종 도구에 쓰입니다.
C#과 .NET은 같은 것인가요?
아니요. C#은 언어이고, .NET은 C#이 실행되는 플랫폼입니다. 런타임(CLR), 기본 클래스 라이브러리(System.Collections.Generic, System.IO 등), SDK 도구로 이루어져 있습니다. F#과 Visual Basic도 .NET에서 실행되며, C# 버전은 보통 .NET 버전과 함께 나옵니다(예: C# 12와 .NET 8).
C#은 어디에 쓰이나요?
ASP.NET Core로 만드는 웹 API와 웹사이트, Unity 게임(Unity의 스크립트 언어가 C#입니다), WPF와 WinForms로 만드는 Windows 데스크톱 앱, .NET MAUI로 만드는 크로스 플랫폼 앱, 클라우드 서비스와 Azure Functions, 커맨드라인 도구에 쓰입니다. 기업용 소프트웨어와 게임 스튜디오에서 흔히 사용합니다.
C#은 배우기 어렵나요?
첫 언어로는 중간 정도의 난이도입니다. 문법은 C 계열이고 모든 변수에 컴파일러가 검사하는 타입이 있어서 Python보다 엄격하지만, 메모리는 자동으로 관리되고 오류 메시지가 명확합니다. 대부분의 입문자는 몇 주 연습하면 쓸모 있는 콘솔 프로그램을 작성할 수 있습니다.
C#은 지금도 배울 가치가 있나요?
네. C#은 개발자 설문에서 꾸준히 가장 많이 쓰이는 언어 중 하나이고, .NET은 오픈 소스이자 크로스 플랫폼이며, 언어는 매년 11월에 새 버전이 나옵니다. Unity로 게임을 만들거나 Microsoft 기술 기반 회사에서 일하고 싶다면 현실적인 선택입니다.