[C# 8.0] Nullable Reference Type이란?
C# 8.0의 새로운 기능들 중 하나로 Nullable Reference Type(널 참조 형식)이 있다.
https://docs.microsoft.com/ko-kr/dotnet/csharp/whats-new/csharp-8#nullable-reference-types
C# 8.0의 새로운 기능 - C# 가이드
C# 8.0의 새로운 기능을 살펴봅니다.
docs.microsoft.com
이미 클래스와 같은 Reference Type은 null을 가질 수 있는데 굳이 Nullable 필요할까?라는 의문이 들어서 찾아봤다.
Nullable Reference Type에 대해서 알아보자
1. Nullable Reference Type을 선언하려면 Nullable Value Type과 같이 Class명 우측에 물음표를 붙이면 된다.
// Reference Type: Null이 되면 안 되도록 코드를 짤 것이라 기대함
NewClass a;
// Nullable Reference Type: Null이 될 수도 있다고 기대함
NewClass? b;
2. Nullable Reference Type을 사용함으로써 우리는 컴파일러에게 더 많은 정보를 전달할 수 있다.
이제부터 그냥 참조형으로 쓰면 변수를 선언한다면 null로 설정 안 할 의도로 만든 변수라는 의미를 가지고 Nullable 참조 형식으로 쓰면 null을 의도하고 허용할 변수라는 의미를 가지게 된다.
그렇다면 참조형에 null을 할당하거나 아무것도 안 넣어주면 어떻게 될까? 경고만 발생한다. 오류는 발생하지 않는다.
이처럼 참조형 변수를 만들 때 프로그래머의 의도를 컴파일러에게 전달해줘서 Null Reference Error 실수를 발생하기 위해서 만들어진 기능이다.
3. C# 7.0의 코드를 C# 8.0에서 실행하게 되면 어떻게 되나
C# 7.0에서 작성한 코드의 참조형들과 C# 8.0의 참조형은 의미가 달라진다. C# 8.0부터는 참조형에는 난 너를 null을 참조하지 않게 사용할 거야!라는 의도 들어가 버린 것이다. C# 7.0에서는 그냥 아무 구분 없이 썼는데 이것은 문제가 될 수 있다(오류는 나지 않으므로 큰 문제는 아닐 것이다).
그래도 아무런 수정없이 C# 8.0 이전의 코드를 C# 8.0으로 바꾼다면 무수히 많은 컴파일러 경고가 도배될 것이다. 그런 상황을 방지하기 위해서 C# 8.0은 기본으로 이 기능을 비활성화해 놓았다. 그래서 Null Reference Type을 사용하고 싶다면 명시적으로 켜줘야 한다.
csproj파일에 다음의 것들을 추가해주면 사용할 수 있다. ( + Nullable Reference Type을 쓰려면 당연히 C# 8.0 이상의 버전을 써야 한다.)
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
4. C# 7.0과 C# 8.0의 IL은 호환이 된다.
C# 7.0과 C# 8.0의 코드의 IL은 호환된다고 한다.
그 이유는 사실 Reference Type과 Nullable Reference Type이 같은 타입이기 때문이다. (Nullable Value Type과 반대다.) 아래의 두 코드는 같은 코드이다.
// Reference Type
NewClass a;
// Nullable Reference Type
NewClass? b;
// Reference Type
NewClass a;
// Reference Type with Nullable Attribute
[Nullable] NewClass b;
컴파일러는 아래의 코드를 보게 된다. 차이점은 Nullable Atrribute밖에 없다. 만약에 에셈블리가 Nullable Atrribute를 모른다면 그냥 무시하게 된다. 그래서 C# 7.0과 C# 8.0의 IL을 호환된다.
이건 Nullable Value Type과는 반대다. Nullable Value Type은 아래의 코드와 같이 변하는데 보시다시피 bool과 Nullable제네릭은 서로 다른 형이다. 두 Nullable의 동작 방식이 다르므로 주의해야 할 것 같다.
// Value Type
bool a;
// Nullable Value Type
bool? b;
// Value Type
bool a;
// Nullable Generic Type
Nullable<bool> b;
5. 다음에 더 ...
직접 짜 보면서 컴파일러에게서 뜨는 경고 메시지를 봤는데 생각보다 많은 도움을 줬었다. 경고가 똑똑해져서 많은 Null Reference Error 실수를 잡을 수 있는 좋은 기능인 듯하다.
코드를 짜면서 경고 메시지를 직접 보여줘야지 얼마나 편한지 와닿는데 시간이 남으면 더 작성해 보겠다.
출처
C# 8.0의 새로운 기능 - C# 가이드
C# 8.0의 새로운 기능을 살펴봅니다.
docs.microsoft.com
- 더 자세한 동작 방식은 이 링크를 참조하면 된다. https://docs.microsoft.com/ko-kr/dotnet/csharp/nullable-references
nullable 참조 형식
이 문서에서는 C# 8.0에 추가된 nullable 참조 형식에 대해 간략하게 설명합니다. 이 기능이 신규 및 기존의 프로젝트의 null 참조 예외에 대해 어떻게 안전성을 제공하는지 알아봅니다.
docs.microsoft.com
- Icons made by Freepik from www.flaticon.com
댓글
이 글 공유하기
다른 글
-
Mac 사용자를 위한 C#으로 개발할 때 좋은 도구
Mac 사용자를 위한 C#으로 개발할 때 좋은 도구
2022.12.13 -
[C#] Nullable (Value Type)
[C#] Nullable (Value Type)
2020.02.26 -
[C#] 구조체(struct)
[C#] 구조체(struct)
2019.07.19 -
[C#] 배열 - 다차원 배열, 가변 배열
[C#] 배열 - 다차원 배열, 가변 배열
2019.07.17