반응형

 

동일한 타입의 데이터를 1개의 변수에 묶음(?)으로 사용하기 위해서

많은 개발자들이 Array / List (배열/리스트)를 사용할 것이다.

비슷한 역할을 담당하고 있지만, 정확하게 무엇이 다른지 알고 사용하기 위해서 정리해본다.

 

동적으로 크기 할당이 가능한가?

배열과 리스트의 가장 큰 차이점은 동적으로 크기 할당 여부이다.

결론부터 말하자면,

배열은 동적으로 크기 할당이 불가능하고 리스트는 가능하다.

 

예를 들어서 설명한다면,

처음 배열을 생성할 때 N개의 크기로 생성한다면 N개 이상의 크기로는 늘릴 수 없다는 것을 의미한다.

그에 반면, 리스트는 Add, Remove 메서드를 이용해서 크기를 자유롭게 늘릴 수도 줄일 수도 있다.

 

그렇다면, 리스트보다는 배열을 사용하는 것이 좋은가?

그것도 그렇지는 않다. 배열과 리스트의 특징을 알아보면서 언제 배열을 사용할지. 리스트를 사용할지 알아보자.

 

배열(Array)의 특징

배열은 연속된 메모리 공간으로 이루어져 있어서 메모리 관리가 용이하다.

그리고 배열의 값들은 Index(인덱스)로 이루어져 있기에

인덱스로 접근 시 빠르게 해당 값을 찾을 수 있다.

하지만, 위에서 말했듯이 동적 할당이 불가능하다는 큰 단점을 가지고 있다.

 

리스트(List)의 특징

리스트는 포인터를 사용하여, 다음 데이터의 주소 값을 가지고 있기에 데이터 추가/삭제가 편리하다.

그 말인즉슨, 데이터의 크기를 동적으로 할당할 수 있다는 것이다.

하지만, 위에서 말한 포인터를 사용하여 다음 데이터의 주소 값을 가지고 있어야 하므로 불필요한 메모리가 추가로 사용되기에 메모리 측면에서는 비효율적이다.

그뿐만 아니라, 배열에는 Index라는 Key(키) 값이 존재하지만 리스트에는 그러한 키값이 존재하지 않기에 검색에는 유용하지 않다.

 

그렇다면 배열/리스트 언제 사용해야 되는가?

배열과 리스트를 선택하는 데 있어서 가장 중요한 포인트는

계속 이야기하는 것이지만 해당 데이터를 할당 시, 데이터의 크기가 정해져 있느냐이다.

정해져 있다면 배열을

정해져 있지 않다면 리스트를 사용하는 것이 가장 좋은 방법이라고 생각한다.

하지만 배열을 사용하면서 동적으로 크기를 사용할 수 있는 꿀팁을 소개하려고 한다.

 

배열을 동적 크기 할당 꿀팁

1
2
3
4
5
6
7
8
9
10
11
12
13
// 샘플 배열
var test = new int[5]{ 12345 };
 
// 0개 크기의 배열
var array = new int[0];
 
foreach(var item in test) {
    array = (array?.Concat(new int[] { item }) ?? new int[] { item }).ToArray();
}
 
foreach(var item in array) {
    Console.WriteLine(item);
}
cs

 

언제나 코드는 간단하다.

test 변수는 정수형 배열이고 5개 크기를 가지고 있다.

array 변수는 정수형 배열이지만, 0개 크기를 할당해 주었다.

이때, test 변수를 루프를 돌면서 해당 변수에 있는 값을 array 변수에 넣어주려고 한다.

 

8번째 라인이 살짝 복잡하지만, 가장 중요한 부분이다.

?. / ?? 키워드를 사용하였는데 해당 키워드는 이전 글을 참고하자.

 

2019/12/05 - [개발/C#] - [C#] Null 관련된 연산자를 알아보자. (??/?./?[]/??=)

 

[C#] Null 관련된 연산자를 알아보자. (??/?./?[]/??=)

예전 C#을 하다 보면 Null Exception 에러를 많이 봤다. 그러다 보니 MS에서도 Null Exception 에러를 방지하기 위해서 인지 몰라도 Null 일때 예외 처리를 해줄 수 있게끔 여러 가지 연산자를 선보이고 있다. 자..

im-first-rate.tistory.com

 

LINQ 확장메서드인, Concat을 사용하는 것이다.

Concat은 문자열을 합칠 때 많이 볼 수 있었던 메서드이다. 배열도 동일하게 두 배열을 합친 결과물을 리턴해준다.

array?. 을 사용한 이유는 처음 루프를 돌 때에는 array에 값이 없기에 오류가 발생하기 때문이다. (이점을 놓치면 안 된다.)

 

결과 화면

간단하게 LINQ 확장메서드인 Concat을 이용하여 배열에서도 동적으로 크기를 늘릴 수 있는 방법을 알아보았다.

메모리 관점에서는 좋지 않은 방법일 수도 있지만, 꼭 배열을 동적으로 사용할 경우도 생길 수 있으니 알아두자.

 

반응형

+ Recent posts