변수
is클래스형 or 데이터형
A
isB
결과는 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<타입> 변수명
T ? 변수명
HasValue 속성
값이 있는 경우 : true
값이 없는 경우(null) : false
Value 속성
값이 있는 경우: 할당된 값
값이 없는 경우 (null) : 예외 (Exeption) 발생
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<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 변환형
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("형변환 성공");
}
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
}