.NET Reflection으로 다차원/Jagged 배열을 구분하는 방법
아시는 것처럼 닷넷의 배열은 다차원과 jagged 배열로 나뉩니다. 예를 들어 다음의 출력 결과는 모두 true를 반환합니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[,] multi2 = new int[3, 3];
int[][] jagged = new int[3][];
Reflection(multi2);
Reflection(jagged);
}
private static void Reflection(object array)
{
Type type = array.GetType();
Console.WriteLine(type.IsArray); // 모두 True
}
}
}
이 둘을 구분할 수 있는 IsJaggedArray나 IsMultiArray와 같은 식의 속성은 제공되지 않습니다. 아쉽긴 하지만 이해는 되는 부분입니다. 가령 1차원 배열인 경우에는 다차원이나 jagged나 형식이 동일한데, 이럴 때 Type 클래스에 속한 해당 속성들이 어떤 값을 반환해야 하는지 매우 애매할 수 있습니다.
어쨌든 Type 객체는 이를 보조해서 GetArrayRank 메서드를 제공합니다. 이를 이용하면 다음과 같이 구분할 수 있게 됩니다.
private static void Reflection(object array)
{
Type type = array.GetType();
Console.WriteLine(type.IsArray);
Console.WriteLine(type.GetArrayRank()); // 다차원 배열인 경우 GetArrayRank는 그 배열의 차수를 반환
// jagged인 경우 GetArrayRank는 무조건 1
}
그렇습니다. 다시 원론으로 돌아가야 할 때입니다. ^^ jagged 배열은 내부적으로 배열 안에 인스턴스를 배열로 받는 것이기 때문에 결국 배열을 원소로 갖는 1차원 배열에서 출발하는 것입니다.
jagged 배열안에 어떤 원소가 들어있는지는 Type.GetElementType 메서드를 이용해 구할 수 있습니다. 따라서 코드를 조금 변경해서 실행해 보면,
private static void Reflection(object array)
{
Type type = array.GetType();
Console.WriteLine(type.IsArray);
int arrayRank = type.GetArrayRank();
if (arrayRank == 1) // jagged 배열인 경우
{
Console.WriteLine(type.GetElementType()); // System.Int32[]
}
}
이제야 비로소 jagged와 다차원 배열을 제대로 해부할 수 있게 된 것입니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]