Unity 이론 (KeyType, Indexer, HashCord, Operator Overloading, Nullable)

로젠·2024년 5월 22일
0

게임 프로그래밍

목록 보기
45/49
post-thumbnail

KeyType

Dictionary는 KeyType과 KeyValue로 이루어져 있는데 이때의 KeyType은 해당 자료의 형식을 말한다.

Indexer

배열 기호로 다루기 위해 정의해 주는 예로 하나의 프로퍼티이다. 인덱서를 this와 배열 기호로 정의하고 인덱서의 get을 이용하여 값을 가져오고 set을 이용하여 값을 저장했다. 인덱서는 우리가 지정한 배열 기호로 해당 오브젝트를 접근하기 위해 사용한다.

GUID(UUID)

GUID는 유니티에서 사용하는 고유 식별자로 128비트를 이루고 있다.

InstanceID

인스턴스 아이디는 오브젝트의 고유번호로 결과값은 int 형태로 return 해준다.

HashingTable

TKey와 TValue를 저장하는 것으로 Key 값은 중복으로 들어올 수가 없다. 해시 테이블은 모두 Object를 입력받아 박싱과 언박싱을 사용한다.

Operatar Overloading

원하는 기호의 연산을 사용자가 원하는 대로 만들도록 재정의 하는 방법을 이야기한다. 예를 들어 두 Vector3의 x, y, z를 더하고 싶을 때 Operatar Overloading을 이용하여 재정의하고 x, y, z 끼리 더하도록 만들 수 있다.

 public override int GetHashCode()
{
	return base.GetHashCode();
}
public override bool Equals(object obj)
{
	if (obj == null)
		return false;
	if (ReferenceEquals(obj, this))
		return true;
	Coordinate temp = obj as Coordinate;
	if (temp == null)
		return false;
	if (X == temp.X && Y == temp.Y)
		return true;
	return false;
}
public static bool operator==(Coordinate left, Coordinate right)
{
	return left.Equals(right);
}
public static bool operator !=(Coordinate left, Coordinate right)
{
	return !(left ==right);
}
public static Coordinate operator+(Coordinate left, Coordinate right)
{
	return new Coordinate(left.X + right.X, left.Y + right.Y);
}
public static Coordinate operator+(Coordinate left, float right)
{
	Vector3 x = left.X;
	Vector3 y = left.Y;
	x += new Vector3(right, right, right);
	y += new Vector3(right, right, right);
	return new Coordinate(x, y);
}
public static explicit operator float(Coordinate value)
{
	return Vector3.Dot(value.X, value.Y);
}

Nullable

type?는 널 가능 연산자로 참조 형식을 가진 레퍼런스 타입이다. ??은 널 병합 연산자로 null이면 오른쪽 숫자를 아니면 왼쪽 숫자를 리턴해준다. ?은 만약 int? 이면 int로도 캐스팅이 가능하고 int Nullable로도 캐스팅이 가능하다. Nullable은 비교 연산이 불가능하다.

private void Start()
{
	int? a = null; //레퍼런스, T?(제네릭 타입)
    int? b = 20;
	int c = b ?? -1; //널 병합 연산자, null이면 -1 null이 아니면 b를 대입한다.
    int? d = null;
	int e = d ?? -1; //Boxing
	int? f = null;
	f = 30;
	int g = f.Value; //Unboxing
    int h = (int)f; //Unboxing
    //int? i = null;
	//int j = (int)i; //InvalidOperationException 오류 생성
    int? k = 10;
	int? l = null;
	print($"k >= null is {k >= null}"); //비교가 불가능해 항상 false 출력
	print($"k == null is {k == null}"); //false
	print($"l <= null is {l <= null}"); //비교불가, false
	print($"l == null is {l == null}"); //true
    int? m = 10;
	print(m is int); //변환 가능하면 true 아니면 false, true 출력
	print(m is int?); //true
}

0개의 댓글