C#/문법

C# 문법 8 -- Nullable

psb08 2024. 11. 28. 16:23
728x90
반응형

소프트웨어 개발 세계에서 null 참조는 꽤나 골치아픈 문제로, 개발자들 사이에서 악명 높은 "NullReferenceException"으로 이어질 수 있습니다. C#의 최신 버전에서 주목할 만한 발전 중 하나는 nullability 기능의 도입입니다.

 

Nullable을 활용해 Non-Nullable을 Nullable로 변경할 수 있습니다.

 

Nullable<T>를 활용하여 int를 null 참조가 가능하도록 만들었습니다.

Nullable<int> age = null;
int? age2 = null;

여기서 int?는 위에있는 Nullable<int>를 간략하게 작성할 수 있도록 해줍니다.

 

Nullable 참조타입

C#의 참조 타입은 null 값을 가질 수 있었고, 이는 의도하지 않은 null 참조를 역참조할 때 잠재적인 문제점으로 이어질 수 있었습니다. C# 8.0에서는 nullable 참조 타입이라는 기능이 도입되었고, 이를 통해 참조 타입이 nullable인지 아닌지를 명시적으로 표현할 수 있게 되었습니다.

 

 

Nullability의 역할

1. 컴파일 시간 검사
컴파일러는 정적 분석을 수행하여 가능한 null 참조 역참조를 감지하고, 잠재적인 런타임 오류를 컴파일 시간 경고로 전환한다.

2. 코드 명확성
non-nullable 변수를 선언함으로써 null 값이 예상되지 않음을 명확한 계약으로 표현하며, 이는 코드의 가독성과 유지보수성을 향상시킨다.

3. 도구 개선
IDE는 nullability 주석을 사용하여 더 나은 코드 완성, 리팩토링 및 분석을 제공하며, 개발자의 생산성을 더욱 향상시킨다.

 

Null - Conditional 연산자 (?)

var result = man?.Name;

이 코드는 man 객체가 null이 아닐 경우 man.Name을 반환하고, man이 null이라면 result는 null이 됩니다.

 

Null - Coalescing 연산자 (??)

int? nullableInt = null;

int result = nullableInt ?? 10;

Console.WriteLine(result);

int? nullableInt = null; : nullableInt는 int 타입의 널 가능 변수로, 현재 null로 초기화됩니다.


int result = nullableInt ?? 10; : 이 줄에서 nullableInt가 null이면 10이 result에 할당됩니다.

만약 nullableInt에 값이 있었다면 그 값이 result에 할당되었을 것입니다.


Console.WriteLine(result); : result의 값을 출력합니다. 이 경우 nullableInt가 null이므로 result는 10이 됩니다.

 

Null-Coalescing assignment 연산자 (??=)

string? named = null;

//원래의 방법
if (named == null)
{
	named = "이름";
}

//??= 사용
named ??= "이름";

//출력
Console.WriteLine(named);

string? named = null; : named는 널 가능 문자열 변수로 초기값이 null입니다.


named ??= "이름"; : 이 줄에서는 named가 null일 경우 "이름"으로 할당합니다.

즉, named가 null이기 때문에 "이름"이 할당됩니다.


Console.WriteLine(named); : named의 값을 출력합니다.

이 경우 named는 이제 "이름"이므로 콘솔에 "이름"이 출력됩니다.

 

Null-Forgiving 연산자 (!)

string? nullableString = "안녕하세요";

string nonNullableString = nullableString!;
Console.WriteLine(nonNullableString);

string? nullableString = "안녕하세요"; : nullableString은 널 가능 문자열로 초기화됩니다.


string nonNullableString = nullableString!; : nullableString이 null이 아님을 단언하여 nonNullableString에 할당합니다.

만약 nullableString이 null이었다면, 런타임에서 예외가 발생합니다.


Console.WriteLine(nonNullableString); : nonNullableString의 값을 출력합니다.

이 경우 "안녕하세요"가 출력됩니다.

 

주의할 점 :

null 허용 연산자는 값이 null이 아니라고 확신하는 경우에만 드물게 사용해야 합니다.

 

 

'C# > 문법' 카테고리의 다른 글

C# 문법 10 -- 데이터 형식 정리 2  (0) 2024.11.30
C# 문법 9 -- 데이터 형식 정리  (0) 2024.11.29
C# 문법 7 -- 구조체(Struct)  (0) 2024.11.27
C# 문법 6  (0) 2024.11.26
C# 문법 5  (0) 2024.11.25