LINQ(Language Integrated Query)

C# 및 .NET 언어들에서 제공하는 데이터 질의(Query)를 수행하는 기능이다. 이는 SQL과 유사한 구문을 사용하여 데이터를 검색, 필터링, 정렬, 그룹화하는 등의 작업을 할 수 있다. LINQ는 코드의 가독성을 높이고 유지보수를 용이하게 만들며, 데이터베이스, 컬렉션, XML 등과 같은 다양한 데이터 소스에서 작업할 수 있다.

LINQ를 사용하면 데이터를 다루는 코드를 직접 작성하여 반복적인 작업을 수행하는 대신, LINQ 쿼리를 사용하여 간결하고 강력한 방식으로 데이터를 조작할 수 있다. 

 

다음은 LINQ 쿼리 예제로 컬렉션에서 숫자 5보다 큰 값을 찾아내는 역할을 한다.

var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var result = from number in numbers
             where number > 5
             select number;

Nullable

Nullable은 값 형식(variable type)에 null 값을 할당할 수 있게 해주는 형식이다.

기본적으로 C#에서 값 형식은 null을 허용하지 않지만 Nullable을 사용하면 값 형식 변수에 null을 할당할 수 있다.

Nullable은 물음표(?)를 사용하여 정의된다.

예를 들어 int?, double?, DateTime? 과 같이 값 형식 뒤에 물음표를 붙여서 Nullable 형식을 나타낸다.

Nullable 변수에서 사용될 수 있는 속성

  1. HasValue: 변수가 null인지 여부를 확인 값이 있으면 true를 반환하고 그렇지 않으면 false를 반환
  2. Value:  변수에 실제 값이 있는 경우 그 값을 반환  변수가 null인 경우에는 예외를 발생
  3. GetValueOrDefault(): 변수가 null인 경우 기본 값을 반환 변수에 값이 있는 경우 그 값을 반환하고 null인 경우 지정된 기본값을 반환
  4. GetValueOrDefault(T defaultValue): 변수가 null인 경우 지정된 기본값을 반환 변수에 값이 있는 경우 그 값을 반환하고 null인 경우 지정된 기본값을 반환
  5. ValueOrDefault: C# 8.0에서 도입된 새로운 속성으로 Value 속성의 간소화된 버전 변수가 null이면 기본값을 반환하고 그렇지 않으면 실제 값을 반환
// Nullable 형식 변수 선언
int? nullableInt = null;
double? nullableDouble = 3.14;
bool? nullableBool = true;

// 값 할당 및 접근
nullableInt = 10;
int intValue = nullableInt.Value;

// null 값 검사
if (nullableDouble.HasValue)
{
    Console.WriteLine("nullableDouble 값: " + nullableDouble.Value);
}
else
{
    Console.WriteLine("nullableDouble은 null입니다.");
}

// null 병합 연산자 사용
// nullableInt ?? 0과 같이 사용되며, nullableInt가 null이면 0을 반환합니다.
int nonNullableInt = nullableInt ?? 0;
Console.WriteLine("nonNullableInt 값: " + nonNullableInt);

문자열 빌더 (StringBuilder)

StringBuilder는 C#에서 문자열을 효율적으로 조작하고 처리하기 위한 클래스이다. 

StringBuilder는 가변(mutable)하며 문자열을 변경할 때마다 새로운 문자열을 생성하지 않고 기존 문자열을 직접 조작한다.

따라서 문자열을 빈번하게 변경해야 할 경우에는 StringBuilder를 사용하는 것이 성능적으로 유리하다.

StringBuilder 클래스는 다음과 같은 주요 멤버들을 포함하고 있다

  1. Append(): 문자열을 끝에 추가합니다.
  2. Insert(): 지정된 위치에 문자열을 삽입합니다.
  3. Remove(): 지정된 범위의 문자열을 제거합니다.
  4. Replace(): 지정된 문자열을 다른 문자열로 대체합니다.
  5. Clear(): StringBuilder의 내용을 모두 지웁니다.
  6. Length: StringBuilder에 현재 저장된 문자열의 길이를 가져오거나 설정합니다.
  7. Capacity: StringBuilder의 내부 버퍼 크기를 가져오거나 설정합니다.
using System;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        // StringBuilder 인스턴스 생성
        StringBuilder sb = new StringBuilder();

        // Append 메서드를 사용하여 문자열을 끝에 추가합니다.
        sb.Append("Hello");

        // AppendLine 메서드를 사용하여 새로운 줄과 함께 문자열을 추가합니다.
        sb.AppendLine(" World");

        // Insert 메서드를 사용하여 지정된 위치에 문자열을 삽입합니다.
        sb.Insert(6, "C# ");

        // Replace 메서드를 사용하여 지정된 문자열을 다른 문자열로 대체합니다.
        sb.Replace("World", "Universe");

        // Remove 메서드를 사용하여 지정된 범위의 문자열을 제거합니다.
        sb.Remove(0, 5); // 인덱스 0부터 5개의 문자 제거

        // StringBuilder의 내용을 출력합니다.
        Console.WriteLine("StringBuilder 내용: " + sb.ToString());

        // Length 속성을 사용하여 StringBuilder의 길이를 가져옵니다.
        Console.WriteLine("StringBuilder 길이: " + sb.Length);

        // Capacity 속성을 사용하여 StringBuilder의 내부 버퍼 크기를 가져옵니다.
        Console.WriteLine("StringBuilder 내부 버퍼 크기: " + sb.Capacity);

        // Clear 메서드를 사용하여 StringBuilder의 내용을 모두 지웁니다.
        sb.Clear();

        // StringBuilder의 내용이 모두 지워졌는지 확인합니다.
        Console.WriteLine("StringBuilder 내용이 모두 지워졌는가? " + (sb.Length == 0 ? "예" : "아니오"));
    }
}
728x90