[Revit API]01-4_C# 배열, 리스트

JakkeLab·2023년 10월 31일

Revit API

목록 보기
5/9

배열과 리스트는 여러 원소를 담을 수 있는 자료구조입니다.
다만 두 자료구조에 대해 차이점이 있습니다.

1. 배열

여러 원소를 담을 수 있지만, 크기가 정해져있습니다. 배열을 선언하는법은 아래와 같습니다.
// (타입명)[] 배열이름 = new (타입명)[배열크기];
string[] names = new string[5];
int[] indicies = new int[10];

그리고 배열의 값을 저장하는 방법은 2가지인데, 배열을 선언할 때 넣는방법. 그리고 선언한 뒤에 넣는 방법 2가지가 있습니다.

1) 선언할 때 넣기

배열의 크기를 정한 뒤 뒤쪽에 { }을 붙이고 안에 원소를 넣으면 됩니다. 이때, 배열을 선언할 때 타입을 지정했기 때문에, 해당 타입에 맞는 자료로
넣어야 합니다.

int[] nums = new int[3] {0, 1, 2};
string[] names = new string[4] {"Kim", "Park", "Shin", "Ha"};

2) 선언한 뒤에 넣기
배열을 먼저 선언한 뒤, 배열이름['인덱스'] = '값'; 과 같이 문장을 완성하여 값을 넣으면 됩니다.

int[] nums = new int[3]
nums[0] = 1;
nums[1] = 3;
nums[2] = 4;

이때, 배열의 크기를 명시하는 방법이 2가지가 있는데
new 뒤의 string[]의 대괄호 안에 정수를 넣거나, 대괄호 뒤에 원소를 나열해주면 해당 원소의 개수를 길이로 하고 해당 값을 가진 배열이 완성됩니다.

string[] names = new string[] {"Kim", "Park", "Shin", "Ha"};
string[] names2 = new string[4];

위의경우 배열 내 자료는 일렬로 나열되어 있으므로 1차원 배열이 됩니다.

2차원배열은 아래와 같습니다

int[,] nums = new int[,] {{1, 2},{3, 4}};	//2*2배열 선언 및 값 저장

int[,] nums2 = new int[2,2];	//2*2 배열 선언
nums2[1,1] = 5;
nums2[1,1] = 4;
...	//이어서 값 지정

이때 위의것은 배열의 사이즈를 정하지 않고, 원소를 나열하면서 배열의 크기가 정해진 것이며, 아래의 것은 원소는 정하지 않고 일단 배열의 크기를 정해서 배열을 선언한 것입니다. 물론 둘다 미리 정해서 선언할 수 있습니다.
대신 위와 같이 선언하면 크기가 3x4 와 같이 일정하게 선언이 됩니다.
3차원배열은 int[,,] = new int [,,] {...} 와 같이 선언해서 쓰면 되며, n차원 배열은 콤마(,)를 n-1개 찍으면 됩니다.

+가변배열
배열을 쓰다보면 각 행의 배열의 크기가 일정하지 않은 다차원 배열이 필요할 수 있습니다.
그런경우 아래와 같이

타입[][] 배열명 = new 타입[][] { new 타입[] {원소}, new int[] {원소}, ... };
int[][] nums4 = new int[][] { new int[] { 1, 2 }, new int[] { 3, 4, 5 } };

총 2행을 가진 배열이 나오며, 1행은 원소가 2개, 2행은 원소가 3개인 배열이 되게 됩니다.
아래와같이 선언 후에 값을 넣을 수도 있습니다.

int[][] nums5 = new int[3][] {new int[3], new int[2], new int[1] };

이때 [ , ]와는 다르게 원소 안에 각 행의 길이를 지정해줍니다. 그리고 값을 아래와 같이 지정해줍니다.

int[][] nums5 = new int[3][] {new int[3], new int[2], new int[1] };
nums5[0][0] = 1;
nums5[0][1] = 2;
nums5[0][2] = 3;
nums5[1][0] = 1;
nums5[1][1] = 2;
nums5[2][0] = 1;

2. 리스트

리스트는 아래와 같이 선언합니다.
List<타입> 리스트이름 = new List<타입>();
List<int> nums = new List<int>();

값은 아래와같이 추가합니다.

nums.Add(3);
nums.Add(5);

이때 리스트는 값을 추가하면 뒤로 추가가 되는 연결리스트 구조이므로 위와 같이 항목을 추가했다면 num에는 3, 5가 차례대로 저장되게 됩니다.

List<int> nums = new List<int>() { 3, 4, 5, 6 };

또는 위와 같이 처음에 선언할 때 값을 넣어줍니다

3. 초기화

사실 앞의 설명에서는 엄밀히 말하면 배열이나 리스트를 '선언' 하고 '초기화' 도 진행했습니다.
사실 아래와 같이 하면 선언만 된 상태입니다.

List<int> indicies;
string[] strs;

위와같은 상태에서는 값을 넣으려고 하면 아래와같이 오류가 납니다.

즉, C#에서 변수를 선언하는 것은 indicies나 strs와 같은 배열을 만들기만 하는 것이며, 해당 리스트나 배열을 사용할 수 있도록 하는 것이
new 키워드의 역할입니다. 배열이라면 배열의 크기를 정해주어야 하며, 리스트는 리스트의 타입과 해당 리스트에 담을 값을 지정하는 등으로 초기화 할 수 있습니다.

위 사진 처럼, 우리가 물건을 창고에 정리하려고 할 때 서랍장을 설치해서 수납할 공간을 만들어 주는게 new 를 통한 초기화 라고 이해하면 편할 것 같습니다. (바닥에 둔다거나 하는 경우는 제외합니다.)

차이점

배열

  • 초기화 시 크기가 정해진다.
  • 크기를 미리 정해놓고 사용하므로, 넘어선 만큼 값을 넣을 수 없다.

리스트

  • 크기가 명시적으로 정해져있지 않다.
  • 크기가 따로 정해져 있지 않아 값을 계속 넣을수는 있지만, 넣은 값의 개수보다 더 뒤쪽의 항목을 호출하려고 하면 오류가 난다.

사진은 값을 1개만 넣었는데 2번째 원소에 접근해서 값을 바꾸려고 시도했을 때 나는 오류입니다.


이번 예제는 따로 소스코드가 없습니다. 다음 강의인 조건문, 반복문에서 예시 코드가 제공됩니다.

profile
시간을 설계하는 건축가

0개의 댓글