이 영역을 누르면 첫 페이지로 이동
Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

페이지 맨 위로 올라가기

Coding Groot

코딩 블로그

[C# 8.0] Nullable Reference Type이란?

  • 2020.02.29 22:13
  • Programming Language/C Sharp
글 작성자: Coding Groot

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 실수를 잡을 수 있는 좋은 기능인 듯하다.

코드를 짜면서 경고 메시지를 직접 보여줘야지 얼마나 편한지 와닿는데 시간이 남으면 더 작성해 보겠다.


출처

  • 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

  • 더 자세한 동작 방식은 이 링크를 참조하면 된다. 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
반응형
저작자표시 비영리 동일조건 (새창열림)

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 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
다른 글 더 둘러보기

정보

Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

  • Coding Groot의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 소개
  • 블로그 저작권

카테고리

  • 분류 전체보기 (182)
    • Git (23)
      • Git Tutorial (9)
      • Git Note (7)
      • Git Lecture (7)
    • Programming Language (1)
      • C (2)
      • C Sharp (5)
      • Java (4)
      • JavaScript (7)
      • Julia (5)
      • Python (4)
    • Programming (8)
      • Algorithm (2)
      • Compiler (5)
      • Data Structure (0)
      • Web (12)
      • NestJS (2)
    • DevOps, Infra (36)
      • Apple (6)
      • Cloud (15)
      • Database (1)
      • Network (4)
      • Linux (8)
    • Game Programming (11)
      • Unity Tutorial (5)
      • Unity Note (6)
    • Hardware Design (1)
      • Digital Circuit (1)
    • Note (49)
      • Coffee (2)
      • Retrospect (15)
      • Reading List (14)
    • Mathematics (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • aws
  • 회고
  • 한빛미디어
  • javascript
  • tutorial
  • git
  • Github
  • 서평
  • 전체 보기…

정보

Coding Groot의 Coding Groot

Coding Groot

Coding Groot

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • GitHub
  • SlideShare
  • 유니티 2020 수업
  • TIL Blog
  • 모도코

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. Copyright © Coding Groot.

티스토리툴바