방프 2021. 4. 22. 21:43

Nullable

- 값타입의 변수에 null을 대입할 수 있게 한다.

- 값타입을 리턴하는 함수에서 null리턴을 할 수 있다.

- 주로 구조체에서 사용한다.

* null 이란 어느곳도 가리키고 있지 않다는 의미

 

int? a = null
if(!a.HasValue)
	a = 100;
Debug.Log(a.Value);

데이터 타입 뒤에 ? 기호를 붙여 이런식으로 사용할 수 있다.

 

EX 1)

// 값타입의 매개변수를 전달받아서 원하는 값이 있을 경우는 값을 리턴하고
// 없을 경우는 null을 리턴하는 함수 제작 (null비교할수있는 장점)
public int? TestNullable(int k)
{
    if (k < 20)
		return k;
    return null;
}

public void Start(){
	int data = 100;
	int? tmp = TestNullable(data);
    
  	if (tmp.HasValue) // tmp != null
      Debug.Log(tmp.Value);
  	else
      Debug.Log("값이 없음!");
}

 

EX 2)

// 1. CHARACTERINFO 구조체 정의
// 2. 캐릭터 정보(CHARACTERINFO) 10개 생성
// 3. 원소 각각의 이름은 홍길동_1부터 10까지 초기화
// 4. 이름으로 배열에서 같은 데이터를 찾아서 리턴하는 함수 제작 (nullable사용)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
public struct CHARACTERINFO
{
    public string name;
}

public class Example_Nullable : MonoBehaviour
{
    public CHARACTERINFO[] characterInfoArr = null;

    void Start()
    {
        // 캐릭터 정보 10개 생성
        characterInfoArr = new CHARACTERINFO[10];

        // 원소 각각의 이름을 홍길동_1부터 10까지 초기화
        for(int i=0; i< characterInfoArr.Length; i++)
        {
            characterInfoArr[i].name = "홍길동_" + i;
        }

        // 이름으로 배열에서 같은 데이터를 찾아서 리턴하는 함수
        CHARACTERINFO? result = FindName("홍길동_2", characterInfoArr);
        if (result.HasValue)
            Debug.Log("찾았다!" + result.Value.name);
        else
            Debug.Log("없다.");
    }

    public CHARACTERINFO? FindName(string _name, CHARACTERINFO[] infoArr)
    {
        for(int i=0; i< infoArr.Length; i++)
        {
            if (characterInfoArr[i].name.Equals(_name))
                return characterInfoArr[i];
        }
        return null;
    }
}