C#: 언어 핵심 개념, .NET MAUI 및 Xamarin 개발

저자: IT Sectr 게시일: 2026-02-10 읽는 시간: 12 분

C#는 Microsoft의 최신 객체 지향 프로그래밍 언어로, 모바일 개발에서 Xamarin 및 .NET MAUI 플랫폼의 기초 역할을 합니다. 통합된 .NET 에코시스템 덕분에 개발자는 공유 C# 및 XAML 코드를 사용하여 iOS 및 Android용 모바일 애플리케이션을 만들 수 있습니다. TIOBE 지수(2026)에 따르면 C#는 모든 프로그래밍 언어 중 인기 4위를 차지하고 있습니다. 자세한 내용은 Microsoft C# 문서를 참조하세요.

주요 포인트

  • C# — .NET 플랫폼을 위한 Microsoft의 객체 지향 언어
  • .NET MAUI — Xamarin의 후속 제품, iOS, Android, Windows, macOS용 단일 프로젝트
  • XAML — 모든 .NET 플랫폼에서 공유되는 선언적 UI 마크업
  • CLR — JIT/AOT 컴파일 및 가비지 컬렉션을 갖춘 Common Language Runtime
  • LINQ — 컬렉션 및 데이터베이스 작업을 위한 Language Integrated Query

C#란?

C#("시 샤프"로 발음)는 Anders Hejlsberg의 지휘 아래 2000년에 Microsoft가 개발한 안전한 유형 시스템을 갖춘 객체 지향 프로그래밍 언어입니다. 이름은 음악 표기법(샤프 — 음을 높임)에서 영감을 받았습니다. C#는 .NET 플랫폼에서 실행되며, 여기에는 Common Language Runtime(CLR)과 광범위한 클래스 라이브러리(BCL — Base Class Library)가 포함됩니다.

모바일 개발에서 C#는 두 가지 기술을 통해 사용됩니다: Xamarin(2011~2024)과 그 후속 제품인 .NET MAUI(2022+). Xamarin은 플랫폼별 프로젝트를 분리하면서 공유 C# 코드로 네이티브 Android 및 iOS 애플리케이션을 만들 수 있게 했습니다. .NET MAUI는 공유 XAML 마크업과 플랫폼 인터페이스를 통한 네이티브 API 액세스로 모든 플랫폼을 단일 프로젝트에 통합합니다.

C#의 주요 특징은 dynamic을 통한 동적 디스패치, var 키워드(유형 추론), 강력한 제네릭 시스템을 갖춘 엄격한 정적 유형 지정입니다. C#는 완전히 관리되는 언어입니다: 메모리는 가비지 컬렉터(GC)에 의해 관리되고, 배열 경계가 확인되며, 초기화되지 않은 변수는 금지됩니다. 이는 AOT 컴파일을 통해 비교 가능한 성능으로 C#를 C++보다 안전하게 만듭니다.

C# 버전 및 진화

C# 1.0(2000) — 기본 OOP 언어. C# 3.0(2007) — LINQ, 람다 식, 확장 메서드. C# 6.0(2015) — 문자열 보간, null 조건부 연산자. C# 8.0(2019) — nullable 참조 유형(null 안전성 활성화), 비동기 스트림, 기본 인터페이스 메서드. C# 10(2021) — global usings, 파일 범위 네임스페이스, record struct. C# 12(2023) — primary constructors, collection expressions, interceptors. 각 버전은 모바일 개발과 관련된 개선 사항을 제공합니다.

C# 버전연도주요 기능모바일 개발에서의 중요성
3.02007LINQ, 람다컬렉션 및 데이터베이스 작업 간소화
6.02015?. (null 조건부), 문자열 보간안전한 속성 접근, 읽기 쉬운 문자열
8.02019Nullable 참조 유형, 비동기 스트림Null 안전성, 비동기 데이터 스트림
102021Record struct, global usings값 유형, 상용구 코드 감소
122023Primary constructors, collection expressions간결한 클래스 및 컬렉션 표기법

