0Pricing
C# Academy · 강의

형식 및 속성 패턴

구조와 멤버에 따라 매칭해 보세요.

형식 및 속성 패턴은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

형식 패턴

형식 패턴은 입력값이 지정된 형식의 인스턴스일 때 일치합니다. 스위치 분기에서 형식 이름만 작성하면 값의 실행 시 형식을 확인합니다.

이를 사용하면 번거로운 is와 캐스트 연쇄를 깔끔한 단일 식으로 바꿀 수 있으며, 형식도 자동으로 더 구체적인 형식으로 좁혀집니다.

object o = "hello";
string kind = o switch
{
    int    => "number",
    string => "text",
    _      => "unknown"
};
System.Console.WriteLine(kind);

선언 패턴

선언 패턴은 형식 뒤에 변수 이름을 추가합니다. 예를 들어 string s와 같이 작성합니다. 일치하면 입력값이 해당 형식으로 변환되어 그 변수에 바인딩됩니다.

그런 다음 분기의 오른쪽에서 형식이 지정된 변수를 사용할 수 있으므로, 추가 캐스트 없이 해당 형식에만 있는 멤버에 접근할 수 있습니다.

object o = "coddy";
string result = o switch
{
    string s => $"len {s.Length}",
    int n    => $"value {n}",
    _        => "other"
};
System.Console.WriteLine(result);

실행 가능한 형식 전환

형식 패턴은 object 배열에서 값을 구문 분석하는 것처럼 서로 다른 형식의 데이터를 처리할 때 적합합니다.

여기서는 각 요소를 실행 시 형식에 따라 일치시키고 그에 맞게 형식을 지정합니다. 바인딩된 변수는 더 구체적으로 좁혀진 형식을 결과 식에 전달합니다.

using System;

class Program {
    static string Describe(object o) => o switch {
        int i    => $"int {i}",
        double d => $"double {d}",
        string s => $"string '{s}'",
        _        => "?"
    };
    static void Main() {
        foreach (var x in new object[]{ 1, 2.5, "hi" })
            Console.WriteLine(Describe(x));
    }
}

속성 패턴

속성 패턴은 중괄호를 사용하여 객체의 멤버를 검사합니다. 예를 들어 { Property: value }와 같이 작성합니다. 나열된 각 속성이 내부 패턴과 일치할 때 일치합니다.

이를 사용하면 수동으로 멤버를 비교하지 않고 객체의 구조와 내용을 직접 기준으로 분기할 수 있습니다.

record Person(string Name, int Age);

var p = new Person("Ada", 30);
string stage = p switch
{
    { Age: < 18 } => "minor",
    { Age: >= 65 } => "senior",
    _ => "adult"
};
System.Console.WriteLine(stage);

여러 속성

중괄호 안에서 여러 속성을 쉼표로 구분하면 한 번에 여러 속성을 확인할 수 있습니다. 분기가 실행되려면 모든 속성이 일치해야 합니다.

이를 사용하면 상태와 특정 개수를 모두 가진 객체와 같이 복합 조건을 명확하게 표현할 수 있습니다.

record Order(string Status, int Items);

var order = new Order("Open", 0);
string msg = order switch
{
    { Status: "Open", Items: 0 } => "empty cart",
    { Status: "Open" } => "shopping",
    _ => "closed"
};
System.Console.WriteLine(msg);

형식과 속성 결합하기

형식 패턴과 속성 패턴은 함께 사용할 수 있습니다. 먼저 형식을 작성한 다음 속성의 중괄호 블록을 작성하세요. 입력값이 해당 형식이고 속성도 일치할 때만 분기가 일치합니다.

이는 기본 클래스 참조나 인터페이스를 처리하면서 구체적인 하위 형식과 그 상태를 함께 기준으로 분기하려 할 때 유용합니다.

using System;

abstract record Shape;
record Circle(double R) : Shape;
record Square(double Side) : Shape;

class Program {
    static string Big(Shape s) => s switch {
        Circle { R: > 10 } => "big circle",
        Square { Side: > 10 } => "big square",
        _ => "small"
    };
    static void Main() => Console.WriteLine(Big(new Circle(12)));
}

중첩된 속성 패턴

