CodeGym /행동 /C# SELF /프로젝트에서 Nullable Reference Types (NRT) 켜고 설정하기

프로젝트에서 Nullable Reference Types (NRT) 켜고 설정하기

C# SELF
레벨 14 , 레슨 2
사용 가능

1. 소개

왜 NRT를 따로 켜야 할까?

Nullable Reference Types (NRT)는 그냥 문법 설탕이 아니라, null 관련 버그를 잡아주는 컴파일러의 진짜 든든한 도우미야. 근데 역사적인 이유로 이 모드는 예전 프로젝트에서는 기본으로 켜져 있지 않아 — 호환성 깨질까봐. 만약 최신 .NET 버전(예를 들어 .NET 7, 8 또는 9)에서 새 프로젝트를 만들면 NRT가 이미 자동으로 켜져 있을 확률이 높아. 근데 프로젝트가 좀 오래됐거나, 직접 이 모드를 관리하고 싶으면 명시적으로 켜줘야 해.

Nullable Reference Types 모드가 뭐 하는 건데?

이 모드가 켜지면, 컴파일러가 어떤 참조 변수에 null이 들어갈 수 있는지, 어떤 건 아닌지 분석하기 시작해. 프로그램 실행에는 전혀 간섭 안 하지만, 잠재적 실수 보이면 경고를 팍팍 뿌려줘. 이거 덕분에 신뢰성 있고, 이해하기 쉽고, 튼튼한 코드를 쓸 수 있어.

NRT 모드가 켜져 있는지 어떻게 알아?

만약 .NET 6 이상 새 프로젝트라면, NRT가 이미 켜져 있을 확률이 높아. 그래도 혹시 모르니까 확인해보자!

  • 프로젝트 파일을 열어봐. 보통 .csproj 확장자야.
  • 첫 번째 <PropertyGroup> 태그 안에 <Nullable> 설정을 찾아보거나 추가해.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>
NRT가 켜진 .csproj 파일 예시

만약 <Nullable>disable</Nullable>라고 적혀 있으면, NRT 체크가 꺼져 있는 거야.

2. NRT 모드 켜는 방법

.csproj로 — 프로젝트 전체에 적용

  1. .csproj 파일을 열거나 만들어.
  2. <PropertyGroup> 블록 안에 아래 줄을 추가하거나 수정해:

<Nullable>enable</Nullable>

이제 컴파일러가 프로젝트 안의 모든 .cs 파일을 꼼꼼히 체크하면서 null 위험한 접근에 대해 경고해줄 거야.

왜 이렇게 해야 할까?
이건 전체 프로젝트에 적용되는 글로벌 설정이거든. 이제부턴 프로젝트 전체가 새로운 규칙으로 돌아가: null은 항상 의심받고, 대충 넘어가는 거 이제 안 통함!

특정 파일이나 코드 조각만 적용하고 싶을 때

아직 전체 프로젝트에 엄격한 모드 적용할 준비가 안 됐다면, 일부 파일에서만 연습해볼 수 있어. 이럴 땐 전처리기 지시문을 써:


#nullable enable
string? value = null; // 여기선 분석 켜짐

#nullable disable
string legacyValue = null; // 여긴 꺼짐

#nullable restore
  • #nullable enable — 파일 끝까지 체크 켜짐.
  • #nullable disable — 체크 꺼짐.
  • #nullable restore — .csproj나 외부 파일 설정으로 복원.

이게 편한 점: 새 모듈에서만 엄격하게 체크하고, 옛날 불안정한 코드는 건드리지 않아도 돼.

<Nullable>에 쓸 수 있는 다른 값들

동작
enable
모두 켜짐: 어노테이션과 경고 다 적용
disable
null 참조 분석 완전히 꺼짐
warnings
경고만, 어노테이션은 필수 아님
annotations
어노테이션 필요하지만, 컴파일러는 경고 안 함
restore
원래 설정(예: 글로벌 설정)으로 복원

보통 enable이나 disable을 많이 써.

3. 예제로 보여주기

NRT 켜기 전

// 옛날 모드, NRT 꺼짐
string s = null; // 아무런 불평 없음

Console.WriteLine(s.Length); // 위험해! NullReferenceException 날 수 있음

NRT 켠 후

// 새 모드, NRT 켜짐
string s = null; // Warning: null 할당 가능성 있음
Console.WriteLine(s.Length); // Warning: null 접근 가능성 있음

이제 IDE가 잠재적 문제를 밑줄로 표시하고, 컴파일러가 경고해줄 거야: Dereference of a possibly null reference. (CS8602)

이걸 어떻게 고치지?

string? s = null;

if (s != null)
{
    Console.WriteLine(s.Length);
}

이렇게 하면: 이 변수는 null일 수 있다고 명확하게 표시하고, 컴파일러도 만족해.

4. 프로젝트가 "옛날 방식"으로 작성됐다면?

예전엔 null이 거의 모든 참조 변수에 들어가던 시절이 있었지. NRT를 켜면, 엄격한 감시자를 고용한 것처럼 잠재적 문제를 다 알려줘.

경고가 너무 많으면?

당황하지 마 — 이건 에러가 아니라 그냥 힌트야. 프로그램은 여전히 컴파일돼.

  • NRT를 새 파일에만 켤 수도 있어.
  • 코드를 점점 정리해: ? 추가하고, null 체크하고, !도 써봐(이건 나중에 설명할게).
  • 기억해: null을 꼼꼼하게 다루면 나중에 문제도 적어져.

호환성 & 외부 라이브러리

  • NRT를 켜도 실행 중 코드 동작은 안 바뀌고, 컴파일 타임에만 분석이 추가돼.
  • 옛날 코드는 경고가 한 번에 많이 뜰 수 있어.
  • NRT 어노테이션 없는 라이브러리 쓰면, 컴파일러가 조심스럽게 다 null일 수 있다고 가정해.
2
과제
C# SELF, 레벨 14, 레슨 2
잠금
Nullable Reference Types 기능 테스트 - 메서드
Nullable Reference Types 기능 테스트 - 메서드
2
과제
C# SELF, 레벨 14, 레슨 2
잠금
Nullable Reference Types의 부분 활성화
Nullable Reference Types의 부분 활성화
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION