출시·고도화 중
C# 안내서 · 2/6
이 장에서는 C# 코드를 읽고 쓰는 데 필요한 기본기를 다룹니다. 변수 선언, 메서드, 흐름 제어, 문자열 보간, 그리고 코드를 묶는 네임스페이스까지 차례로 살펴봅니다. C#의 문법은 C · Java · JavaScript와 닮은 데가 많아서, 중괄호 언어를 써 봤다면 금방 익숙해집니다.
C#은 정적 타입 언어라서 모든 변수의 타입이 컴파일할 때 정해집니다. 타입을 직접 적어도 되고, var를 써서 오른쪽 값으로부터 타입을 추론하게 할 수도 있습니다. var를 써도 타입은 고정되며, 나중에 다른 타입의 값을 넣을 수 없습니다.
int count = 10;
double price = 19.99;
string title = "C# 입문";
bool isActive = true;
var total = count * price; // double 로 추론됩니다
var names = new List<string>(); // List<string> 으로 추론됩니다
const int MaxRetries = 3; // 컴파일 시간 상수
count += 5; // 변수는 다시 대입할 수 있습니다
// MaxRetries = 4; // 오류: 상수는 바꿀 수 없습니다이름 규칙도 알아 두면 좋습니다. 지역 변수와 매개변수는 camelCase, 메서드 · 속성 · 타입 · 상수는 PascalCase로 쓰는 것이 일반적인 관례입니다. 문장은 세미콜론(;)으로 끝납니다.
메서드는 반환 타입, 이름, 매개변수 목록으로 선언합니다. 반환값이 없으면 void를 씁니다. 본문이 식 하나뿐이면 =>를 써서 짧게 적을 수 있습니다.
static int Add(int a, int b)
{
return a + b;
}
static int Square(int x) => x * x;
// 기본값이 있는 선택적 매개변수
static string Greet(string name, string greeting = "안녕하세요")
=> $"{greeting}, {name}!";
Console.WriteLine(Add(2, 3)); // 5
Console.WriteLine(Square(4)); // 16
Console.WriteLine(Greet("민수")); // 안녕하세요, 민수!
Console.WriteLine(Greet(greeting: "반가워요", name: "지은")); // 이름 붙은 인수최상위 문 파일 안에 선언한 메서드는 진입점 안의 지역 함수가 됩니다. 클래스 안에 선언한 메서드는 static이면 타입에 속하고, static이 없으면 인스턴스에 속합니다. 메서드는 out 매개변수로 값을 하나 더 돌려줄 수 있는데, int.TryParse가 대표적인 예입니다.
조건문과 반복문은 다른 중괄호 언어와 거의 같습니다. C#에는 여기에 switch 식과 패턴 매칭이 더해져 분기를 간결하게 쓸 수 있습니다.
int score = 87;
if (score >= 90)
Console.WriteLine("A");
else if (score >= 80)
Console.WriteLine("B");
else
Console.WriteLine("C 이하");
string grade = score switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
_ => "F",
};
for (int i = 0; i < 3; i++)
Console.WriteLine($"for: {i}");
foreach (var fruit in new[] { "사과", "배", "귤" })
Console.WriteLine($"foreach: {fruit}");
int n = 0;
while (n < 3)
{
n++;
if (n == 2) continue; // 다음 반복으로
Console.WriteLine($"while: {n}");
}switch 식의 _는 나머지 모든 경우를 뜻합니다. 처리하지 않은 경우가 있으면 컴파일러가 경고를 줍니다. is 연산자로도 패턴을 검사할 수 있습니다. 예를 들어 if (value is int number && number > 0)은 타입 검사와 변환, 조건 검사를 한 번에 합니다.
문자열 앞에 $를 붙이면 중괄호 안에 식을 넣을 수 있습니다. 콜론 뒤에 형식 지정자를 붙여 숫자와 날짜의 모양을 정할 수 있습니다.
var item = "키보드";
var unitPrice = 45900m;
var quantity = 2;
Console.WriteLine($"{item} {quantity}개: {unitPrice * quantity:N0}원");
Console.WriteLine($"비율: {0.256:P1}"); // 25.6%
Console.WriteLine($"|{item,-8}|{quantity,5}|"); // 왼쪽 · 오른쪽 맞춤
var path = @"C:\data\report.txt"; // 축자 문자열: \ 를 그대로 둡니다
var json = """
{ "name": "TASTEDEV", "ok": true }
"""; // 원시 문자열 리터럴m 접미사는 돈 계산에 알맞은 decimal 타입을 뜻합니다. 큰따옴표 세 개로 감싸는 원시 문자열 리터럴은 따옴표나 역슬래시를 이스케이프하지 않고 그대로 쓸 수 있어 JSON이나 SQL을 담기에 좋습니다.
네임스페이스는 타입 이름이 서로 부딪치지 않도록 묶는 이름 공간입니다. 파일 맨 위에 namespace 이름;이라고 적으면 그 파일의 모든 타입이 그 네임스페이스에 속합니다(파일 범위 네임스페이스). 다른 네임스페이스의 타입을 쓰려면 using 지시문으로 가져옵니다.
// Models/Order.cs
namespace Shop.Models;
public class Order
{
public int Id { get; set; }
}// Program.cs
using System.Text;
using Shop.Models;
var order = new Order { Id = 42 };
var builder = new StringBuilder();
builder.Append("주문 번호: ").Append(order.Id);
Console.WriteLine(builder.ToString());ImplicitUsings가 켜져 있으면 System, System.Collections.Generic, System.Linq 같은 네임스페이스는 적지 않아도 됩니다. 프로젝트 전체에 같은 using을 적용하고 싶다면 한 파일에 global using Shop.Models;처럼 적습니다.
var로 추론하며, 어느 쪽이든 타입은 컴파일할 때 고정됩니다.=>로 씁니다. 선택적 · 이름 붙은 인수를 쓸 수 있습니다.if, for, foreach, while에 더해 switch 식과 패턴 매칭으로 분기를 간결하게 표현합니다.$"..." 문자열 보간과 형식 지정자로 출력을 다듬고, 원시 문자열 리터럴로 여러 줄 글을 그대로 담습니다.using으로 다른 네임스페이스를 가져옵니다.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.