C# 구문: 유형, 클래스 및 LINQ

C# 구문은 C와 유사하며 엄격하게 유형이 지정됩니다. 기본형(int, double, bool — ValueType을 상속하는 구조체)을 포함한 모든 것이 객체입니다. C#는 유형을 값 유형(int, double, bool, struct, enum — 스택에 저장)과 참조 유형(string, class, interface, delegate, array, record — 힙에 저장)으로 나눕니다. Nullable 유형(int?)은 값 유형에 null을 허용합니다.

데이터 유형 및 클래스

C#는 클래스(class), 구조체(struct), 레코드(record), 인터페이스(interface), 열거형(enum), 대리자(delegate)를 지원합니다. record는 값 기반 동등성(두 레코드는 모든 필드가 같으면 같음)을 가진 불변 참조 유형입니다. record struct는 C# 10에서 도입된 record의 값 버전입니다. primary constructors(C# 12)는 선언과 초기화를 한 줄로 결합합니다.

csharp
// C# 기본 유형 및 클래스
using System;
using System.Collections.Generic;

// Primary constructor가 있는 레코드 (C# 12)
public record User(int Id, string Name, string Email);

// Nullable 속성이 있는 클래스
public class AppConfig
{
    public string AppName { get; init; }
    public string? ApiUrl { get; set; } // nullable reference type
    public int Version { get; init; }

    // 식 본문이 있는 메서드
    public string GetDisplayName() => $"{AppName} v{Version}";
}

// 확장 메서드
public static class StringExtensions
{
    public static bool IsValidEmail(this string email) =>
        email.Contains("@") && email.Contains(".");
}

// 사용법
var user = new User(1, "Alice", "alice@example.com");
bool validEmail = user.Email.IsValidEmail();

primary constructor가 있는 레코드 User는 equals, hashCode, ToString, Deconstruct 및 with-복사를 자동 생성합니다. init-only 세터(AppName)는 이니셜라이저에서만 값을 설정할 수 있습니다. 식 본문(=>)은 간단한 메서드의 간결한 표기법입니다. 확장 메서드 IsValidEmail은 상속 없이 string에 메서드를 추가합니다.

LINQ — Language Integrated Query

LINQ는 컬렉션, 데이터베이스, XML을 위한 내장 쿼리 언어입니다. LINQ to Objects — IEnumerable 컬렉션에 대한 쿼리. LINQ to SQL — 데이터베이스에 대한 쿼리. LINQ to XML — XML에 대한 쿼리. 구문은 쿼리 구문(from u in users where u.Age > 18 select u)과 메서드 구문(users.Where(u => u.Age > 18).Select(u => u))이 있습니다. 지연 로딩(지연 실행): 쿼리는 선언 시가 아니라 반복 시에 실행됩니다.

csharp
// 컬렉션에 대한 LINQ 쿼리
using System.Linq;

var users = new List<User>
{
    new User(1, "Alice", "alice@example.com"),
    new User(2, "Bob", "bob@test.com"),
    new User(3, "Charlie", "charlie@example.com"),
};

// 쿼리 구문
var filteredUsers = from u in users
                     where u.Email.Contains("example")
                     orderby u.Name
                     select u;

// 여러 작업이 있는 메서드 구문
var result = users
    .Where(u => u.Email.Contains("example"))
    .OrderBy(u => u.Name)
    .Select(u => new { u.Name, u.Email })
    .ToList();

// GroupBy 및 집계
var emailsByDomain = users
    .GroupBy(u => u.Email.Split('@')[1])
    .Select(g => new { Domain = g.Key, Count = g.Count() });

// 비동기 스트림을 사용한 LINQ (IAsyncEnumerable)
await foreach (var user in GetUsersAsync())
{
    Console.WriteLine(user.Name);
}

