전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;
using CSharp;
using System.Reflection;

namespace CSharp
{
    class Program
    {

        static int Find()
        { 
            return 0;
        }
        class Monster
        {
            public int id { get; set; }
        }

        //static Monster FindMonster(int id) { return null; }
        static void Main(string[] args)
        {
            // Nullable -> 널을 만들수 있는
            // null과 관련이 있음

            //Monster monster = FindMonster(101);

            //if (monster == null)
            //{
            //    // 코드 실행
            //}

            // 일반적인 변수 사용과 유사함

            int? number = null; // null도 될 수 있다는 의미

            number = 3;

            // null 체크를 해줘야함
            if (number == null)
            {
            }

            if (number.HasValue)
            {

            }

            // value를 명시적으로 꺼내서 사용해야 대입 가능
            int a = number.Value;

            // 항상 널체크를 해줘야 해서 번거로움이 있음
            // 따라서 진화된 문법이 또 있다.

            int b = number ?? 0; // 값이 없으면(null이면) 초기값 0을 넣어준다.

            Monster monster = null;

            if (monster != null)
            {
                int monsterId = monster.id;
            
            }

            int? id = monster?.id; // Monster가 null이면 nill 대입 아니면 id = monster.id 대입

            // 풀어서 사용하면
            if (monster == null)
            {
                id = null;
            }
            else
            {
                id = monster.id;
            }

            // 라는 의미
            // Nullable -> 형식?
            // null
            // ??
            // ?.

        }
    }
}

📍Nullable이란? (개념 정리)

기본 자료형의 한계

타입null 가능 여부
int❌ (null 불가능)
Monster (클래스)⭕ (null 가능)
struct❌ (null 불가능)

C#에서는 기본형(int, float 등)은 null을 가질 수 없음

해결책 - Nullable

타입의미
int?int 값 또는 null
bool?true, false 또는 null
MyStruct?구조체 값 또는 null

📍Nullable 선언법

int? number = null;  // 가능
int number = null;   // 에러

📍Nullable 핵심 프로퍼티/함수

기능설명
HasValue값이 있으면 true, 없으면 false
Value실제 값 (null일 때 접근하면 예외 발생)
GetValueOrDefault()값이 있으면 해당 값, 없으면 타입의 기본값
??null 병합 연산자 (null이면 대체값 반환)
?.null 조건 연산자 (null이면 null 반환)

코드 분석

1. 네임스페이스 및 클래스 선언

namespace CSharp
{
    class Program
    {
  • 네임스페이스로 코드 영역 구분
  • 프로그램 진입점 클래스 선언

2. Nullable 선언 및 초기화

int? number = null;
  • int?Nullable<int>의 축약 표현
  • null 대입 가능

3. Nullable에 값 대입

number = 3;
  • 일반 int처럼 값 대입 가능

4. null 체크 (방법 1)

if (number == null)
{
    // number가 null일 때 실행
}
  • 직접 null과 비교

5. null 체크 (방법 2)

if (number.HasValue)
{
    // number에 값이 있을 때 실행
}
  • HasValue 프로퍼티 활용

6. 값 직접 꺼내기 (주의 필요)

int a = number.Value;
  • null일 때 접근하면 예외 발생 (조심해야 함)

7. null 대체 (?? 연산자)

int b = number ?? 0;
  • null이면 0 대입, 아니면 number 값 대입

8. 클래스 객체와 Nullable 연계

Monster monster = null;
int? id = monster?.id;
  • ?. 사용하여 null-safe 방식으로 접근
  • monster가 null이면 id도 null
  • monster가 null이 아니면 monster.id 값 대입

📍Nullable 패턴 정리

상황코드 예시설명
값이 있으면 사용number.Value직접 꺼내기 (null이면 예외)
값 체크if (number != null)null 여부 확인
값이 없으면 대체number ?? 0null일 때 기본값 지정
객체 속성 접근monster?.id안전한 속성 접근

profile
李家네_공부방

0개의 댓글