속성 패턴은 중첩할 수 있습니다. 속성 자체가 객체라면 또 다른 중괄호 블록으로 해당 객체의 멤버를 일치시킬 수 있습니다.

예를 들어 { Address: { City: "Paris" } }는 하나의 식에서 두 단계 아래까지 확인합니다. 따라서 널이 발생하기 쉬운 점 표기 접근 연쇄를 피할 수 있습니다.

record Address(string City);
record User(string Name, Address Address);

var u = new User("Lin", new Address("Paris"));
bool inParis = u is { Address: { City: "Paris" } };
System.Console.WriteLine(inParis);

확장된 속성 접근

C# 10부터는 속성 패턴 안에서 점으로 연결된 경로를 사용할 수 있습니다. 예를 들어 { Address.City: "Paris" }와 같이 작성합니다. 이는 중첩된 중괄호를 간략하게 표현한 것입니다.

이 방법을 사용하면 중간 값도 일치 과정에서 안전하게 처리하면서 깊은 단계의 확인을 읽기 쉬운 한 줄로 펼칠 수 있습니다.

record Address(string City);
record User(string Name, Address Address);

var u = new User("Lin", new Address("Rome"));
string where = u switch
{
    { Address.City: "Paris" } => "FR",
    { Address.City: "Rome" }  => "IT",
    _ => "??"
};
System.Console.WriteLine(where);

전체 일치 결과 캡처하기

속성 패턴 뒤에 이름을 추가하면 일치한 전체 값에 변수를 바인딩할 수 있습니다. 예를 들어 { Age: > 18 } adult와 같이 작성합니다.

그러면 adult 변수는 분기 안에서 전체 객체를 가리키며, 해당 속성들이 테스트를 통과했는지 확인한 후 객체를 사용할 수 있습니다.

using System;

record Person(string Name, int Age);

class Program {
    static void Main() {
        Person p = new("Sam", 40);
        string r = p switch {
            { Age: >= 18 } adult => $"{adult.Name} can vote",
            _ => "too young"
        };
        Console.WriteLine(r);
    }
}

널 처리

속성 패턴은 검사할 객체가 없으므로 null과 절대 일치하지 않습니다. 따라서 { }(빈 중괄호)는 널이 아닌 모든 값과 일치합니다.

이 때문에 not null과 { }는 널을 확인할 때 유용한 관용 표현이며, 속성 기반 분기가 널 입력값을 안전하게 건너뛰도록 합니다.

string? maybe = null;
string state = maybe switch
{
    null => "missing",
    { Length: 0 } => "empty",
    _ => "has text"
};
System.Console.WriteLine(state);

캐스트보다 패턴이 나은 이유

패턴이 도입되기 전에는 형식에 따른 분기를 하려면 is 확인 후 캐스트와 널 가드를 작성해야 했습니다. 형식 패턴과 속성 패턴은 이 모든 과정을 하나의 식으로 결합합니다.

컴파일러는 모든 경우를 다루는지와 도달 가능성도 추적하므로, 직접 작성한 if 연쇄라면 조용히 지나칠 수 있는 실행되지 않는 분기와 누락된 경우를 찾아냅니다.

object o = 42;
// Old: if (o is int) { int n = (int)o; ... }
// New:
if (o is int n) System.Console.WriteLine(n + 1);

빠른 확인

형식 패턴과 속성 패턴에 대한 이해도를 확인해 보세요.

복습

형식 패턴은 실행 시 형식을 기준으로 일치시키며, 형식이 지정된 변수를 바인딩할 수 있습니다. 속성 패턴은 { Prop: pattern }으로 멤버를 검사하고, 중첩과 점으로 연결된 경로를 지원하며, 널과는 절대 일치하지 않습니다.

두 패턴을 결합하여 객체의 구조와 상태를 모두 기준으로 분기할 수 있습니다. 다음으로 관계형 패턴과 논리 패턴을 살펴보겠습니다.

자주 묻는 질문

“형식 및 속성 패턴” 강의는 무료인가요?

네 — “형식 및 속성 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“형식 및 속성 패턴”에서 뭘 배우나요?

구조와 멤버에 따라 매칭해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“형식 및 속성 패턴” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. switch 식
  2. 형식 및 속성 패턴
  3. 관계형 및 논리 패턴
  4. 목록 및 튜플 패턴
← C# Academy(으)로 돌아가기