C# - Nullables

안녕하세요, 야심찬 프로그래머 여러분! 오늘 우리는 C#에서의 Nullables이라는 흥미로운 세계로 뛰어들어 보겠습니다. 프로그래밍 초보자라고 걱정하지 마세요 - 나는 이 개념을 단계별로 안내해 드릴 것입니다. 수년간 많은 학생들을 가르친 경험을 바탕으로 말입니다. 이 흥미로운 여정을 함께 시작해 보겠습니다!

C# -  Nullables

Nullables는 무엇인가요?

생각해 보세요. 양식을 작성할 때 중간 이름 필드가 있다고 가정해 봅시다. 하지만 중간 이름이 없다면 어떻게 될까요? 현실 세계에서는 그냥 공백으로 두시죠. C#에서도 이와 유사한 개념이 있습니다. 바로 Nullables입니다.

Nullables은 C#의 특별한 기능으로, 값을 가지는 타입(예: int, double, bool)이 추가적인 상태인 null을 가질 수 있게 해줍니다. 일반적으로 값 타입은 null이 될 수 없지만, Nullables은 이러한 유연성을 제공합니다.

기본 문법

Nullables 타입을 선언할 때는 타입 이름 뒤에 ? 기호를 사용합니다. 다음은 예제입니다:

int? nullableInt = null;
double? nullableDouble = 3.14;
bool? nullableBool = true;

이 코드에서:

  • nullableInt는 null이 될 수 있는 정수이며, 우리는 그것을 null로 설정했습니다.
  • nullableDouble는 null이 될 수 있는 더블이지만, 우리는 그것에 값을 부여했습니다.
  • nullableBool는 null이 될 수 있는 불리언이며, 우리는 그것을 true로 설정했습니다.

null 확인

Nullables을 사용할 때는 사용하기 전에 값이 있는지 확인하는 것이 중요합니다. 이를 HasValue 프로퍼티를 사용하여 할 수 있습니다:

int? maybeNumber = null;

if (maybeNumber.HasValue)
{
Console.WriteLine($"The value is: {maybeNumber.Value}");
}
else
{
Console.WriteLine("The value is null");
}

이 코드는 maybeNumber에 값이 있는지 확인합니다. 값이 있다면 값을 인쇄하고, 그렇지 않으면 null이라고 출력합니다.

Nullables 값 사용

Nullables의 값을 사용하려면 Value 프로퍼티에 접근할 수 있습니다. 하지만 주의해야 합니다! null인 Nullables의 Value에 접근하려고 하면 예외가 발생합니다. 다음은 안전한 방법입니다:

int? possibleAge = 25;

int actualAge = possibleAge ?? 0;

Console.WriteLine($"Age: {actualAge}");

이 예제에서, possibleAge가 null이면 actualAge는 0이 됩니다. 이제 다음 주제로 넘어가겠습니다...

null 결합 연산자 (??)

null 결합 연산자 (??)는 잠재적인 null 값을 다루는 데 도움을 주는 친절한 지킴이입니다. 이 연산자는 "null이 아니면 이 값을 사용하고, 그렇지 않으면 이 대체 값을 사용하라"는 의미의 약자입니다.

기본 사용법

null 결합 연산자를 사용하는 방법은 다음과 같습니다:

string name = null;
string displayName = name ?? "Guest";

Console.WriteLine($"Welcome, {displayName}!");

이 코드에서, name이 null이면 (그렇다면) displayName은 "Guest"로 설정됩니다. 이는 기본 값을 제공하는 간결한 방법입니다.

null 결합 연산자 연결

여러 개의 ?? 연산자를 연결하여 여러 잠재적 값을 확인할 수 있습니다:

string firstName = null;
string middleName = null;
string lastName = "Smith";

string fullName = firstName ?? middleName ?? lastName ?? "Unknown";

Console.WriteLine($"Full name: {fullName}");

이 코드는 첫 번째 비-null 값을 사용하거나, 모두 null이면 "Unknown"을 사용합니다.

메서드 호출과 null 결합 연산자

?? 연산자는 메서드 호출에도 사용할 수 있습니다:

public string GetUserName()
{
// 이 메서드는 null을 반환할 수 있습니다.
return null;
}

string userName = GetUserName() ?? "DefaultUser";
Console.WriteLine($"User: {userName}");

이는 메서드가 null을 반환할 수 있는 경우에 매우 유용합니다.

실제 예제

Nullables과 null 결합 연산자가 유용한 실제 상황을 몇 가지 살펴보겠습니다:

예제 1: 사용자 입력

Console.Write("Enter your age (or press Enter to skip): ");
string input = Console.ReadLine();

int? age = string.IsNullOrEmpty(input) ? null : int.Parse(input);

string message = age.HasValue
? $"You are {age.Value} years old."
: "Age not provided.";

Console.WriteLine(message);

이 코드는 사용자가 나이를 입력하거나 건너뛰는 선택을 할 수 있게 합니다. 우리는 Nullable int를 사용하여 나이가 제공되었는지 여부를 나타냅니다.

예제 2: 데이터베이스 쿼리

사용자 정보를 데이터베이스에서 조회하는 상황을 상상해 봅시다:

public class User
{
public string Name { get; set; }
public int? Age { get; set; }
}

User user = GetUserFromDatabase(); // 이 메서드가 존재한다고 가정합니다.

string ageDisplay = user.Age.HasValue
? $"{user.Age.Value} years old"
: "Age unknown";

Console.WriteLine($"User: {user.Name ?? "Anonymous"}, {ageDisplay}");

이 예제에서 우리는 사용자의 나이가 데이터베이스에 없을 수 있음을 Nullables을 사용하여 처리하고, null 결합 연산자를 사용하여 기본 이름을 제공합니다.

결론

Nullables과 null 결합 연산자는 C#에서 더 강력하고 유연한 코드를 작성하는 데 도움이 되는 강력한 도구입니다. 이들은 데이터가 누락될 수 있는 상황을 처리하여 우리의 프로그램을 더 견고하고 사용자 친화적으로 만듭니다.

기억하세요, 프로그래밍은 요리와 같아요 - 연습이 필요합니다. 이 개념들을 자신의 프로젝트에서 실험해 보지 마세요. 얼마 지나지 않아 Nullables과 ?? 연산자를 마스터하실 것입니다!

계속 코딩하고, 학습하고, 프로그래밍 여정에서 즐거움을 느껴보세요!

메서드/연산자 설명 예제
? (Nullable type declaration) 값을 가지는 타입을 nullable로 선언 int? nullableInt = null;
HasValue nullable이 값이 있는지 확인 if (nullableInt.HasValue) { ... }
Value nullable의 값을 접근 int value = nullableInt.Value;
?? (Null coalescing operator) null이 아니면 이 값을 사용하고, 그렇지 않으면 이 대체 값을 사용 int result = nullableInt ?? 0;
GetValueOrDefault() 값이 없으면 기본값을 반환 int value = nullableInt.GetValueOrDefault();
GetValueOrDefault(T defaultValue) 값이 없으면 지정된 기본값을 반환 int value = nullableInt.GetValueOrDefault(10);

Credits: Image by storyset