갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 유니티 그래프 그리기
  • 모바일 게임 순위
  • 전세계 게임 매출
  • 유니티 그래프
  • c# unboxing
  • 강남 방탈출
  • pc게임 순위
  • Unity Graph
  • C++ 소멸자
  • pc 게임 순위
  • c# 코루틴
  • C# boxing
  • 게임 매출 순위
  • 롤 골드그래프
  • c# collection
  • C++ 상속
  • C++ virtual
  • c# coroutine
  • C++
  • c# Thread
  • 글로벌게임매출
  • 유니티 골드그래프
  • c# delegate
  • C# 예외 처리
  • 알고리즘
  • 게임매출순위
  • 전세계게임매출순위
  • 게임 디자인 패턴
  • 2020년 게임 매출
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C#] Nullable<T>
프로그래밍/C#

[C#] Nullable<T>

2020. 2. 4. 17:30
728x90
반응형

1. 핵심 정리

using System;

class Program {
    public static void Main() {
        // string : reference type
        string s1 = "Hello"; // 객체 생성
        string s2 = null;    // 객체 없음.
        
        // int : value type
        int n1 = 10;  // 객체 생성
        int n2 = ?;   // 값이 없음을 표현하고 싶을 땐?
    }
}

 ① Reference Type

    => null을 사용하면 객체 없음 상태를 표현할 수 있다.

 

 ② Value Type

    => 값 없음을 표현할 수 없다.

 

 ③ Nullable<T>

    => Value Type에 값 없음을 추가한 것

    => Nullable<int> = int + bool

    => null을 사용할 수 있다.

 

using System;

class Program {
    public static void Main() {
        // string : reference type
        string s1 = "Hello"; // 객체 생성
        string s2 = null;    // 객체 없음.
        
        // int : value type
        Nullable<int> n1 = 10;
        Nullable<int> n2 = null;
        
        if(n2 == null) { }
    }
}

 

 

언제 쓰면 될까?
예를 들어, int타입의 함수를 만들고 어떠한 처리를 하는데 실패할경우 -1을 리턴하는 함수가 있다고 해보자.
-1이 리턴 됐을 때 정상 처리로 -1이 나온 것인지 실패로 인한 -1인지 헷갈릴 수 있다.
이런경우 Nullable<int>타입의 함수로 만들어 실패 시 null을 리턴할 수 있다.
using System;

class Program {
    public static int t1() {
        if(실패)
            return -1;
    }
    
    public static Nullable<int> t2() {
        if(실패)
            return null;
    }

    public static void Main() {
        int? n = null; // Nullable<int> n = null;
    }
}

 ④ int?

    => Nullable<int>의 단축 표기법

 


2. 추가 정리

using System;

class Program {
    public static void Main() {
        int? n1 = 10;
        int  a1 = 20;
        
        n1 = a1; // int? = int - ok
        a1 = n1; // int = int? - error
        
        Console.WriteLine(a1);
    }
}

위의 그림과 같이 Nullable<int>는 값의 int와 값이 있는지의 bool이 합쳐진 형태이다.
그래서 n1 = a1;은 a1이 가지고 있는 모든정보를 n1에 담을 수 있으므로 문제가 없지만
n1이 가지고 있는 bool의 정보를 a1이 가질 수 없으므로 에러가 난다.
아래와 같이 명시적으로 해결을 할 순 있다.
using System;

class Program {
    public static void Main() {
        int? n1 = 10;
        int  a1 = 20;
        
        n1 = a1; // int? = int - ok
        // a1 = n1; // int = int? - error
        
        a1 = (int)n1;
        
        Console.WriteLine(a1);
    }
}

 

하지만 위와 같은 경우는 n1에 초기값으로 null을 넣을 경우 예외가 발생한다.
추가로, Nullable도 연산은 모두 가능하지만 한쪽이 null일 경우 계산 결과도 null이 된다는 점 주의.
728x90
반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] casting  (0) 2020.02.07
[C#] Elvis Operator (?, ??) 연산자  (0) 2020.02.06
[C#] 동등성 (Equality)  (0) 2020.02.04
[C#] 값 타입 vs 참조 타입(2)  (1) 2020.01.30
[C#] 값 타입과 참조 타입(1)  (1) 2020.01.22
    '프로그래밍/C#' 카테고리의 다른 글
    • [C#] casting
    • [C#] Elvis Operator (?, ??) 연산자
    • [C#] 동등성 (Equality)
    • [C#] 값 타입 vs 참조 타입(2)
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바