Share via


C# 언어 둘러보기

C# 언어는 무료 플랫폼 간 오픈 소스 개발 환경인 .NET 플랫폼에서 가장 널리 사용되는 언어입니다. C# 프로그램은 IoT(사물 인터넷) 디바이스에서 클라우드에 이르기까지 다양한 디바이스에서 실행될 수 있습니다. 휴대폰, 데스크톱, 랩톱 컴퓨터 및 서버용 앱을 작성할 수 있습니다.

C#은 성능이 뛰어난 코드를 작성하면서 개발자의 생산성을 높이는 플랫폼 간 범용 언어입니다. 수백만 명의 개발자가 있는 C#은 가장 인기 있는 .NET 언어입니다. C#은 에코시스템 및 모든 .NET 워크로드를 광범위하게 지원합니다. 개체 지향 원칙에 기반하여 함수형 프로그래밍을 비롯한 다른 패러다임의 많은 기능을 통합합니다. 하위 수준 기능은 안전하지 않은 코드를 작성하지 않고도 고효율 시나리오를 지원합니다. 대부분의 .NET 런타임 및 라이브러리는 C#으로 작성되며 C#의 발전은 모든 .NET 개발자에게 도움이 되는 경우가 많습니다.

Hello World

“Hello, World” 프로그램은 프로그래밍 언어를 소개하는 데 일반적으로 사용됩니다. C#에서는 다음과 같습니다.

// This line prints "Hello, World" 
Console.WriteLine("Hello, World");

//로 시작하는 줄은 한 줄 주석입니다. C# 한 줄 주석은 //로 시작하여 현재 줄 끝까지 계속됩니다. C#은 여러 줄 주석도 지원합니다. 여러 줄 주석은 /*로 시작하고 */로 끝납니다. System 네임스페이스에 있는 Console 클래스의 WriteLine 메서드는 프로그램의 출력을 생성합니다. 이 클래스는 기본적으로 모든 C# 프로그램에서 자동으로 참조되는 표준 클래스 라이브러리에서 제공됩니다.

앞의 예는 최상위 문을 사용하는 "Hello, World" 프로그램의 한 형태를 보여 줍니다. 이전 버전의 C#에서는 메서드에서 프로그램의 진입점을 정의해야 했습니다. 이 형식은 여전히 유효하며 많은 기존 C# 샘플에서 볼 수 있습니다. 다음 예에 표시된 것처럼 이 형식에도 익숙해야 합니다.

using System;

class Hello
{
    static void Main()
    {
        // This line prints "Hello, World" 
        Console.WriteLine("Hello, World");
    }
}

이 버전은 프로그램에서 사용하는 구성 요소를 보여 줍니다. “Hello, World” 프로그램은 System 네임스페이스를 참조하는 using 지시문으로 시작합니다. 네임스페이스는 계층적으로 C# 프로그램 및 라이브러리를 구성하는 방법을 제공합니다. 네임스페이스에는 형식 및 기타 네임스페이스가 포함됩니다. 예를 들어, System 네임스페이스에는 프로그램에서 참조되는 Console 클래스와 같은 많은 형식과 IOCollections와 같은 기타 많은 네임스페이스가 포함되어 있습니다. 지정된 네임스페이스를 참조하는 using 지시문을 사용하여 해당 네임스페이스의 멤버인 형식을 정규화되지 않은 방식으로 사용할 수 있습니다. using 지시문 때문에, 프로그램은 Console.WriteLineSystem.Console.WriteLine의 약식으로 사용할 수 있습니다. 이전 예에서는 해당 네임스페이스가 암시적으로 포함되었습니다.

“Hello, World” 프로그램에서 선언된 Hello 클래스에는 단일 멤버인 Main 메서드가 있습니다. Main 메서드는 static 한정자로 선언됩니다. 인스턴스 메서드는 키워드 this를 사용하여 특정 바깥쪽 개체 인스턴스를 참조할 수 있지만 정적 메서드는 특정 개체에 대한 참조 없이 작동합니다. 관례적으로 최상위 문이 없으면 Main이라는 정적 메서드가 C# 프로그램의 진입점 역할을 합니다.

