C#

C# [배열]

devrabbit22 2025. 5. 7. 11:27

배열(array)이란 무엇이고 왜 필요한가?

  • 개발자를 편리하게 만들어주는 것이 배열이다.
  • 개발자가 관리해야할 제품의 수의 양이 많다면 코드의 양도 증가하는데, 배열을 사용해 이 문제를 해결 할 수 있다.
int box1 = 1000;
int box2 = 2000;
int box3 = 3000;
//이렇게 관리하는 것이 아닌 배열을 선언해 사용한다.

int[] boxs = new int[5];
string[] names = new string[1000];

new라는 예약어와 함께 배열을 정의하기 위한 대괄호(square bracket) 문장부호를 볼 수 있다.

C#에서 new 키워드는 참조 형식과 함께 사용되는 경우 그에 필요한 메모리 힙(Heap)에 할당하는 역할을 한다.

변수를 선언할 때 대괄호를 사용하면 해당 변수가 배열임을 의미한다.

배열과 일반 자료형의 차이점

int product = 500이라는 코드는 4바이트의 메모리 공간을 할당하고 그 메모리를 조작하는 식별자로 product라는 변수명을 부여하는 것과 같다.

일반 변수의 메모리 구조

배열은 동일한 타입의 공간을 지정된 수만큼 메모리에 연속적으로 할당한다.

배열의 메모리 구조

배열의 값을 별도로 힙에 할당하고 있다. - 배열도 참조 형식에 속한다.

 

연속적으로 할당된 요소에 대해 개별적으로 접근하려면?

  • 대괄호를 사용하면 된다. 다만, 주의할 점 - 시작 번호가 1이 아닌 0이다.(zero-based index)
products[0] = 100;
products[1] = 200;

int book = products[0];

int sum = products[0] + products[1];

대괄호 안에 지정되는 수를 색인(index)라고 한다.

배열의 경우 값을 추기화하는 방법이 2가지 있다.

int [] products = new int[5] = {1, 2, 3, 4, 5};	//배열의 요소 개수를 지정

int [] products = new int[] = {1, 2, 3, 4, 5);	//배열의 요소 개수를 미지정
  • 배열의 요소 개수를 지정하면 배열을 초기화하려면 반드시 그 수만큼의 요소를 나열해야 한다.
  • 배열의 요소 개수를 미지정 햇을 때는 개발자가 명시적으로 배열의 수를 지정하지 않은 채로 초기화 요소를 나열했으므로 컴파일러는 그 수만큼 계산해서 자동으로 배열의 크기를 5로 지정한다.

string 자료형을 보면 char형 문자가 모여서 이뤄진 연속된 데이터이다. string은 기본적으로 개별 char 문자에 접근할 수 있는 대괄호 구문을 제공한다. - string 타입이 인덱서를 구현했기 때문에 배열처럼 다룰 수 잇는 것이다.

string text = "Hello World";
char ch1 = text[0];
char ch2 = text[1];

Console.WriteLine(ch1);	//출력 결과 : H
Console.WriteLine(ch2);	//출력 결과 : e

배열이 사용된 또 다른 구문을 보면 Main 메서드 괄호 안에 들어간 구문이 string 배열이다.

배열을 다룰 때 주의 사항 

  • 한번 정해진 배열의 크기는 고정된다.
  • 참조 변수의 특성상 가리키는 대상이 변할 수 있기 때문에 변경된 크기의 배열을 다시 가리키는 것은 가능하지만, 처음에 있었던 배열의 크기가 변경된 것은 아니다.
  • int [] students = new int[60]; students[0] = 50; Console.WriteLine(students[0]); //출력 결과 : 50 students = new int[120]; Console.WriteLine(students[0]); //출력 결과 : 0

마지막으로 배열을 선언하는 경우 기본적으로 모든 값은 타입에 따른 초기화 값을 가지게 된다.

이 규칙은 '기본값'의 내용을 따른다.

'값 형식'의 배열이라면 기본값으로 0에 준하는 값을 갖고, 참조 형식의 배열(ex: string)이라면 개별 요소가 null로 초기화 된다.

다차원 배열

  • 차수가 2 이상이 되면 다차원 배열(multi-dimensional array)라고 한다.
  • 다차원 배열을 사용하려면 차원 분리자인 콤마(,)를 이용해 선언하면 된다.
int[, ] arr2 = new int[10, 5];	//2차원 배열
short[,,] arr3 = new short[8, 3, 10];	//3차원 배열

다차원 배열을 선언하면 요소의 수가 개별 차원의 수를 곱한 만큼 계산되고 그 수만큼 메모리가 할당 된다.

arr2 배열은 10 * 5로 50개의 요소에 대해 각각 4바이트(int 형)씩 총 200 바이트의 메모리를 점유하고, arr3 배열은 8 *3 * 10으로 240개의 요소에 대해 2바이트(short)씩 총 480 바이트의 메모리를 점유한다.

배열 요소의 차수에 따라 시각화 한 데이터

1차원 배열
2차원 배열
3차원 배열

다차원 배열에서도 변수의 선언과 함께 초기화가 가능하다.

일반적으로 작성하는 프로그램에서는 1차원 배열이 주로 사용되고, 수행의 행렬을 다루는 게임 프로그래밍을 하면 2차원 배열 정도가 사용된다. 3차원 배열 이상은 사용 빈도가 극히 낮은 편에 속한다.

가변 배열

  • C#에서는 다차원 배열 외에 가변 배열(jagged array)을 지원하는데, 다른 말로 '배열의 배열'이라고도 한다.
int [][] arr = new int [5][];	//2차원 가변 배열
arr[0] = new int[10];
arr[1] = new int[9];
arr[2] = new int[8];
arr[3] = new int[3];
arr[4] = new int[5];

다차원 배열이 콤마를 이용해 차수를 구분하는 반면, 가변 배열은 각 차수마다 대괄호를 사용한다는 특징이 있다.

가변배열의 시각화한 구조

가변 배열의 할당 구조

  • 가변 배열은 배열의 요소가 임의 크기의 배열이 될 수 있는데, 이 점이 다차원 배열과의 뚜렷한 차이점이다.
  • 다차원 배열이 [m, n] 차원을 갖는 경우 무조건 m * n개의 요소가 할당돼 상황에 따라 메모리를 크게 낭비하는 경우가 발생한다.
  • 가변 배열은 각 요소별로 필요한 만큼의 배열 크기를 임의로 결정할 수 있으므로 개발자가 올바르게만 쓴다면 메모리를 최적화된 상태로 사용할 수 있다.

이러한 장점에도 불구하고 요소의 크기를 가변적으로 운영하는 경우는 많이 볼 수 없었다고 한다.

  • 개발자가 직관적으로 인식하기에는 m * n개의 고정된 배열이 머릿속에서 기억하기 편하고 유지보수하기도 쉽기 때문이다. 
  • 이로 인해 가변 배열을 사실상 다차원 배열처럼 m * n개로 사용하는 경우가 좀 더 일반적이다.

Reference

시작하세요! C# 12 프로그래밍 기본 문법부터 실전 예제까지

'C#' 카테고리의 다른 글

C# 객체지향 문법 [클래스, 필드, 메서드]  (0) 2025.05.12
C# [제어문]  (0) 2025.05.09
C# [기본 문법 요소]  (0) 2025.05.07
C# [형 변환]  (0) 2025.05.05
C# [기본 자료형]  (3) 2025.05.04