??
?? 연산자는 null 판별할 때 쓰인다.
string result = str ?? "str is null";
만일 str 이 null이면 오른쪽에 있는 "str is null" 이 result에 들어가고
null이 아니라면 str 그대로 result에 들어간다.
??=
str ??= "str is null";
이런식으로 쓰이면 만일 str이 null이면 "str is null"이 str에 들어가고
null이 아니면 str 값 그대로 유지하는 것이다.
str ??= GetDefaultValue();
이런식으로 null일 때는 기본값을 설정하는 함수의 반환값으로 설정할 수도 있다.
is
is는 영어 is랑 비슷하게 생각하면 된다. A is B하면 A == B로 생각할 수 있다.
다만 is 뒤에는 변수가 오는게 아니라 타입명이 온다.
if(test is string)
{
Console.WriteLine("test is string");
}
else
{
Console.WriteLine("test is not string");
}
이런식으로 해당 변수가 어떤 타입인지 확인할 수가 있다.
다만 자식 is 부모는 true가 나온다.
왜냐면 자식은 부모의 정보를 포함하고 있기 때문이다.
형변환 가능 여부를 true, false로 판단한다 볼 수도 있지만 이는 참조 형식일 때의 여부고 만일 값 형식이라면 float를 int로 암시적, 명시적 형변환이 가능하지만 is 연산자에선 값 형식일 때는 타입이 일치해야만 true를 반환한다.
나중에 코드를 소개하겠지만 조건문서 유용하게 사용할 수가 있다.
as
as는 as 뒤에오는 타입으로 변수를 형변환을 시도하고 만일 변환이 성공하면 변환된 값을 반환하고 실패하면 null을 반환한다.
다만 값 형식이 아니라 참조 형식일 때만 사용 가능하다!
이는 자식인지 판별할 때 유용하게 쓰인다.
만일 attackSO 클래스의 자식이 RangedAttackSO 클래스라 해보자
자식은 부모를 상속받지만 부모보다 더 많은 정보를 내포하고 있다.
고로 자식 -> 부모는 형변환이 가능하지만 부모 -> 자식은 형변환이 되지 않는다.
이를 활용하여 자식인지 판별할 수가 있는데
아래 코드를 보자
만일 rangedStat.attackSO가 RangedAttackSO로 형변환이 가능하다면 null이 아닐 것이고 rangedAttackData에는 RangedAttackSO로 형변환된 정보가 있을 것이다. 이를 이용하여 코드를 작성한 것이다.
좀 더 쉬운 예를 들면 동물이 있고 강아지, 고양이가 있으면
일단 다 동물로 관리를 하지만 만일 강아지, 고양이를 구분할 경우가 있다면 그럴 때 as를 쓰면 유용하다는 것이다.
A동물이 고양이면 A동물 as 강아지 해서 강아지 변수에 넣으면 A동물은 강아지가 아니기에 강아지 변수에는 null이 들어갈 것이다.
is가 간결하긴 하지만 단순히 형변환이 가능한지에 대해서만 판단하기에(값 형식은 타입이 일치해야만함) 만일 단순 판단이 아니라 형변환 된 결과를 이용하여 추가적인 작업을 해야한다면 as를 쓰는 것이 좋다는 것이다.
다만 아래의 패턴 일치를 사용하면 이러한 as 장점이 상쇄되는 면이 있다.
패턴 일치
패턴 일치는 is 연산자와 연관이 있는데
이렇게 되면 만일 RangedAttackSO가 맞다면 CurrentStat.attackSO를 RangedAttackSO 타입의 currentRanged로 내보내 if문 안에서 CurrentStat.attackSO 대신 currentRanged로 사용이 가능하다.
CurrentStat.attackSO, modifier.attackSO로 접근하기엔 너무 코드가 길어지고 하기에 패턴 일치 문법을 통해 간결화 할 수가 있는 것이다.
'C#' 카테고리의 다른 글
C# - Clamp 함수와 사용 예제 (1) | 2024.05.27 |
---|---|
5/1 TIL - Delegate, Func, Action, 람다 (2) | 2024.05.01 |
C# 인터페이스와 열거형 (1) | 2024.04.26 |
C# 고급 문법 및 기능 (0) | 2024.04.25 |
C# OOP와 클래스 (0) | 2024.04.24 |