푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 및 .NET의 새로운 기능

C# 10 및 .NET 6에서 10분 이내에 null 매개변수 검사를 수행하는 방법

Tim Corey
4분 49초

C# 개발 환경에서 메서드에 null 인수가 전달되는 경우는 흔히 발생합니다. 이는 제대로 처리하지 않을 경우 예상치 못한 동작, 런타임 오류, 심지어 처리되지 않은 예외로 이어질 수 있습니다. Tim Corey는 자신의 비디오 " C# 10 및 .NET 6에서 10분 이내에 null 매개변수 검사하기 "에서 C# 10이 ArgumentNullException 클래스를 사용하여 null 값 처리를 어떻게 간소화했는지 설명합니다.

이 글에서는 Tim이 설명하는 그대로 영상을 따라가면서 null 검사가 어떻게 작동하는지, 그리고 최신 C#에서 어떻게 개선되었는지 알아보겠습니다.

사전 준비 – null 매개변수 확인

Tim은 C#에서 null 매개변수 검사를 처리하는 방법을 보여주기 위해 간단한 .NET 6 콘솔 애플리케이션을 만드는 것으로 시작합니다. 그는 상투적인 코드를 제거하고 널 값을 허용하는 문자열 변수를 선언합니다.

string? info = null;
string? info = null;

이 null 객체는 메서드 호출 시 인수가 제대로 인스턴스화되지 않은 경우를 나타냅니다. 그런 다음 Tim은 간단한 방법을 정의합니다.

void SayHi(string message)
{
    Console.WriteLine($"안녕하세요 {message}");
}
void SayHi(string message)
{
    Console.WriteLine($"안녕하세요 {message}");
}

그는 정보 변수를 메서드에 전달합니다.

SayHi(info);
SayHi(info);

프로그램이 실행되면 출력에는 다음과 같은 내용만 표시됩니다.

안녕하세요

문자열 연결 함수는 null 값을 허용하고 이를 빈 문자열처럼 처리하므로 예외가 발생하지 않습니다. 하지만 Tim이 지적했듯이, 대부분의 실제 방법에서는 이로 인해 null 참조가 하위 호출 스택에서 문제나 NullReferenceException을 유발하는 등 오류 발생 가능성이 높은 상황이 발생할 수 있습니다.

견고한 코드를 작성하려면 개발자는 인수를 검증하고 모든 메서드가 유효하고 null이 아닌 입력을 기대하는지 확인해야 합니다.

C# 10 이전의 기존 널 검사

Tim은 C# 10 이전에는 매개변수를 수동으로 확인하고 필요한 경우 ArgumentNullException을 던지는 것이 좋은 관행이었다고 설명합니다. SayHi 방법론 내부에서 그는 다음과 같이 덧붙입니다.

if (message is null)
    throw new ArgumentNullException(nameof(message));
if (message is null)
    throw new ArgumentNullException(nameof(message));

이 검사는 null 인수가 전달될 경우 프로그램이 즉시 ArgumentNullException 클래스의 새 인스턴스를 던지도록 합니다.

팀이 코드를 실행하면 오류 메시지가 명확하게 표시됩니다.

System.ArgumentNullException: Value cannot be null. (Parameter 'message')
System.ArgumentNullException: Value cannot be null. (Parameter 'message')

이 처리되지 않은 예외는 해당 메서드가 유효하지 않은 인수를 받았음을 나타냅니다. 매개변수 이름(이 경우 'message')이 출력에 자동으로 표시되므로 개발자는 어떤 인수가 문제를 일으켰는지 정확히 파악할 수 있습니다.

Tim은 이 수동 검사가 .NET Framework 및 이전 .NET Core 버전에서는 완벽하게 작동한다고 언급했습니다. 하지만 여러 매개변수를 다룰 때는 장황하고 반복적입니다. 유효성 검사가 필요한 추가 매개변수가 하나씩 늘어날 때마다 코드가 서너 줄씩 추가되어 메서드 본문이 복잡해집니다.

