[Unity/C#] Nullable ?

강동현·2024년 1월 28일
0

Unity/C#

목록 보기
17/26

Nullable

  • 값 형식null을 넣는 방법
  • Fake Null
    • Nullable은 모두 UnityEngine.Object 타입에 사용 불가
    • if를 사용한 null 체크를 사용해야 함

1. ?

  • 값 타입에 Null을 넣을 수 있도록 해줌
int? i = null;
float? f = null;
bool? b = null;
double? d = null;
char? c = null;
Vector3? vec = null;
  • 내부 구현
System.Nullable<bool> mybool;
  • Nullable 속성
    • HasValue : 값이 Null이 아닌지 체크
int? num = null;
//null이 아닐 때 호출
if(num.HasValue){...}
  • Value: 해당 값 리턴
    • 내부적으로 int numValue = (int)num 수행
int numValue = num.Value;
  • GetValueOrDefault (int num): 값 리턴(Null일 경우 기본 값(or num))

2. ?.

  • 참조 형식nullable에 사용
  • null이면 뒤에 오는 함수나 프로퍼티 실행 X
void Start(){
	string s = null;
    print(s?.IndexOf('링));//null
}

3. ??

  • null일 경우 뒤 구문을 실행
int? num = null;
print(num ?? -1);//-1
string s = null;
print(s?.IndexOf('링') ?? -1)//-1

4. ??=

  • null일 경우 할당 수행
int? num = null;
num ??= -1;

5. ?[]

  • 참조 형식의 nullable 인덱서에 사용
  • null 이면 뒤에 오는 함수나 프로퍼티 실행X
int[] nums//null 상태
private void Start(){
	int? num = nums?[0]//null이기 때문에 문장 실행 X
    print(num)//num
}

6. Fake Null;

  • UnityEngine.Object에는 Nullable 사용 불가
    • 아직 개발되지 않았음
  • UnityEngine.Object를 다룰 경우 if를 사용한 null 체크를 수행해야 함
    • Transform
    • Rigidbody... etc
[SerializeField] Rigidbody rb;
private void Start(){
	if(rb != null) rb.MovePosition(Vector3..one);
    Rigidbody rb2 = rb == null ? null : GetComponent<Rigidbody>();
}
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글