두 진입점 형식 모두 동등한 코드를 생성합니다. 최상위 문을 사용하면 컴파일러는 프로그램 진입점에 대한 포함 클래스와 메서드를 합성합니다.

이 문서의 예에서는 C# 코드를 처음으로 살펴봅니다. 일부 샘플에는 익숙하지 않은 C# 요소가 표시될 수 있습니다. C#을 알아볼 준비가 되면 초보자 자습서부터 시작하거나 각 섹션의 링크를 살펴봅니다. Java, JavaScript, TypeScript 또는 Python 사용 환경이 있는 경우 C#을 빠르게 배우는 데 필요한 정보를 찾는 데 도움이 되는 팁을 읽어보세요.

익숙한 C# 기능

C#은 초보자가 접근하기 쉬우면서도 특수 애플리케이션을 작성하는 숙련된 개발자를 위한 유용한 기능을 제공합니다. 빠르게 생산성을 높일 수 있습니다. 사용자의 응용 분야에 필요하다면 보다 전문적인 기술을 알아볼 수 있습니다.

C# 앱은 .NET 런타임의 자동 메모리 관리를 활용합니다. C# 앱은 .NET SDK에서 제공하는 광범위한 런타임 라이브러리도 사용합니다. 파일 시스템 라이브러리, 데이터 수집, 수학 라이브러리와 같은 일부 구성 요소는 플랫폼 독립적입니다. 다른 것들은 ASP.NET Core 웹 라이브러리 또는 .NET MAUI UI 라이브러리와 같은 단일 워크로드에만 해당됩니다. NuGet의 풍부한 오픈 소스 에코시스템은 런타임의 일부인 라이브러리를 강화합니다. 이러한 라이브러리는 사용할 수 있는 더 많은 구성 요소를 제공합니다.

C#은 C 언어 계열에 속합니다. C, C++, JavaScript 또는 Java를 사용해 본 적이 있다면 C# 구문이 익숙할 것입니다. C 계열의 모든 언어와 마찬가지로 세미콜론(;)은 문의 끝을 정의합니다. C# 식별자는 대/소문자를 구분합니다. C#에서는 중괄호, {}, if, elseswitch와 같은 제어 문, forwhile과 같은 반복 구문을 동일하게 사용합니다. C#에는 모든 컬렉션 형식에 대한 foreach 문도 있습니다.

C#은 강력한 형식의 언어입니다. 선언하는 모든 변수에는 컴파일 시간에 알려진 형식이 있습니다. 컴파일러나 편집 도구는 해당 형식을 잘못 사용하고 있는지 알려 줍니다. 프로그램을 실행하기 전에 이러한 오류를 수정할 수 있습니다. 기본 데이터 형식은 언어 및 런타임에 기본 제공되어 있습니다. 즉, int, double, char와 같은 값 형식, string과 같은 참조 형식, 배열 및 기타 컬렉션이 있습니다. 프로그램을 작성하면서 고유의 형식을 만들게 됩니다. 이러한 형식은 값의 경우 struct 형식이거나 개체 지향 동작을 정의하는 class 형식일 수 있습니다. 컴파일러가 동등 비교를 위해 코드를 합성하도록 struct 또는 class 형식에 record 한정자를 추가할 수 있습니다. 해당 인터페이스를 구현하는 형식이 제공해야 하는 계약 또는 멤버 집합을 정의하는 interface 정의를 만들 수도 있습니다. 제네릭 형식 및 메서드를 정의할 수도 있습니다. 제네릭형식 매개 변수를 사용하여 사용 시 실제 형식에 대한 자리 표시자를 제공합니다.

코드를 작성할 때 메서드라고도 하는 함수를 structclass 형식의 멤버로 정의합니다. 이러한 메서드는 형식의 동작을 정의합니다. 다양한 수 또는 형식의 매개 변수를 사용하여 메서드를 오버로드할 수 있습니다. 메서드는 선택적으로 값을 반환할 수 있습니다. 메서드 외에도 C# 형식에는 접근자라는 함수가 지원하는 데이터 요소인 속성이 있을 수 있습니다. C# 형식은 구독자에게 중요한 작업을 알릴 수 있는 이벤트를 정의할 수 있습니다. C#은 class 형식에 대한 상속 및 다형성과 같은 개체 지향 기술을 지원합니다.

