사칙연산 CLI 계산기 — 5개 언어 비교 시리즈 중 C# 구현.
동일한 사양의 계산기를 C, C++, C#, Python, Rust로 각각 구현하고, 언어마다 "관용적인(idiomatic)" 방식이 어떻게 다른지 비교하는 학습 프로젝트입니다.
dotnet run.NET 8 SDK 필요.
계산기 (예: 3 + 4, 종료: q)
> 3 + 4
= 7
> 5 / 0
0으로 나눌 수 없습니다
> q
- 최상위 문(top-level statements) — 최신 C#은
class Program { static void Main... }보일러플레이트 없이 스크립트처럼 바로 시작할 수 있습니다. double.TryParse— 예외를 던지는double.Parse대신, 성공 여부를 bool로 반환하는 .NET의 표준 검증 패턴. "실패가 예상되는 파싱"에는 예외보다 TryParse가 관용적입니다 (Python의 EAFP와 대비되는 지점).string?(nullable 참조 타입) —Console.ReadLine()이 null일 수 있음을 타입으로 표현하고, 컴파일러가 null 검사를 유도합니다.
장점
TryParse,string?등 안전한 표준 패턴이 언어 차원에 내장- 5개 중 Python 다음으로 짧고, 정적 타입의 안정성은 유지
- Visual Studio·NuGet 등 도구 생태계가 뛰어나 생산성 높음
단점
- .NET 런타임 필요 — 단일 파일 배포 시 실행 파일이 큼
- 시작(JIT 워밍업)이 네이티브 언어보다 느림
- 사실상 Microsoft 생태계 중심 (크로스플랫폼은 되지만)
| C | C++ | C# | Python | Rust | |
|---|---|---|---|---|---|
| 실행 방식 | 네이티브 | 네이티브 | .NET(JIT) | 인터프리터 | 네이티브 |
| 메모리 관리 | 수동 | 수동(RAII) | GC | GC | 소유권 |
| 오류 처리 | 반환값 검사 | 스트림 상태 | TryParse | 예외(EAFP) | Result+match |
| 코드 길이 | 중간 | 중간 | 짧음 | 최단 | 최장 |
공통점: 5개 구현 모두 "루프 → 한 줄 입력 → 3조각 파싱 → 연산자 분기 → 출력" 구조이며, 잘못된 입력·0 나누기에 죽지 않도록 명시적으로 처리합니다.
가장 큰 차이는 오류 처리 철학: C는 개발자 재량, Python/C#은 런타임 보호, Rust는 컴파일 타임 강제.