04 배열

김민영·2023년 1월 3일
0

C# 기초 프로그래밍

목록 보기
4/18

🎢 배열이란

1. 목적

1) 비슷한 성질을 가지는 다수의 데이터를 다루기 위함
2) 즉, 같은 타입으로 된 여러개의 객체를 한 번에 다룰 수 있음

2. 원소 (Element)

1) 배열로 관리하는 각 객체를 의미
2) 같은 배열의 원소는 연속된 메모리 공간에 할당
3) 배열 객체에 실제로 저장된 데이터는 첫 원소가 위치한 메모리 주소

3. new 연산자

1) C#의 일부 타입은 new 연산자를 이용해 객체를 생성
2) 배열과 같이 객체에 메모리 주소가 저장되는 경우 해당



🎢 배열 사용하기

1. 객체 생성

배열도 타입의 일종이므로, 앞서 다룬 객체의 생성과 유사함
하지만 new 연산자를 이용한다!

int[] grade = new int[30];

→ 배열로 관리할 데이터의 타입[] 배열 이름 = new 연산자 각원소의 타입[배열의 크기]

2. 초기화

int[] arr = new int[5]{1, 2, 3, 4, 5};
int[] arr = {1, 2, 3, 4, 5};

→ 동일한 데이터의 배열이 생성됨

int[] arr = new int[5];
arr = {1, 2, 3, 4, 5};
  • 이는 컴파일 오류 발생
  • 초기화에 사용하는 문법을 초기화가 아닌 동작에 사용했기 때문
    → 즉, 초기값을 지정해줄 때만 위와 같은 방식을 사용
int[] arr = new int[5];
  • 위 처럼 초기화를 진행하지 않은 경우, 배열이 다루는 타입의 기본값이 초기값으로 저장됨
  • 위 배열의 원소들은 int 타입의 기본값인 0

3. 배열의 원소에 접근하기 (인덱스)

▶ 인덱스

1) 배열의 원소는 연속적으로 메모리에 배치됨
2) 첫번째 원소의 인덱스는 0
3) 다음 원소는 각각 (이전 원소의 인덱스) + 1을 인덱스로 가짐

▶ 인덱스가 0부터 시작하는 이유

1) 배열의 원소를 찾아가는 방식 (주소 연산 방식)

  • 첫번째 원소의 주소 + 각 원소의 크기 * 인덱스
  • 메모리에 연속적으로 배치되어 있기에 위 방법이 효율적

2) 첫번째 원소의 주소만 알면 연속된 이후 데이터의 주소를 알 수 있고, 이 방식을 연산할 공식을 첫번째 원소에도 적용할 수 있도록 인덱스가 0부터 시작하는 것



🎢 배열의 여러 형태

1. 다차원 배열

1) 데이터를 논리적으로 구분하여 사용하는 배열
2) 실제 메모리에 원소들이 구분되어 저장되지 않음, 연속적으로 저장되는 특징은 그대로
3) 예시 (30명 씩 10반인 학생 총 300명의 성적을 관리하는 배열을 사용할 때)

  • 기본 배열 사용하는 경우
int[] grades = new int[300] { ... };
int grade = grades[30 * (2 - 1) + (3 - 1)];

→ 두번째 반의 세번째 학생 데이터를 불러오기 위해 위와 같은 연산을 사용자가 직접해야 함

  • 다차원 배열을 사용하는 경우
int[,] grades = new int[10, 30] { ... };  // 초기화는 생략하겠습니다.
int grade = grades[1, 2];

→ 배열의 데이터를 30개씩 10세트로 논리적 구분하겠다 선언
→ 따라서 grade[1, 2]라는 간단한 방식을 통해 기본 배열을 통해 접근하기 위해 수행했던 연산이 내부적으로 수행됨

4) 2차원 배열의 초기화

int[,] arr = new int[2, 3]
{
	{1, 2, 3},
    {4, 5, 6}
};

5) 3차원 배열의 초기화

int[, , ,] arr = new int[2, 2, 3]  // [2, 3]의 2차원 배열이 두 층 있다는 개념
{
	{
    	{1, 2, 3},
        {4, 5, 6}
     },
     {
     	{7, 8, 9},
        {10, 11, 12}
     }
};

2. 가변배열

1) 배열의 각 원소가 배열인 배열
2) 즉, 배열의 원소는 다른 배열들의 시작 주소

3) 예시 (int타입의 배열을 원소로 갖는 가변배열)

int[] [] jaggedArray = new int[3][];
  • 여기서 int[]은 배열에 저장되는 원소의 타입을 의미
  • 즉, int타입의 배열을 원소로 갖는 가변배열임

4) 가변배열의 원소의 원소에 접근하기

int[][] jaggedArray = new int[3][];
int a = jaggedArray[2][1];
  • jaggedArray의 세번째 원소(배열)의 두번째 원소에 접근
  • jaggedArray[2]도 결국 배열이기에 뒤에 인덱스를 붙여 그 인덱스에 해당하는 데이터에 접근할 수 있는 것

5) 특징

  • 가변배열의 원소는 각자 다른 크기를 가질 수 있음
  • 가변배열의 원소는 연속된 메모리에 배치되지 않음
    → new 연산자로 생성된 배열은 랜덤한 주소에 배치되기 때문

0개의 댓글