C# 10에서의 간소화된 접근 방식 – ArgumentNullException.ThrowIfNull()

이 시점에서 Tim은 최신 C# 10 구문을 소개합니다. 이제 개발자는 각 매개변수에 대해 여러 줄을 작성하는 대신 한 줄로 null 검사를 작성할 수 있습니다.

ArgumentNullException.ThrowIfNull(message);
ArgumentNullException.ThrowIfNull(message);

팀은 이 한 줄짜리 코드가 내부적으로 동일한 유효성 검사 로직을 수행한다고 설명합니다. 전달된 인수가 null인 경우, 이전과 마찬가지로 메서드는 자동으로 예외를 발생시키지만, 구문은 훨씬 깔끔해졌습니다.

프로그램을 다시 실행하면 다음과 같은 출력이 나타납니다.

System.ArgumentNullException: Value cannot be null. (Parameter 'message')
System.ArgumentNullException: Value cannot be null. (Parameter 'message')

동작 방식은 동일하지만 구문이 간소화되었습니다. 생성자를 사용하여 ArgumentNullException 객체를 수동으로 인스턴스화하거나 paramName 매개변수를 수동으로 지정할 필요가 없습니다. 호출자의 매개변수 이름은 컴파일러에 의해 자동으로 추론됩니다.

팀은 이러한 개선이 시간을 절약하고 잘못된 매개변수 이름을 참조할 때 발생하는 인적 오류의 가능성을 줄여준다고 강조합니다.

예시: 여러 매개변수

그런 다음 팀은 여러 매개변수를 처리할 때 기존 방식과 새로운 방식을 비교합니다.

C# 10 이전에는 개발자가 다음과 같이 코드를 작성할 수 있었습니다.

if (name is null)
    throw new ArgumentNullException(nameof(name));
if (email is null)
    throw new ArgumentNullException(nameof(email));
if (password is null)
    throw new ArgumentNullException(nameof(password));
if (name is null)
    throw new ArgumentNullException(nameof(name));
if (email is null)
    throw new ArgumentNullException(nameof(email));
if (password is null)
    throw new ArgumentNullException(nameof(password));

C# 10의 개선 사항 덕분에 이제 동일한 검사를 더욱 간결하게 작성할 수 있습니다.

ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);
ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);

이러한 개선은 단순히 코드 줄 수를 줄이는 것뿐만 아니라, 메서드를 더 깔끔하고 읽기 쉬우며 유지 관리하기 쉽게 만들어줍니다. 팀은 메서드가 세 개의 매개변수를 필요로 하는 경우, 이제 12줄의 코드가 아닌 3개의 null 검사만 필요하다고 지적합니다.

이것이 중요한 이유 – 더 안전하고 견고한 코드

팀은 데모에서 문자열에 null 값을 수동으로 전달하는 것이 현실적이지 않을 수 있지만, 실제 문제를 나타낸다고 지적합니다. API, 사용자 입력, 역직렬화 프로세스 또는 객체 반환 작업으로 인해 예기치 않게 null 객체가 반환될 수 있습니다.

메서드 시작 부분에 null 검사를 추가하면 예상치 못한 동작을 방지하고 빠르게 오류를 발생시킬 수 있습니다. 즉, 문제가 전파되기 전에 호출 스택 초기에 예외를 던질 수 있습니다.

그는 또한 이 새로운 구문이 메서드 전체에서 일관된 오류 처리 패턴을 유지하는 데 도움이 된다고 언급합니다. 이는 잘못된 입력과 인스턴스화되지 않은 객체에 대해 복원력이 뛰어난 견고한 코드를 작성하도록 장려합니다.

ArgumentNullException 세부 정보

Tim은 ArgumentNullException이 System 네임스페이스의 일부이며 ArgumentException 클래스를 상속받는다는 점을 강조합니다. 이 예외는 null 참조를 유효한 인수로 허용하지 않는 메서드에 null 참조가 전달될 때 발생합니다.

