연산자

is 연산자

  • 형식 호환을 조사하는 연산자

변수 is 클래스형 or 데이터형
A is B

결과는 true or false 로 나온다.
박싱 / 언박싱 변환, 참조 변환에서 사용된다

static void Main(string[] args]
{
	int nvalue = 10; 
    if(nvalue is float)
    	Console.Writeline("호환 성공") ;
    else
    	Console.WriteLine("호환 실패"); //호환 실패가 나온다 
   if(nvalue is object)
    	Console.Writeline("호환 성공") ; //호환 가능 
    else
    	Console.WriteLine("호환 실패");
        
    object obj = nvalue;   
        
    if(obj is int)
    	Console.Writeline("호환 성공") ;  // 호환 가능 
    else
    	Console.WriteLine("호환 실패");


}

Nullable Type 이란?

  • Nullable Type이란 null 값을 가질수 없는 데이터 타입을 null 값을 가질수 있는 타입으로 만든 새로운 타입입니다.
  • 대표적으로 값 타입(value type) 들이 Null을 가질 수 없는데
    int , 구조체, double, bool 등의 데이터 타입은 값이 없는 상태 null 이 불가능한 데이터 타입들이다. (클래스와 같은 reference type 즉 참조타입은 이미 null 체크가 가능하기 때문에 따로 nullable type으로 만들지 않아도 된다)
  • int 와 같은 값 타입에 대해서 값이 없다 를 표현하기 위해 Nullable Type이 개발되었다
  • int 를 nullable int type으로 변경함으로써 값이 할당 되었는지 아닌지 확인 할 수 있게 된다.

Nullable Type의 사용법

  • 선언방법
    아래의 두가지 방법으로 선언이 가능하다.

    Nullable<타입> 변수명
    T ? 변수명

  • 속성과 메서드
  1. HasValue 속성
    값이 있는 경우 : true
    값이 없는 경우(null) : false

  2. Value 속성
    값이 있는 경우: 할당된 값
    값이 없는 경우 (null) : 예외 (Exeption) 발생

  3. GetValueOrDefault() 메서드
    값이 있는 경우 : 할당된 값
    값이 없는경우( null) : 기존 타입의 default 값 반환

  • 사용법
Nullable<int> a;    // int? a;

a = null;

Console.WriteLine(a);                         // null이 나옵니다.

Console.WriteLine(a.HasValue);        // 할당된 값이 없으므로 false

Console.WriteLine(a.Value);                // 할당된 값이 없으므로 예외

Console.WriteLine(a.GetValueOrDefault()); // 할당된 값이 없으므로 int 타입의 default 값인 0 이 반환됩니다.



int? b;            // Nullable<int> b;

b = 10;

Console.WriteLine(b);                         // 10이 나옵니다.

Console.WriteLine(b.HasValue);        // 할당된 값이 있으므로 true

Console.WriteLine(b.Value);                // 할당된 값이 있으므로 10

Console.WriteLine(b.GetValueOrDefault()); // 할당된 값이 있으므로 10이 반환됩니다.
  • 주의점
    Nullable 은 중복이 불가능하다
Nullable<Nullable<int>> num; // 불가능

value 를 접근할때는 HasValue로 체크한 후에 접근해야한다.
위의 예시에서 값이 존재하지 않는 Null 인 경우 Value로 바로 접근하는 경우
예외가 발생하기 때문에 프로세스가 죽을 위험이 있다. 때문에 HasValue로 값이 존재하는지 체크한 후에 Value에 안전하게 접근하는 방법이 유용하다.

  • 예제코드
static void Main(string[] args)
{
 
    int? a = null;  // or 22;
 
    if (a.HasValue) //HasValue로 값체크 먼저 수행
    {
        //Null이 아닌 값이 들어있다.
        Console.WriteLine("a is not Null");
        Console.WriteLine($"a.Value : {a.Value}");  //그리고 값에 접근
    }
    else
    {
        //Null 이다.
        Console.WriteLine("a is Null");
    }
}
// 결과값 : 
a is null // a 가 null 일때 

a is not Null 
a.vlaue: 22 
static void Main(string[] args)
{
    int?[] arr = new int?[10];
 
    arr[0] = 10;
    arr[2] = 12;
    arr[5] = 15;
    arr[7] = 17;
 
    foreach (var num in arr) //var 대신 int? 사용가능.
    {
        if (num.HasValue)
        {
            //배열에서 값이 할당된 것들만 출력.
            Console.WriteLine($"num = {num.Value}");
        }
    }
}
결과값: 
num = 10
num = 12
num = 15
num = 17

as 연산자

  • 역할
    • 형변환과 변환조사
    • 캐스트 연산자의 역할과 불변환은 null 리턴
  • 참조, 박싱, 언박싱, null형에 사용
  • 형식

    결과형 = 참조형, 언박싱, 박싱 as 변환형

static void Main(string[] args)
{
	string str1 = "123";
    object obj = str1; //박싱 
    string str2 = obj as string;
    Console.WriteLine(str2); 
    
    A test1 = new A(); 
    object obj1 = test1;
    B test2 = obj1 as B; // A를 B로 참조 할수는 없기때문에 null 
    if(test2 == null)
    	Console.WriteLine("형변환 실패");
    else
    	Console.WriteLine("형변환 성공");

}

null병합 연산자

  • ?? (null조사)
    C = A ?? B
    A가 null이 아니면 A를 C에 대입
    A가 null이면 B를 C에 대입
static void Main(strina[] args) 
{
    int? x = null; // Nullable 형식, null 저장 가능 
    int y = x?? -1;  // y 는 널러블이 아님. null 저장 불가능인데 x 의 값이 null 이기 때문에 -1을 y 에 대입한다. 
    Console.WriteLine(y); //-1
    x = 10; 
    y = x ?? -1; // x의 값이 null이 아니기 때문에 그대로 아래에 
    Console.WriteLine(y); // 10 



}

profile
개발하는 돌멩이🙄🙄👻

0개의 댓글

Powered by GraphCDN, the GraphQL CDN