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>
만약 <Nullable>disable</Nullable>라고 적혀 있으면, NRT 체크가 꺼져 있는 거야.
2. NRT 모드 켜는 방법
.csproj로 — 프로젝트 전체에 적용
- .csproj 파일을 열거나 만들어.
- <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>에 쓸 수 있는 다른 값들
| 값 | 동작 |
|---|---|
|
모두 켜짐: 어노테이션과 경고 다 적용 |
|
null 참조 분석 완전히 꺼짐 |
|
경고만, 어노테이션은 필수 아님 |
|
어노테이션 필요하지만, 컴파일러는 경고 안 함 |
|
원래 설정(예: 글로벌 설정)으로 복원 |
보통 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일 수 있다고 가정해.
GO TO FULL VERSION