Hello World 및 프로그램 구조
최상위 문(.NET 6부터)을 쓰면 상용구 클래스를 생략할 수 있습니다.
| 요소 | 코드 |
|---|
| 최상위 프로그램 | Console.WriteLine("Hello, World!"); |
| 네임스페이스 임포트 | using System; |
| 고전적인 진입점 | static void Main(string[] args) { ... } |
| 한 줄 출력 | Console.WriteLine("text"); |
| 한 줄 읽기 | string s = Console.ReadLine(); |
| 문자열 보간 | Console.WriteLine($"Hi {name}"); |
| 주석 | // line 그리고 /* block */ |
자료형
| 타입 | 설명 |
|---|
int | 32비트 부호 있는 정수 |
long | 64비트 부호 있는 정수 |
double / float | 부동소수점 숫자 |
decimal | 고정밀 십진수 (금액) |
bool | true 또는 false |
char | 단일 유니코드 문자 |
string | 불변 텍스트 |
var | 컴파일러가 타입을 추론 |
int? | 널 허용 값 타입 |
변수
| 작업 | 문법 |
|---|
| 선언 및 초기화 | int x = 5; |
| 타입 추론 | var name = "Ada"; |
| 상수 | const double Pi = 3.14159; |
| 읽기 전용 필드 | readonly int id; |
| 널 허용 참조 | string? maybe = null; |
| 널 병합 | var y = maybe ?? "default"; |
| 널 조건부 | int? len = text?.Length; |
제어 흐름
| 문(statement) | 문법 |
|---|
| if / else | if (x > 0) { ... } else { ... } |
| switch 문 | switch (n) { case 1: ...; break; default: ...; } |
| switch 표현식 | var s = n switch { 1 => "one", _ => "other" }; |
| while 반복문 | while (i < n) { ... } |
| do-while 반복문 | do { ... } while (i < n); |
| for 반복문 | for (int i = 0; i < n; i++) { ... } |
| foreach 반복문 | foreach (var item in list) { ... } |
| break / continue | break;는 반복문을 빠져나가고, continue;는 다음 반복으로 건너뜀 |
메서드
| 작업 | 문법 |
|---|
| 메서드 정의 | int Add(int a, int b) { return a + b; } |
| 표현식 본문 | int Add(int a, int b) => a + b; |
| 반환값 없음 | void Greet() { ... } |
| 선택적 매개변수 | int Pow(int b, int e = 2) { ... } |
| 명명된 인자 | Pow(b: 2, e: 3); |
| out 매개변수 | bool TryParse(string s, out int n) { ... } |
| 정적 메서드 | static int Square(int x) => x * x; |
| 람다 표현식 | Func<int, int> f = x => x * 2; |
클래스 및 객체 지향(OOP)
| 작업 | 문법 |
|---|
| 클래스 정의 | class Dog { ... } |
| 자동 프로퍼티 | public string Name { get; set; } |
| 읽기 전용 프로퍼티 | public int Id { get; } |
| 생성자 | public Dog(string name) { Name = name; } |
| 객체 생성 | var d = new Dog("Rex"); |
| 상속 | class Puppy : Dog { ... } |
| 인터페이스 | interface IRunnable { void Run(); } |
| 메서드 오버라이드 | public override void Speak() { ... } |
| 레코드 (불변) | record Point(int X, int Y); |
컬렉션
System.Collections.Generic의 제네릭 컬렉션.
| 타입 | 사용법 및 예시 |
|---|
List<T> | 동적 배열: list.Add(1); list.Count; |
Dictionary<K, V> | 키-값: dict["a"] = 1; dict.ContainsKey("a"); |
HashSet<T> | 고유 값: set.Add(5); set.Contains(5); |
Queue<T> | FIFO: q.Enqueue(x); q.Dequeue(); |
Stack<T> | LIFO: s.Push(x); s.Pop(); |
| 배열 | int[] nums = { 1, 2, 3 }; |
| 컬렉션 초기화자 | var l = new List<int> { 1, 2, 3 }; |
| 딕셔너리 순회 | foreach (var kv in dict) { kv.Key; kv.Value; } |
LINQ
컬렉션을 유려하게 쿼리합니다. System.Linq에서 가져옵니다.
| 작업 | 문법 |
|---|
| 필터 | nums.Where(n => n > 0) |
| 투영 / 매핑 | nums.Select(n => n * 2) |
| 정렬 | nums.OrderBy(n => n) / OrderByDescending(...) |
| 첫 일치 | nums.First(n => n > 5) / FirstOrDefault(...) |
| any / all | nums.Any(n => n < 0) / nums.All(n => n > 0) |
| 일치 개수 세기 | nums.Count(n => n > 0) |
| 집계 | nums.Sum(), nums.Max(), nums.Average() |
| 그룹화 | items.GroupBy(i => i.Category) |
| 구체화 | .ToList() / .ToArray() |
자주 쓰는 패턴 (프로퍼티, async)
| 패턴 | 문법 |
|---|
| async 메서드 | async Task<int> GetAsync() { ... } |
| 태스크 await | var result = await GetAsync(); |
| try / catch | try { ... } catch (Exception e) { ... } |
| finally | finally { ... }는 항상 실행됨 |
| using (자원 해제) | using var file = File.OpenRead(path); |
| 문자열 서식 지정 | $"Total: {amount:C}" |
| 제네릭 클래스 | class Box<T> { public T Value; } |
| 패턴 매칭 | if (obj is Dog d) { d.Bark(); } |
가장 자주 쓰는 C# 문법, 컬렉션, LINQ 쿼리를 한 페이지에 담았습니다. 이 C# 치트시트는 C#를 작성하기 위한 빠른 참조 자료입니다 - 자료형, 제어 흐름, 클래스, List/Dictionary 컬렉션, LINQ, 그리고 관용적인 .NET 코드를 정의하는 프로퍼티와 async 패턴을 다룹니다.
여기 나오는 모든 내용은 .NET의 표준 C#이며 dotnet CLI로 실행됩니다. 필요한 것을 복사하거나, C# 플레이그라운드에서 어떤 코드든 바로 실행해 보세요 - SDK를 설치할 필요가 없습니다.