C# 앱은 예외를 사용하여 오류를 보고하고 처리합니다. C++ 또는 Java를 사용해 본 적이 있다면 이 방법에 익숙할 것입니다. 의도한 대로 수행할 수 없는 경우 코드에서 예외가 throw됩니다. 다른 코드는 호출 스택의 수준에 관계없이 try - catch 블록을 사용하여 선택적으로 복구할 수 있습니다.

독특한 C# 기능

C#의 일부 요소는 익숙하지 않을 수 있습니다. LINQ(언어 통합 쿼리)는 모든 데이터 컬렉션을 쿼리하거나 변환하는 일반적인 패턴 기반 구문을 제공합니다. LINQ는 메모리 내 컬렉션, XML 또는 JSON과 같은 구조화된 데이터, 데이터베이스 스토리지, 심지어 클라우드 기반 데이터 API를 쿼리하기 위한 구문을 통합합니다. 하나의 구문 집합을 학습하면 스토리지에 관계없이 데이터를 검색하고 조작할 수 있습니다. 다음 쿼리는 평점 평균이 3.5보다 큰 모든 학생을 찾습니다.

var honorRoll = from student in Students
                where student.GPA > 3.5
                select student;

앞의 쿼리는 Students로 표시되는 다양한 스토리지 유형에 대해 작동합니다. 개체 컬렉션, 데이터베이스 테이블, 클라우드 스토리지 Blob 또는 XML 구조일 수 있습니다. 모든 스토리지 유형에 동일한 쿼리 구문이 적용됩니다.

작업 기반 비동기 프로그래밍 모델을 사용하면 비동기적으로 실행되더라도 동기적으로 실행되는 것처럼 읽는 코드를 작성할 수 있습니다. 비동기식 메서드와 식이 비동기식으로 평가되는 경우를 설명하기 위해 asyncawait 키워드를 활용합니다. 다음 샘플은 비동기 웹 요청을 기다립니다. 비동기 작업이 완료되면 메서드는 응답 길이를 반환합니다.

public static async Task<int> GetPageLengthAsync(string endpoint)
{
    var client = new HttpClient();
    var uri = new Uri(endpoint);
    byte[] content = await client.GetByteArrayAsync(uri);
    return content.Length;
}

C#은 GraphQL 페이징 API와 같은 비동기 작업으로 지원되는 컬렉션을 반복하는 await foreach 문도 지원합니다. 다음 샘플은 데이터를 청크로 읽고, 사용 가능한 경우 각 요소에 대한 액세스를 제공하는 반복기를 반환합니다.

public static async IAsyncEnumerable<int> ReadSequence()
{
    int index = 0;
    while (index < 100)
    {
        int[] nextChunk = await GetNextChunk(index);
        if (nextChunk.Length == 0)
        {
            yield break;
        }
        foreach (var item in nextChunk)
        {
            yield return item;
        }
        index++;
    }
}

호출자는 await foreach 문을 사용하여 컬렉션을 반복할 수 있습니다.

await foreach (var number in ReadSequence())
{
    Console.WriteLine(number);
}

C#은 패턴 일치를 제공합니다. 이러한 식을 사용하면 데이터를 검사하고 해당 특성에 따라 결정을 내릴 수 있습니다. 패턴 일치는 데이터 기반 제어 흐름에 대한 훌륭한 구문을 제공합니다. 다음 코드는 패턴 일치 구문을 사용하여 부울 and, orxor 연산의 메서드를 표현하는 방법을 보여 줍니다.

public static bool Or(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

public static bool And(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => false,
        (false, true) => false,
        (false, false) => false,
    };
public static bool Xor(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => false,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

패턴 일치 식은 모든 값에 대한 catch all로 _을 사용하여 간소화할 수 있습니다. 다음 예에서는 and 메서드를 간소화하는 방법을 보여 줍니다.

public static bool ReducedAnd(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (_, _) => false,
    };

마지막으로, .NET 에코시스템의 일부로 Visual Studio 또는 C# DevKit과 함께 Visual Studio Code를 사용할 수 있습니다. 이러한 도구는 사용자가 작성하는 코드를 포함하여 C#에 대한 풍부한 이해를 제공합니다. 또한 디버깅 기능도 제공합니다.