본문 바로가기

[언어]/C#

[C#] 5-12 Nullable

728x90
반응형

개발하면서 평소 궁금하던 것들을 일기장 형식으로 작성한 것입니다.
참고용으로 봐주시고 피드백이 있다면 언제든지 댓글로 부탁드리겠습니다^^
편의상 본문은 평어로 서술합니다 😇

 

1. Nullable
👣 Nullable -> Null + able
값이 없다는 것을 표현할 수 있도록 int 같이 null 값을 가질 수 없는 데이터들이 null 값을 가질 수 있도록 하는 것!

• 객체를 참조하는 변수는 (Monster monster 같은) null을 가질 수 있다.
그런데 int, struct 같은 기본 자료형 변수는 null을 가질 수 없기 때문에
C#에서는 값이 없다는 것을 표현할 수 있도록 이 같은 변수들이 null 값을 가질 수 있도록 해주는 문법이 있다!
그것이 바로 Nullable
   
👣 Nullable 속성과 함수
• Value
    ◦ Nullable 변수의 값을 리턴
    ◦ 기존 데이터거나 null이거나!
• HasValue
    ◦ Nullable 변수의 값이 null이면 False, null이 아니면 True 리턴
• GetValueOrDefault()
    ◦ null이 아니면 즉 값이 있는 경우 할당된 값을 리턴하고
     null이면 기존 타입의 default값을 리턴! (int 라면 0을 리턴)

👣 Nullable 선언 -> ? 를 붙인다.
int? number = null;   // ⭕

number = 3;    // ⭕

int a = number;    // 컴파일 에러 발생❌
int b = number.Value;    // ⭕, 그러나 런타임 에러 우려​

• numbernull값을 지정하는 것도 가능한 int형 변수가 되었다.

int? number = null;

• aNullable하지 않은 일반 int이므로 number를 받을 수 없다. (변환 불가)
• number.Value값이 null이 아니라면 문제 없이 b에 할당 되지만,
만약 null이라면 이를 일반 int 변수인 b에서는 이를 할당 받을 수 없기 때문에 런타임 에러가 발생!

    ◦ null이라면, 아니라면 if-else문을 통한 체크가 필요!
// 1.
if(number != null)
{

}

// 2.
if(number.HasValue)   // null이 아니면 True 리턴
{

}

// 3.
int b = number ?? 0;​
Monster monster = null;
if(monster != null)
    int monsterId = monster.ID;
else
    int monsterId = 0;

• 객체도 null인지 아닌지 체크하고 진행할 때가 많다. 아래와 같이도 사용 가능

int? id = monster?.ID;

• monster?.ID -> monsternull이 아니면 monster.ID가 리턴되고, monster null이면 null이 리턴된다!


👣 ?? 문법
int b = number ?? 0;
int c = (number != null) ? number.Value : 0;​

위 두 줄의 코드는 같은 로직을 한다.
??을 사용하면 A ?? B
Nullable 변수인 A가 
null이라면 0을 리턴하고,
null이 아니라면 그대로 number.Value값을 리턴한다는 의미!

 

반응형

'[언어] > C#' 카테고리의 다른 글

[C#] IEnumerator : 열거자  (0) 2022.12.22
[C#] extension 확장 메서드  (0) 2022.12.21
[C#] 5-11 Reflection  (0) 2022.12.13
[C#] 5-10 Exception (예외 처리)  (0) 2022.12.08
[C#] 5-9 Func, Action  (0) 2022.12.07