카테고리 없음

[C#] 참조형 null 초기화

Victory_HA 2024. 11. 28. 09:50

C#에서 null!은 null-forgiving operator (!)를 사용하는 표현입니다. 이를 사용하는 이유는 다음과 같은 상황에서 발생할 수 있습니다:

1. Nullable Reference Type (NRT) 경고 방지

C# 8.0 또는 .Net6.0 부터 Nullable Reference Type 기능이 도입되었습니다. 이 기능은 참조형이 null을 가질 수 있는지 여부를 컴파일러가 추적할 수 있도록 도와줍니다.

  • string은 기본적으로 non-nullable로 간주됩니다.
  • 하지만 초기화 시점에 null로 설정하려 하면 컴파일러가 경고를 발생시킵니다.
public string Name { get; set; }; // 경고: Non-nullable property 'Name' must contain a non-null value.

2. null!로 컴파일러 경고 억제

null!를 사용하면, 초기값으로 null을 설정하되 컴파일러 경고를 억제할 수 있습니다.

public string Name { get; set; } = null!;
  • null!은 "나는 여기에 null을 설정하지만 나중에 절대 null로 사용되지 않을 것을 보장한다"는 의미를 내포합니다.
  • 컴파일러가 경고를 무시하도록 합니다.

3. 실제 의도: 나중에 값 할당 보장

null!를 사용하는 경우, 코드 설계 상 이 속성이 나중에 반드시 초기화될 것이라는 전제가 있습니다.

예를 들어, 객체 생성 이후 속성이 특정 메서드나 초기화 로직을 통해 값이 설정된다면,

null!로 초기화 경고를 무시하는 것이 적합할 수 있습니다.

대안: 생성자 초기화 사용

null! 대신 속성을 생성자에서 초기화하면 더 안전한 설계를 만들 수 있습니다:

public class MyClass 
{ 
   public string Name { get; set; } 
   public MyClass(string name) { Name = name; } 
}

요약

null!는 컴파일러에게 "이 속성은 초기화되지 않았지만, 내가 나중에 안전하게 값을 보장할 것"이라는 신호를 주기 위해 사용됩니다.

하지만 이를 남용하면 설계 결함으로 이어질 수 있으니, 가능하면 생성자를 통한 초기화를 권장합니다.