JHB의 프로그래밍 삽질기

[C#] 다차원 배열과 가변 배열, 그리고 가변 배열 초기화 하기 본문

PROGRAMMING/C# WPF

[C#] 다차원 배열과 가변 배열, 그리고 가변 배열 초기화 하기

roter 2018.05.04 23:21

C/C++만 하다가 C#을 공부하게 되면서 느끼는 점들이 참 많다.

일단.. 확실히 byte stream 같은걸 다루는 영역에서는 C/C++이 압도적으로 좋다.

또한 대용량 처리라던지 최적화 등이 필요한 부분도 C/C++이 좋다.

하지만 MVVM패턴(WPF 사용시) 이라던지 효율적 구조 설계(인터페이스, 다중상속 금지) 를 활용하고 싶을땐 C#이 좋다.

C#은 마치 Java, Python, C++의 장점만 섞어놓은 언어인 듯 하다.

뭐 C#에 대한 얘기들은 여기서 각설하고... 이번엔 다차원 배열과 가변 배열을 살펴보겠다.


정말 정말 헷깔리는 개념이었다.


일단 C#에는 다차원배열과 가변배열이 있다.



1. 다차원 배열 (Multi Array)

다차원배열은 영어로는 Multi Array라고 불리고 쉽게 아래와 같이 사용한다

int[,] multiArr = new int[2,3];


이렇게 할경우 2 X 3 짜리 2차원 배열이 바로 생성된다.

[][] 에 익숙한지라 [,]는 뭥미 했는데..

이런 다차원배열의 장점은 크기를 한번에 초기화 할 수 있다는 점. 가변배열 설명과 함께 보면 이해가 쉬울 것이다.



2. 가변 배열 (Jagged Array)

가변 배열은, 말 그대로 길이가 가변 가능한 배열이며 2 X 3 짜리 배열을 만들기 위해서는 아래와 같이 초기화 한다.

int[][] jaggedArr = new int[2][]

jaggedArr[0] = new int[3];

jaggedArr[1] = new int[3];


여기서 재밌는건, N+1차원으로 넘어갈때의 길이가 가변이 가능하다. 무슨 말이냐면

jaggedArr[0] = new int[5];

jaggedArr[1] = new int[7];


이렇게 가변이 가능하다. 보통은 이 길이를 이렇게 가변할 일은 잘 없긴 하겠지만..



한번에 초기화가 된다는 이점에서 다차원 배열이 장점이 있지만,

Array.Copy 의 사용 같은 장점 덕분에 개인적으로는 가변 배열을 선호한다.

하지만 가변 배열은 사용할때마다 초기화 해줘야 되기 때문에 Callback 루틴 같은 곳에서 사용되기엔 비효율적인 측면이 있을 수 있다.

물론 이런 경우 초기에 new를 다 잡아줘야 한다.


만약 3차원 가변 배열이라면? 

아래와 같이 초기화가 된다면 참 좋지 않을까?

int[][][] arr = new int[5][6][7];


아쉽게도 위와같은 식은 적용되지 않는다.. 도대체왜 ㅠㅠ

한번에 초기화 하는 방법이 없을까 싶어서 찾다가 https://stackoverflow.com/a/1739058 에서 좋은 글을 발견했다.

int[][][] my3DArray = CreateJaggedArray<int[][][]>(1, 2, 3);

위와 같이 사용하는 CreateJaggedArray 메소드.

static T CreateJaggedArray<T>(params int[] lengths)
{
return (T)InitializeJaggedArray(typeof(T).GetElementType(), 0, lengths);
}

static object InitializeJaggedArray(Type type, int index, int[] lengths)
{
Array array = Array.CreateInstance(type, lengths[index]);
Type elementType = type.GetElementType();

if (elementType != null)
{
for (int i = 0; i < lengths[index]; i++)
{
array.SetValue(
InitializeJaggedArray(elementType, index + 1, lengths), i);
}
}

return array;
}


매우 유용하므로 Common Util 같은곳에 넣어놓고 자주 사용하도록 하자.




궁금한점..

WPF에서 배열을 의존 프로퍼티 (Dependency Property)로 선언할 경우, 배열 안의 요소 (Element)가 변화하는 경우에

이벤트 핸들러를 실행 시키려면 어떻게 해야할까..?

아무리 검색해도 .. 연구해봐도.. 답이 나오지 않는다... ㅠ

배열 전체를 의존 프로퍼티로 설정할 경우 배열 전체의 인스턴스가 변경될 때만 이벤트 핸들러가 실행될 뿐..

아는분 계시면 댓글좀 부탁드립니다 ㅠㅠ


Tag
, , ,
0 Comments
댓글쓰기 폼