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
클래스와 같은 많은 형식과 IO
및 Collections
와 같은 기타 많은 네임스페이스가 포함되어 있습니다. 지정된 네임스페이스를 참조하는 using
지시문을 사용하여 해당 네임스페이스의 멤버인 형식을 정규화되지 않은 방식으로 사용할 수 있습니다. using
지시문 때문에, 프로그램은 Console.WriteLine
을 System.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
, else
및 switch
와 같은 제어 문, for
및 while
과 같은 반복 구문을 동일하게 사용합니다. C#에는 모든 컬렉션 형식에 대한 foreach
문도 있습니다.
C#은 강력한 형식의 언어입니다. 선언하는 모든 변수에는 컴파일 시간에 알려진 형식이 있습니다. 컴파일러나 편집 도구는 해당 형식을 잘못 사용하고 있는지 알려 줍니다. 프로그램을 실행하기 전에 이러한 오류를 수정할 수 있습니다. 기본 데이터 형식은 언어 및 런타임에 기본 제공되어 있습니다. 즉, int
, double
, char
와 같은 값 형식, string
과 같은 참조 형식, 배열 및 기타 컬렉션이 있습니다. 프로그램을 작성하면서 고유의 형식을 만들게 됩니다. 이러한 형식은 값의 경우 struct
형식이거나 개체 지향 동작을 정의하는 class
형식일 수 있습니다. 컴파일러가 동등 비교를 위해 코드를 합성하도록 struct
또는 class
형식에 record
한정자를 추가할 수 있습니다. 해당 인터페이스를 구현하는 형식이 제공해야 하는 계약 또는 멤버 집합을 정의하는 interface
정의를 만들 수도 있습니다. 제네릭 형식 및 메서드를 정의할 수도 있습니다. 제네릭은 형식 매개 변수를 사용하여 사용 시 실제 형식에 대한 자리 표시자를 제공합니다.
코드를 작성할 때 메서드라고도 하는 함수를 struct
및 class
형식의 멤버로 정의합니다. 이러한 메서드는 형식의 동작을 정의합니다. 다양한 수 또는 형식의 매개 변수를 사용하여 메서드를 오버로드할 수 있습니다. 메서드는 선택적으로 값을 반환할 수 있습니다. 메서드 외에도 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 구조일 수 있습니다. 모든 스토리지 유형에 동일한 쿼리 구문이 적용됩니다.
작업 기반 비동기 프로그래밍 모델을 사용하면 비동기적으로 실행되더라도 동기적으로 실행되는 것처럼 읽는 코드를 작성할 수 있습니다. 비동기식 메서드와 식이 비동기식으로 평가되는 경우를 설명하기 위해 async
및 await
키워드를 활용합니다. 다음 샘플은 비동기 웹 요청을 기다립니다. 비동기 작업이 완료되면 메서드는 응답 길이를 반환합니다.
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, or 및 xor 연산의 메서드를 표현하는 방법을 보여 줍니다.
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#에 대한 풍부한 이해를 제공합니다. 또한 디버깅 기능도 제공합니다.
.NET