async IAsyncEnumerable<User> GetUsersAsync()
{
    yield return new User(1, "Alice", "alice@example.com");
    await Task.Delay(100);
    yield return new User(2, "Bob", "bob@test.com");
}

LINQ 쿼리 filteredUsers는 이메일 도메인별로 사용자를 필터링하고 이름순으로 정렬합니다. 메서드 구문 .Where().OrderBy().Select()는 쿼리 구문과 동등한 메서드 체인입니다. GroupBy는 이메일 도메인별로 그룹화합니다. IAsyncEnumerable(C# 8)은 IEnumerable의 비동기 버전으로, 모바일 애플리케이션에서 스트리밍 데이터 로딩에 유용합니다.

Xamarin 및 .NET MAUI: 아키텍처

Xamarin(2011~2024)은 C#에서 크로스 플랫폼 모바일 개발을 위한 Microsoft의 첫 번째 플랫폼이었습니다. Xamarin.Android(Linux 커널 위의 Mono 런타임)와 Xamarin.iOS(iOS에서 JIT 금지로 인한 ARM64로의 AOT 컴파일)로 구성되었습니다. Xamarin.Forms는 XAML 마크업을 사용하는 공유 UI 계층으로, 요소를 네이티브(Android View / iOS UIView)로 변환했습니다.

.NET MAUI(.NET Multi-platform App UI)는 2022년에 출시된 Xamarin의 후속 제품입니다. 단일 .csproj 프로젝트, 하나의 XAML 마크업, 하나의 진입점. 5개 플랫폼 지원: iOS, Android, Windows(WinUI 3), macOS(Mac Catalyst), Tizen. .NET MAUI는 Renderer 대신 새로운 Handler 아키텍처를 사용합니다: 각 XAML 요소는 플랫폼 핸들러를 통해 네이티브 구성 요소에 매핑됩니다.

xml
<!-- MainPage.xaml — .NET MAUI 선언적 UI -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.MainPage">

    <ScrollView>
        <VerticalStackLayout Padding="30" Spacing="25">
            <Label Text="Welcome to .NET MAUI!"
                   FontSize="32"
                   HorizontalOptions="Center"/>

            <Entry x:Name="NameEntry"
                   Placeholder="Enter your name"/>

            <Button Text="Submit"
                    Clicked="OnSubmitClicked"
                    BackgroundColor="#512BD4"
                    TextColor="White"
                    CornerRadius="8"/>

            <CollectionView x:Name="ItemsView"
                          SelectionMode="Single">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Grid Padding="10">
                            <Label Text="{Binding Name}"
                                   FontSize="18"/>
                        </Grid>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

.NET MAUI XAML 마크업은 UI를 선언적으로 설명합니다. ScrollView — 스크롤, VerticalStackLayout — 수직 배치. Label, Entry(텍스트 입력), Button — 기본 요소. CollectionView — 항목 표시를 위한 DataTemplate이 있는 가상화된 목록. Clicked 이벤트는 MainPage.xaml.cs 코드 비하인드의 OnSubmitClicked 메서드에 바인딩됩니다.

csharp
// MainPage.xaml.cs — C# 로직이 있는 코드 비하인드
namespace MyApp;

public partial class MainPage : ContentPage
{
    private readonly List<User> _users = new();

    public MainPage()
    {
        InitializeComponent();
        LoadUsers();
    }

    private async void OnSubmitClicked(object? sender, EventArgs e)
    {
        var name = NameEntry.Text?.Trim();

        if (string.IsNullOrEmpty(name))
        {
            await DisplayAlert("Error", "Name is required", "OK");
            return;
        }

        _users.Add(new User(_users.Count + 1, name, $"{name}@example.com"));
        ItemsView.ItemsSource = null;
        ItemsView.ItemsSource = _users;
        NameEntry.Text = string.Empty;
    }

    private async void LoadUsers()
    {
        var apiService = new ApiService();
        var users = await apiService.GetUsersAsync();
        _users.AddRange(users);
        ItemsView.ItemsSource = _users;
    }
}

코드 비하인드 MainPage는 ContentPage를 상속합니다. InitializeComponent()가 XAML 마크업을 로드합니다. NameEntry.Text?.Trim() — 안전한 접근을 위한 null 조건부 연산자(?.). DisplayAlert — 네이티브 대화상자. ItemsView.ItemsSource — 컬렉션에 대한 바인딩. 비동기 로딩을 위한 async/await. 복잡한 프로젝트에는 MVVM(Model-View-ViewModel) 패턴이 권장됩니다.

모바일 개발에서의 C#

C# 모바일 개발은 세 가지 접근 방식을 제공합니다: .NET MAUI(크로스 플랫폼 UI), Xamarin(레거시), Unity(게임). 새 프로젝트에는 .NET MAUI가 권장 경로입니다. C# 애플리케이션은 Intermediate Language(IL)로 컴파일되며, NativeAOT(.NET MAUI) 또는 Mono(Xamarin)가 네이티브 ARM 코드로 변환합니다. iOS는 AOT 컴파일이 필요합니다 — JIT는 Apple 정책에 의해 금지됩니다.

네이티브 API 액세스

.NET MAUI는 인터페이스를 통해 플랫폼 기능을 작업하기 위한 통합 API를 제공합니다: IAccelerometer, IBarometer, IBattery, IConnectivity, IDeviceInfo, IFilePicker, IGeolocation, IMediaPicker, IPermissions, ISpeechRecognizer, IVibration. 플랫폼별 코드에는 조건부 컴파일(#if ANDROID, #if IOS) 또는 partial class가 사용됩니다.

csharp
// DI를 사용한 .NET MAUI 위치 정보
public class LocationService
{
    private readonly IGeolocation _geolocation;

    public LocationService(IGeolocation geolocation)
    {
        _geolocation = geolocation;
    }

    public async Task<Location?> GetCurrentLocation()
    {
        try
        {
            var permission = await CheckAndRequestPermission();
            if (permission != PermissionStatus.Granted)
                return null;

            var location = await _geolocation.GetLastKnownLocationAsync();

            if (location == null)
            {
                location = await _geolocation.GetLocationAsync(new GeolocationRequest
                {
                    DesiredAccuracy = GeolocationAccuracy.Medium,
                    Timeout = TimeSpan.FromSeconds(10)
                });
            }

            return location;
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"위치 오류: {ex.Message}");
            return null;
        }
    }

    private async Task<PermissionStatus> CheckAndRequestPermission()
    {
        var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();

        if (status != PermissionStatus.Granted)
        {
            status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
        }

        return status;
    }
}

LocationService는 DI(IGeolocation의 의존성 주입)를 사용합니다. CheckAndRequestPermission은 위치 정보 권한을 확인하고 요청합니다. GetLastKnownLocationAsync — 빠른(항상 정확하지는 않은) 응답, GetLocationAsync — 정확도 및 시간 초과 매개변수가 있는 요청. nullable 참조 유형을 사용한 null 검사(location == null). try-catch가 플랫폼 예외를 처리합니다.

모바일에서의 C# 성능

C#는 모바일 장치에서 Android의 Java/Kotlin 및 iOS의 Swift와 비교할 수 있는 성능을 보여줍니다. NativeAOT(.NET 8+)는 IL 중간 단계 없이 C#를 직접 네이티브 코드로 컴파일합니다 — 이로 인해 시작 시간이 50% 단축되고 메모리 소비가 줄어듭니다. .NET MAUI의 GC는 짧은 일시 중지(Workstation GC)로 모바일 플랫폼에 최적화되어 있습니다. APK 크기는 ~20-30MB(NativeAOT 사용 시)입니다.

매개변수Xamarin.NET MAUI
아키텍처Xamarin.Android + Xamarin.iOS단일 .csproj 프로젝트
UI 렌더링Renderer(Xamarin.Forms)Handler(.NET MAUI)
컴파일Mono JIT(Android), AOT(iOS)NativeAOT(모든 플랫폼)
상태유지 관리 모드활발한 개발
플랫폼Android, iOS, WindowsAndroid, iOS, Windows, macOS, Tizen

.NET 플랫폼 및 CLR

.NET 플랫폼은 관리 코드를 실행하기 위한 에코시스템으로, CLR(Common Language Runtime), BCL(Base Class Library), 서버 개발용 ASP.NET Core 및 모바일 애플리케이션용 .NET MAUI를 포함합니다. .NET 8+는 모든 유형의 애플리케이션(모바일, 데스크톱, 웹, 클라우드, IoT, 게임(Unity))을 위한 통합 플랫폼입니다.

CLR은 CIL(Common Intermediate Language) 코드를 실행하는 가상 머신입니다. C#, VB.NET, F#는 CIL로 컴파일됩니다. CLR의 JIT 컴파일러는 첫 번째 메서드 호출 시 CIL을 머신 코드로 변환합니다. NativeAOT(사전 컴파일)는 빌드 시 CIL을 네이티브 코드로 컴파일합니다 — JIT가 제한될 수 있는 모바일 플랫폼(iOS)에 이상적입니다.

.NET의 가비지 컬렉터 GC는 세대별(세대 0, 1, 2)로, 사용하지 않는 객체를 자동으로 해제합니다. 모바일 애플리케이션의 경우 최소 일시 중지의 Workstation GC가 권장됩니다. GC는 UI 스레드를 차단하지 않고 별도 스레드에서 실행됩니다. Background GC는 대화형 애플리케이션의 일시 중지를 최소화하는 백그라운드 수집기입니다.

C# 개발자 도구

C# 개발자 도구에는 Visual Studio, .NET SDK, dotnet CLI, NuGet, JetBrains Rider가 포함됩니다. Visual Studio 2022는 XAML 디자이너, 관리 및 네이티브 코드 디버거, CPU/메모리 프로파일러를 갖춘 주요 IDE입니다. .NET SDK에는 csc 컴파일러, dotnet CLI(dotnet new, dotnet build, dotnet publish, dotnet test)가 포함됩니다.

NuGet은 .NET의 패키지 관리자로, JS의 npm과 유사합니다. 300,000개 이상의 패키지, CommunityToolkit.Maui(UI 구성 요소), SQLite-net(데이터베이스), Firebase Cloud Messaging, ZXing.Net.Maui(QR 코드) 등이 포함됩니다. .NET MAUI Community Toolkit은 개발을 가속화하기 위한 동작, 변환기, 애니메이션 세트입니다. RestSharp 및 Refit — HTTP 클라이언트. Prism 및 MVVM Community Toolkit — 아키텍처 프레임워크.

xml
<!-- .csproj — .NET MAUI 프로젝트 구성 -->
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <UseMaui>true</UseMaui>
    <ApplicationTitle>MyMAUIApp</ApplicationTitle>
    <ApplicationId>com.example.mymauiapp</ApplicationId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="CommunityToolkit.Maui" Version="9.0.0" />
    <PackageReference Include="sqlite-net-pcl" Version="1.9.172" />
    <PackageReference Include="Refit" Version="7.0.0" />
  </ItemGroup>

</Project>

.csproj 파일은 .NET MAUI 프로젝트 구성입니다. TargetFrameworks는 대상 플랫폼을 나열합니다. UseMaui는 MAUI SDK를 활성화합니다. PackageReference는 NuGet 종속성을 지정합니다. CommunityToolkit.Maui는 UI 구성 요소(토스트, 스낵바, Popup)를 제공합니다. sqlite-net-pcl은 로컬 데이터베이스입니다. Refit은 인터페이스 기반의 유형화된 HTTP 클라이언트입니다. dotnet build/publish는 모든 플랫폼용 애플리케이션을 빌드합니다.

자주 묻는 질문

C#란 무엇인가요?

C#는 Microsoft(2000)의 객체 지향 프로그래밍 언어로, .NET 플랫폼(CLR)에서 실행됩니다. Xamarin 및 .NET MAUI를 통해 모바일 개발에 사용됩니다. 엄격한 정적 유형 지정, 자동 메모리 관리(GC), LINQ, async/await 및 제네릭을 결합합니다. TIOBE 지수(2026)에서 4위를 차지했습니다. Anders Hejlsberg가 개발했습니다.

Xamarin과 .NET MAUI의 차이점은 무엇인가요?

Xamarin은 이전 제품(2011-2024)으로, 프로젝트를 Xamarin.Android와 Xamarin.iOS로 분리했습니다. .NET MAUI(2022+)는 공유 XAML 마크업, Renderer 대신 Handler 아키텍처, 5개 플랫폼(iOS, Android, Windows, macOS, Tizen) 지원을 갖춘 단일 .csproj 프로젝트입니다. Xamarin은 유지 관리 모드로 전환되었으며, 새 프로젝트는 .NET MAUI로 생성됩니다. NativeAOT는 .NET MAUI에서만 사용할 수 있습니다.

C#는 모바일 플랫폼에서 어떻게 작동하나요?

C#는 CIL(Common Intermediate Language)로 컴파일되며, NativeAOT(.NET MAUI) 또는 Mono(Xamarin)가 네이티브 ARM 코드로 변환합니다. Android는 IL 실행을 위해 Mono 런타임(Xamarin) 또는 NativeAOT(.NET MAUI)를 사용합니다. iOS는 AOT 컴파일이 필요합니다 — JIT는 Apple에 의해 금지됩니다. .NET MAUI는 인터페이스를 통한 플랫폼 구현으로 카메라, GPS, 센서를 위한 통합 API를 제공합니다.

C#는 어떤 데이터 유형을 지원하나요?

C#는 유형을 값 유형(int, double, bool, char, struct, enum — 스택)과 참조 유형(string, class, interface, array, delegate, record — 힙)으로 나눕니다. Nullable 유형(int?)은 값 유형에 null을 허용합니다. record(C# 9)는 값 기반 동등성을 가진 불변 참조 유형입니다. record struct(C# 10)는 값 버전입니다. dynamic — 동적 유형 지정. var — 컴파일러 유형 추론.

C# 모바일 개발에 어떤 도구가 사용되나요?

Visual Studio 2022(Windows) 및 Visual Studio for Mac — XAML 디자이너, 디버거 및 프로파일러를 갖춘 주요 IDE. .NET SDK — csc 컴파일러, dotnet CLI, MSBuild. NuGet — 패키지 관리자(300,000개 이상). CommunityToolkit.Maui — UI 구성 요소. JetBrains Rider — 대체 IDE. 테스트: xUnit, NUnit, Moq. CI/CD: Azure DevOps, GitHub Actions.

요약

  • C# — GC, LINQ 및 엄격한 유형 지정을 갖춘 .NET 플랫폼용 Microsoft 객체 지향 언어
  • .NET MAUI — 단일 프로젝트, Handler 아키텍처 및 5개 플랫폼을 갖춘 Xamarin의 후속 제품
  • XAML — C# 코드 비하인드와 함께 모든 플랫폼에서 공유되는 선언적 UI 마크업
  • LINQ — 지연 평가를 사용하는 컬렉션, 데이터베이스 및 XML용 내장 쿼리 언어
  • NativeAOT — 네이티브 코드로의 사전 컴파일, 시작 시간 50% 단축
  • NuGet — .NET MAUI 및 Xamarin을 위한 300,000개 이상의 라이브러리가 있는 패키지 관리자
  • Visual Studio 및 dotnet CLI — 빌드, 테스트 및 게시를 위한 주요 도구

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기