일반적으로 다음이 포함됩니다.

  • 문제를 일으킨 매개변수 이름입니다.

  • 명확한 오류 메시지: "값이 null일 수 없습니다."

  • 예외가 발생한 위치를 보여주는 호출 스택.

Tim의 예시는 .NET 6이 구문을 개선하면서도 이러한 동작을 계속 유지하는 방식을 보여줍니다.

그는 또한 개발자가 이러한 검사를 null 병합 연산자(??) 또는 기본값과 같은 다른 기능과 결합하여 대체 로직을 제공할 수 있다고 간략하게 언급합니다. 예를 들면 다음과 같습니다.

message ??= "Default message";
message ??= "Default message";

이를 통해 원하는 경우 예외를 발생시키는 대신 메서드에 기본값을 할당할 수 있습니다.

오류 처리에서 널 검사의 중요성

Tim은 C#이 이제 null 허용 참조 형식을 지원하지만 런타임 null 검사는 여전히 필수적이라는 점을 개발자들에게 상기시킵니다. 컴파일러는 모든 null 참조 문제를 잡아낼 수는 없습니다. 특히 데이터가 외부 소스나 개발자가 제어할 수 없는 메서드에서 오는 경우에는 더욱 그렇습니다.

그는 인수를 확인하고 적절한 경우 ArgumentNullException을 발생시키는 것이 좋은 관행이며, 이를 통해 입력이 유효할 때만 메서드가 실행되도록 보장한다고 강조합니다. 이렇게 하면 런타임 오류가 최소화되고, 오류 처리가 간소화되며, 오류 발생 시 아무런 알림이 없는 상태가 되는 것을 방지할 수 있습니다.

마무리 및 향후 전망

Tim은 결론적으로 C# 11에서 더 많은 개선 사항이 도입될 것이라고 언급하면서도, 현재로서는 ArgumentNullException.ThrowIfNull()이 .NET 6에서 오류 처리 및 코드 안전성을 향상시키는 데 있어 가장 훌륭한 작은 개선 사항 중 하나라고 말합니다.

그는 개발자들에게 자신의 프로젝트에서 이 접근 방식을 시도해보고 메서드가 얼마나 깔끔해지는지 확인해 보라고 권장합니다. 그는 마지막으로 "C# 10의 이러한 변화에 대해 어떻게 생각하시나요?"라는 질문을 던집니다.

마지막으로

Tim Corey의 영상 은 ArgumentNullException.ThrowIfNull() 메서드가 C# 10에서 간단하지만 강력한 개선 사항임을 명확히 보여줍니다. 이 메서드는 오류 발생 가능성이 높은 수동 코드를 줄이고, 유효한 인수를 보장하며, null 인수가 전달될 경우 프로그램이 즉시 오류를 발생시키도록 합니다.

이 방법을 일관되게 사용하면 개발자는 예외를 깔끔하게 처리하고 미묘한 null 참조 버그를 방지하는 견고하고 가독성이 뛰어나며 유지 관리하기 쉬운 코드를 작성할 수 있습니다.

요약하자면, 메서드가 유효한 매개변수를 기대하고 null 인수를 방지하려면 Tim Corey의 예시를 따라 다음과 같이 사용하십시오.

ArgumentNullException.ThrowIfNull(parameterName);
ArgumentNullException.ThrowIfNull(parameterName);

이는 .NET 6 이상에서 null 값 및 런타임 오류로부터 코드를 보호하는 더 깔끔하고 안전하며 현대적인 방법입니다.

Hero Worlddot related to C# 10 및 .NET 6에서 10분 이내에 null 매개변수 검사를 수행하는 방법
Hero Affiliate related to C# 10 및 .NET 6에서 10분 이내에 null 매개변수 검사를 수행하는 방법

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해