C# :: Lecture & TIPs

[C#] Null-Conditional Operators (무효 조건 연산자)

이번 포스팅에서는 C# 6.0 에서 소개되었던 무효 조건 연산자 (Null-Conditional Operators) 에 대해 알아보도록 하겠습니다. 기존에는 어떠한 종류의 객체도 참조하지 않을 경우 NullReferenceException 예외를 처리하여야 했으므로 값의 유무 여부를 확인하는 코드를 계속해서 작성하여야 했지만 C# 6.0 부터는 연산자 하나로 깔끔하게 해결 할 수 있게 되었습니다.

코드를 통해 예시를 살펴보면 다음과 같이 변수에 값이 존재하지 않는, null (무효) 조건인지 확인하는 코드가 반복적으로 등장하는 경우가 빈번했습니다. 개발자 입장에서는 이러한 코드들로 인하여 핵심 코드가 뒷 부분으로 뒤처지게 도거나 매번 값을 확인하는 코드를 계속해서 작성하여야 하는 비효율적인 부분들이 존재했었습니다.

public static string GetValue(string value, int length)
{
    string result = value;
    if (value != null) // 설명을 위해 빈 문자열 확인 과정은 생략합니다.
    {
        result = value.Substring(0, Math.Min(value.Length, length));
    }
    return result;
}

그런데 C# 6.0 부터는 이러한 작업들을 상당히 간결하면서도 명확하게 연산자 하나로 단순화 할 수 있게 되었습니다.

연산자설명사용 예시
?.Member (멤버) 에 접근하기 전 확인customers?.
?[]Indexing (인덱싱) 작업을 수행하기 전 확인customers?[0]

두 가지 연산자 모두 왼쪽의 피연산자 값을 확인 한 다음, 피연산자의 값이 존재하는 경우에만 연산자 오른쪽의 표현식을 실행하게 됩니다. 만약 왼쪽 피 연산자의 값이 존재하지 않는 무효 값 (null) 이라면 연산자 오른쪽의 표현식을 실행하지 않고 존재하지 않는 무효 값 (null) 그대로를 반환합니다.

이제 어떻게 위의 예제 코드를 방금 소개드린 연산자를 이용하여 변경할 수 있는지 살펴볼까요?

public static string GetValue(string value, int length)
{
    return value?.Substring(0, Math.Min(value.Length, length));
}

여기서 Substring() Method (메소드) 를 호출하기 위해 Member (멤버) 인 value 에 접근하기 전, value 가 존재하는 값인지, 아닌지 먼저 확인합니다. 만약 존재하지 않는 무효 (null) 값이라면, 연산자 뒷 부분의 코드는 실행하지 않고 다음 코드로 넘어갑니다. 이를 그림으로 다시 한번 이해해보도록 합시다.

약간 다른 예시를 살펴볼까요?

int? length = customers?.Length; // customers가 null 일 경우 null 값을 반환합니다.
Customer first = customers?[0]; // customers가 null 일 경우 null 값을 반환합니다.
int? count = customers?[0]?.Orders?.Count(); // customers, customers[0], Orders 중 하나라도 null 일 경우 null 값을 반환합니다

세 번째 행의 코드를 보시면 총 3 개의 무효 조건 연산자 (Null-Conditional Operators) 가 사용되었고, ‘customers 값 확인 → customers[0] 값 확인 → customers.Orders 값 확인’ 과 같은 과정으로 진행되는 것을 확인 하실 수 있습니다. ‘customers’ 값이 ‘null’ 값이고, ‘customers[0]’ 값 역시 ‘null’ 값이고, ‘customers[0].orders’ 값까지 모두 ‘null’ 값인 경우에만 Nullable 형식의 변수 count 에 null 값이 대입됩니다.

고맙습니다!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s