게임 구조를 설계하며, 배열을 좀 더 편하게 쓸 수 있도록 확장 메서드를 개발하던 중 문제가 발생하였다.
public static void Add<T>(this T[] array, T item)
{
for (int i = 0; i < array.Length; i++)
{
if(array[i].Equals(default(T)) || array[i] == null)
{
array[i] = item;
return;
}
}
}
위 함수는 배열을 앞에서 부터 탐색하며 비어있는 칸에 오브젝트를 삽입해주는 함수이다. 위 함수에서 나는 배열안에 값이 null 이 아니고 기본 오브젝트를 넣었을 경우에도 비어있다고 체크하기 위해 다음과 같이 해당 타입의 디폴트 값과 비교연산을 하였다.
하지만 이 과정에서 내가 원하는대로 오브젝트가 들어가지 않았다. 도저히 이유를 모르겠어 로그를 찍어보았다.

나는 default()를 당연히 오브젝트의 디폴트이겠구나라고 생각하였지만, default()에서는 null 이 뜨고 있었다.
따라서 오브젝트의 기본값을 체크하기 위해 default() 대신 new() 를 사용하여 해결할 수 있었다.
if(array[i].Equals(new T()) || array[i] == null)
문제는 해결하였지만, 생각해보니 지금까지 default() 가 당연히 디폴트겠거니 생각했지 정확히 무엇을 하는 친구인지는 공부하지 않았다는 생각이 들어 이 참에 공부해보기로 하였다.
default() 기본값을 주는 친구이긴 하다. 다만 나의 생각처럼 오브젝트의 기본값이 아닌 각 타입의 기본값을 전달해주는 친구였다.
| Type | default |
|---|---|
| 참조형식(class) | null |
| 정수형 | 0 |
| 실수형 | 0 |
| bool | false |
| char | /0 |
| enum | 해당 enum의 0 값 |
| struct | 모든 값 형식 필드는 각 형식의 defalut로 모든 참조 형식 필드는 null로 설정하여 생성한 값 |
도큐먼트를 살펴보니 다음과 같이 반환해준다고 한다.
이제 default() 에 대해서 알게 되었으니 다음부터는 햇갈리지 않고, 때에 따라 적정히 사용할 수 있으면 좋겠다.