C# 프로그래밍 9번째 시간 - 배열
유니티의 아홉걸음, C# 공부시작 39일차
오늘은 배열(Array)에 대해서 배우겠습니다!
바로 시작해보죠!
1. 배열의 개념
배열은 동일한 타입의 변수를 모아놓는 데이터 집합이라고 말할 수 있습니다.
지금까지 배웠던 int, char..등등 여러 가지의 변수 중 하나를 지정하고
한 변수에서 하나의 숫자만 집어넣는 것이 아닌, 여러 가지 숫자를 집어넣을 수 있게 만들어주는 것입니다.
예시로 한 교실에서 인원들의 수학 점수를 정리하기 위해 변수를 선언해보겠습니다.
...
int reading_1 = 98;
int reading_2 = 100;
int reading_3 = 51;
int reading_4 = 70;
int reading_5 = 81;
int reading_6 = 92;
...
이렇게 한다면 하나하나 일일이 설정해야 되서 번거롭고 비효율적입니다.
30명의 점수를 입력해야 된다고 할 때 비슷한 성격의 변수를 똑같이 30번을 선언해야 됩니다.
이런 불편한 문제들을 배열이 해결해줍니다. 여러 개의 데이터를 하나로 묶을 수 있기 때문입니다.
위의 예를 배열로 구현해보겠습니다.
...
int[] reading = new int[30]{98, 100, 51, 70, 81, 92, ..., ..., ...}
...
앞에서는 변수를 여러 개를 설정하였는데, 단 한줄이면 완성됩니다. 참 간편하죠?
배열에 접근할 때는 첨자값 (index)으로 접근하는데 여기서 중요한 건 항상 0부터 시작한다는 것입니다.
이해가 잘 안될 수 있으니 앞에서 선언한 배열을 이용하여 출력을 해봅시다.
...
Console.WriteLine("reading[0]={0}", reading[0]); // reading[0]=98
Console.WriteLine("reading[1]={0}", reading[1]); // reading[1]=100
Console.WriteLine("reading[2]={0}", reading[2]); // reading[2]=51
...
첨자값을 1로 착각하여 1부터 출력을 한다면 0 자리에 있는 숫자는 출력되지 못합니다.
다음은 배열의 선언 방법입니다.
자료형[] 배열명 = new 자료형[크기];
예를 들어, 크기 5를 가진 int 형식의 배열 student를 선언하면 이렇게 선언합니다.
int[] student = new int[6];
student[0] = 4;
student[1] = 9;
student[2] = 1;
..
여기서 우리는 6개의 공간을 만들었고, 0부터 시작하여 5의 자리까지 끝나게 됩니다.
배열의 기본적인 것을 알았으니 이를 활용하여 예제를 만들어봅시다!
[배열을 사용한 예제]
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int[] reading = new int[6] { 4, 9, 1, 0, 21, 12 };
for (int i = 0; i < reading.Length; i++)
Console.WriteLine("reading[" + i + "]={0}", reading[i]);
}
}
}
이에 따른 결과는 이렇습니다.
reading[0]=4 <br>
reading[1]=9 <br>
reading[2]=1 <br>
reading[3]=0 <br>
reading[4]=21 <br>
reading[5]=12 <br>
자, 처음 만들어본 예제이므로 한번 살펴보겠습니다.
이 예제는 각 학생들이 한 학기 동안 읽은 책의 갯수를 확인하고 출력하는 것입니다.
먼저 reading이라는 int형 배열을 선언 후 6개의 공간을 만들었습니다.
그리고 공간마다 4, 9, 1, 0, 21, 12라는 값으로 초기화하였습니다.
그리고 예전에 배웠던 for문을 활용하여 reading의 길이인 크기를 반복하여 코드를 실행하였고
이에 따라 0의 자리에 있는 요소부터 5의 자리에 있는 요소까지 출력을 하였습니다.
reading.Length는 말 그대로 reading이라는 배열에서 가지고 있는 요소 갯수를 의미합니다.
따라서 6개의 요소를 만들었으니 i는 0부터 시작하여 5까지 커진 후 5의 자리에 있는 요소까지 출력합니다.
여기서 추가로 배열의 선언과 동시에 초기화를 할 수 있는데 이를 한번 이용해보겠습니다. 방법은 이러합니다.
int[] reading = {4, 9, 1, 0, 21, 12};
이 방식은 배열의 크기를 지정하지 않았는데도 정상적으로 출력이 됩니다.
이유는 초기화할 때 배열 요소의 수로 길이가 지정되기 때문입니다. 또 다른 방식은 이러합니다.
int[] reading = new int[]{4, 9, 1, 0, 21, 12};
2. System.Array
배열을 활용한 클래스도 존재합니다. 클래스에 대한 자세한 내용은 다음 시간인 ‘클래스’에 대해서 배워보겠습니다.
기능이 매우 많기에 이를 간략하게만 보겠습니다.
분류 | 이름 | 기능 |
---|---|---|
속성 | Rank | 배열의 차원 수를 가져옵니다. |
Length | 배열의 길이를 가져옵니다. | |
메소드 | Clear | 배열 형식에 따라 정수 형식일 경우 0, 논리 형식일 경우 false, 참조 형식일 경우 null으로 초기화됩니다. |
ForEach | 지정한 배열의 각 요소에서 지정한 동작을 수행합니다. | |
Resize | 배열의 요소 수를 지정된 새로운 크기로 변경합니다. | |
indexOf | 지정한 개체를 검색하여 1차원 Array 전체에서 처음 검색된 개체의 인덱스를 반환합니다. |
이 표는 주로 클래스에서 사용하는 속성과 메소드를 정리한 것인데
Rank부터 시작해서 직접 사용하여 어떤 기능을 하는지 알아보겠습니다.
앞의 내용들을 이용해서 먼저 예제를 만들어 보겠습니다.
[배열의 클래스 사용한 예제]
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int[] reading = new int[] { 4, 9, 1, 0, 21, 12 };
Console.WriteLine("속성: Rank={0}, Length={1}", reading.Rank, reading.Length);
// reading의 차원 수와 길이를 반환함
Console.Write("Clear 메소드: ");
Array.Clear(reading, 0, 5); // 배열 요소를 0부터 시작하여 5개의 요소를 초기화 시킴
// Array.Clear(요소를 지울 배열, 시작 인덱스, 지울 요소수);
Array.ForEach<int>(reading, new Action(ShowValue));
// 해당 배열의 각 요소를 가지고 동작(ShowValue)를 수행함
// Array.ForEach<데이터타입>(동작을 수행할 배열, new Action<데이터타입>(액션);
Console.WriteLine();
Console.Write("Resize 메소드: ");
Array.Resize(ref reading, reading.Length + 3);
// reading 배열의 길이를 3만큼 늘림, Array.Resize(배열의 주소값, 새 배열의 크기);
Array.ForEach<int>(reading, new Action<int>(ShowValue));
Console.WriteLine();
Console.WriteLine("indexOf 메소드: {0}", Array.IndexOf(reading, 12));
// 배열에서 12란 값을 가지고 있는 요소의 인덱스를 반환함
// Array.IndexOf(배열, 찾고자 하는 값);
}
static void ShowValue(int value) // 동작, value를 받아 그 value를 출력시킴
{
Console.Write("{0} ", value);
}
}
}
이에 따른 결과는 이렇습니다.
속성: Rank=1, Length=6 <br>
Clear 메소드: 0 0 0 0 0 12 <br>
Resize 메소드: 0 0 0 0 0 12 0 0 0 <br>
indexOf 메소드: 5 <br>
상당히 복잡해보이지만 나중에 프로그래밍을 할때 사용될 수 있는 매우 유용한 것들입니다.
메소드의 사용 형식을 조금 더 공부해봐야겠습니다..ㅎㅎ
여기서 Rank라는 것을 썼는데 이는 차원을 의미합니다. 이것에 대해 추가적으로 공부해보겠습니다.
3. 다차원 배열
우리는 배열을 활용하여 차원을 만들 수 있습니다.
표처럼 열과 행을 활용하여 2차원 상자에 값을 넣을 수도 있고
실질적인 박스처럼 3차원을 만들어서 값들을 넣을 수도 있습니다.
지금까지 예제로 만들어봤던 배열은 모두 1차원입니다.
2차원은 한 줄로 되어 있는 1차원과 달리 가로와 세로를 이용한 평면의 사각형으로 되어 있습니다.
2차원 배열을 선언하는 형식은 이렇습니다.
자료형[,] 배열명 = new 자료형[행, 열];
이제 2차원 배열을 직접 활용하여 예제를 만들어보겠습니다.
[2차원 배열을 사용한 예제]
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int[,] reading = new int[3, 6] { { 4, 9, 1, 0, 21, 12 }, { 1, 4, 6, 0, 9, 5 }, { 4, 4, 2, 4, 0, 0 } };
for (int i = 0; i < reading.GetLength(0); i++)
for (int j = 0; j < reading.GetLength(1); j++)
Console.WriteLine("reading[" + i + ", " + j + "] = {0}", reading[i, j]);
}
}
}
이에 따른 결과는 이렇습니다.
reading[0, 0] = 4 <br>
reading[0, 1] = 9 <br>
reading[0, 2] = 1 <br>
reading[0, 3] = 0 <br>
... <br>
reading[2, 4] = 0 <br>
reading[2, 5] = 0 <br>
reading이라는 2차원 배열을 선언하고 동시에 초기화를 진행하였고, 그 다음 for문의 중첩이 등장합니다.
for문의 조건식에 쓰이는 GetLength라는 메소드는 각 차원의 요소 수를 반환하는 메소드입니다.
GetLength(0)은 3이 되고, GetLength(1)은 6이 됩니다. 여기서는 앞의 1차원과 마찬가지로 0부터 시작합니다.
따라서 0이 1차원, 1은 2차원입니다.
++ 문자열 사이에 있는 + 연산자에 대해서 추가로 알아봅시다.
[+연산자는 전에 나왔던 산술 연산자인데,
피연산자가 정수, 실수가 아닌 문자열이 등장한 것을 볼 수 있습니다.
이것은 연산자 오버로딩을 통해서 문자열 형식에 대해서 연산이 미리 정의되어 있는 것입니다.
예를 들어 “제 이름은” + name + “입니다.”를 쓰면 출력은 “제 이름은 홍길동입니다.”라고 나오는 것입니다.]
2차원 배열이외에도 당연히 3,4,5차원 배열이 있지만 잘 안씁니다. 매우 복잡하기 때문입니다.
참고로 3차원 배열 선언은 이러합니다.
자료형[,,] 배열명 = new 자료형[높이, 세로, 가로];
4,5차원은 진짜 안쓸 것 같고 아마 3차원은 매우 특수한 환경일때는 이용할 것 같긴 합니다..!!
마치며
지금까지 배열에 대해서 공부하였고, 다음 시간은 클래스에 대해서 자세하게 알아보겠습니다!!
특히 배열은 다른 내용들과 마찬가지로 프로그래밍에서 유용하게 쓸 내용 중에 하나이므로 잘 익혀두는 것이 좋을 것 같습니다.
Comments