null 연산자의 개발은 수입억 달러짜리 실수입니다. (1)

마수리·2024년 8월 28일
0

물음표 연산자

목록 보기
1/1


안녕하세요 마수리입니다.

오늘부터 C#에서 등장하는 ?, ??, ?., ??= 등의 물음표 연산에 대해서 살펴볼 예정입니다.

그 전에 왜 이런 물음표 연산자가 등장하게 되었는지 배경 기초 지식 설명을 간단히 진행하는 시간을 갖도록 하겠습니다.

개발을 할 때 여러가지의 예외가 발생하지만 흔하게 알려져 있는 NPE(NullPointerException)는 개발자에게 상당한 스트레스를 주는 예외 중 한가지 일 것입니다. 최초로 null이라는 개념을 처음 개발한 컴퓨터 과학자 Tony Hoare는 2009년에 런던에서 있었던 컨퍼런스에서 null개발이 수십억 달러짜리 실수라고 언급하며 공식적으로 사과했습니다.

저는 이를 수십억 달러짜리 실수라고 부릅니다. 1965년에 null 참조를 발명한 것이죠. 당시 저는 객체 지향 언어(ALGOL W)에서 참조를 위한 최초의 포괄적인 타입 시스템을 설계하고 있었습니다. 제 목표는 컴파일러가 자동으로 검사를 수행하여 모든 참조 사용이 절대적으로 안전해야 한다는 것이었습니다. 하지만 구현이 너무 쉽다는 이유로 널 참조를 넣고 싶은 유혹을 뿌리칠 수 없었습니다. 이로 인해 수많은 오류, 취약성, 시스템 충돌이 발생했고, 지난 40년 동안 아마도 수십억 달러의 고통과 피해를 야기했을 것입니다.

그 외에도 C++의 창시자인 Bjarne Stroustrup은 null 포인터를 사용하지 않는 것이 좋다고 언급하며, 대신 스마트 포인터와 같은 안전한 대안을 사용하는 것이 바람직하다고 말하기도 하는 등 null에 대해 많은 이야기가 있어 왔습니다.

저도 null연산자 자체는 좋은 아이디어였다고 생각하지만 null을 처리하면서 발생하는 비용이 만만치 않다라는 것도 상당히 동의하는 부분입니다.

클린코드 라는 책에서는 null을 리턴하지말고 null을 함수의 인자로도 넣지 말자라고 주장합니다. 저 또한 비슷한 생각을 갖고있어서 제가 작성하는 함수는 null이 어떤 특별한 의미를 갖고 있지 않는 이상 절대 null을 리턴하지 않습니다. 관련해선 Toss의 좋은 글이 있어 같이 첨부 드립니다. (Toss, null 리턴은 왜 나쁠까?)

이렇게 여러가지 이유로 null 처리에 대해 비용이 많이 들기 시작하면서 .NET 진형측에서 null처리에 대해 지원하는 키워드들을 차례대로 발표하게 됩니다. C#에서는 이러한 null처리가 물음표 연산자삼항 연산자로 처리될 수 있습니다.

static string Foo(PersonMusic p)
{
    if (p is not null)
    {
        if (p.Name is not null)
            return p.Name;
        else
            return "empty name";
    }
    else
    {
        return "no name";
    }
}

// 위의 함수와 똑같은 결과를 리턴한다.
static string Foo(PersonMusic p)
{
    return p is not null ? (p.Name ?? "empty name") : "no name";
}

앞으로 예제를 보면서 언제 어떻게 물음표 연산자를 사용해야 하는지 알아가도록 하겠습니다.

오늘은 여기까지 하도록 하겠습니다.

감사합니다. 🖐️

profile
.NET 개발자 마수리입니다 🖐

0개의 댓글