이번 강좌에서는 어떠한 랭귀지를 배우든지 자주 사용하게 되는 배열에 대해 배워보도록 합니다.
C#의 배열은 자바의 그것과 유사하니 자바를 배우신 분들은 가볍게 읽어 보시면 될듯.
Array
배열은 System.Array라는 클래스에서 파생 되었으며 배열의 모든 Element는 형(Type)이 같아야 합니다. 물론 구조체인
경우에는 Element의 Type이 다르죠...
여기서 Element는 배열에 들어 있는 각각의 데이터를 말하며 Index라는 것은 배열내에서 그 데이터가 몇번째 있느냐를 나타내는
겁니다. 물론 인덱스는 0부터 시작 합니다. 또한 Length라는 속성이 있는데 이것은 배열이 몇개의 데이터를 담고 있는가 하는 것입니다.
Rank는 차원으로 보시면 되구요...
형식은 아래와 같습니다.
type [] name;
type --> this specifies the element type of the array
[] --> this specifies the rank of the array
name --> this specifies the name of the array variable
long [] row; --> Rank 1 – one dimensional single index associates with
each long element
int [,] grid; --> Rank 2 – two dimensional two index associates with
each int element
long [] row;
row[3];
아래의 그림 참조
int [,] grid;
grid[1,2];
아래의 그림 참조
아래의 예도 참고 하세요...
int [] myArray; // 선언
myArray = new int[3] {1,2,3}// 인스턴스화
위 두개를 함께 int [] myArray = new int[3] {1,2,3}
다음은 다차원 배열 입니다.
다차원 배열 정의
int [,] myArray = new int[2,3] {{11,12,13},{21,22,23}}
int [,,] myArray //? 3차원
--> 배열의 크기와 { } 안의 element 개수가 일치해야 합니다. [3,2] 의 2 차원 배열이라면 2 개 짜리가 3 개
있다는 뜻임(3행2열) . 즉 { {11,12}, {21,22}, {31,32} }과 같이 요소를 넣어 주어야 합니다. 배열에 들어갈
element 를 중간에 바꾸거나 , 또는 { } 를 쓸 수 있을 정도로 고정된 값이 아니라면 index 를 이용하여 접근 합니다 .또한 배열의
크기는 run-time 에 바꿀 수 있습니다.
아래의 그림을 보도록 하죠... Length라는 속성을 봅니다. 그림을 보고 이해 하도록 하세요~
배열의 인덱스 접근에 대해 보도록 합니다.
int [] a = new int[3]{1,2,3}
위의 식은 아래와 같이 바꿀 수 있습니다.
int [] a;
a[0]=1; a[1]=2; a[2]=3;
배열명[index] 라고 쓰면 그 배열의 index순서에 있는 element를 뜻합니다. 주의 할 것은 첫번째 element의
index가 0 이란 점이다.(위에서 벌명 드렸습니다)
배열의 유효 index 범위를 넘는 인덱스를 사용하면 IndexOutOfRangeException예외가 발생 합니다.
아래 두배열 선언이 같은 효과를 내는지는 아시죠!~
아래의 그림을 보고 다차원 배열([,])과 배열의배열([][])의 차이에 대해 알아보도록 합니다.
위의 그림에서 아래 왼쪽에 있는것은 잘못된 표현 입니다. 콤마(,)로 구분 할때는 반드시 값을 채워 줘야 합니다. 불규칙적인 배열은
[][]형태로 해주어야 합니다.
아래 배열의배열 예를 보세요~
(예) 삼각형 모양의 배열
11
21 22
31 32 33
11
21 22
31 32 33
int [][] myArray = new int [3][]
myArray[0] = new int[1] {11};
myArray[1] = new int[2] {21,22};
myArray[2] = new int[3] {31,32,33};
또한 배열의 크기는 컴파일시 결정지어지지 않아도 됩니다.
long [] row = new long[4];
string s = Console.ReadLine();
int Size = int.Parse(s);
long [] row = new long[Size];
int Size = int.Parse(s);
long [] row = new long[Size];
다음은 배열 변수의 복사에 대해 보도록 합니다.
long[] row = new long[4];
long[] copy = row; //row가 보고 있는것을 copy도 볼수있게 하는것,,,
..
row[0]++; //row[0]을 변화 시키면 copy[0]도 저절로 변화되는 것과 같은 것이다.
int value = copy[0];
Console.WriteLine(value);
long[] copy = row; //row가 보고 있는것을 copy도 볼수있게 하는것,,,
..
row[0]++; //row[0]을 변화 시키면 copy[0]도 저절로 변화되는 것과 같은 것이다.
int value = copy[0];
Console.WriteLine(value);
아래는 배열의 초기화 예제 입니다.
int[] kor; ? OK
int kor[]; ? Error
Int[10] kor; ?Error , 선언시 크기 명시하면 안됨,new를 통해 초기화
int[] kor;
kor = new int[] { 99, 88, 77};
kor = new int[3] { 99, 88,77};
int[] kor = new int[] { 99, 88,77};
int[] kor = { 99, 88,77};
int kor[]; ? Error
Int[10] kor; ?Error , 선언시 크기 명시하면 안됨,new를 통해 초기화
int[] kor;
kor = new int[] { 99, 88, 77};
kor = new int[3] { 99, 88,77};
int[] kor = new int[] { 99, 88,77};
int[] kor = { 99, 88,77};
int[][] age = new int[2][]; //배열의배열
age[0] = new int[] {30, 40};
age[1] = new int[] {17, 18};
age[0] = new int[] {30, 40};
age[1] = new int[] {17, 18};
int[,] count = new int[,] {
{3, 4, 5},
{5, 7, 8}
};
{3, 4, 5},
{5, 7, 8}
};
이번에는 Array의 속성에 대해 알아 보도록 하겠습니다.
아래의 그림을 보시면 이해가 되실 겁니다.(Rank, Length)
(1)
(2)
[예제]
using System;
class Array1
{
static void Main(string[] args)
{
int[] one = new int[2];
int[,] two = new int[2,3];
Console.WriteLine("one은 {0}차원 배열 입니다.", one.Rank);
Console.WriteLine("two는 {0}차원 배열 입니다.", two.Rank);
class Array1
{
static void Main(string[] args)
{
int[] one = new int[2];
int[,] two = new int[2,3];
Console.WriteLine("one은 {0}차원 배열 입니다.", one.Rank);
Console.WriteLine("two는 {0}차원 배열 입니다.", two.Rank);
Console.WriteLine("one의 길이는 {0}입니다.",
one.Length);
Console.WriteLine("two의 길이는 {0}입니다.", two.Length);
}
}
Console.WriteLine("two의 길이는 {0}입니다.", two.Length);
}
}
[결과]
one은 1차원 배열 입니다.
two는 2차원 배열 입니다.
one의 길이는 2입니다.
two의 길이는 6입니다.
two는 2차원 배열 입니다.
one의 길이는 2입니다.
two의 길이는 6입니다.
다음은 자주 사용되는 배열의 메소드에 대해서알아 보도록 하겠습니다.
Sort : sorts the elements in an array of rank 1
Clear : sets a range of elements to zero or null
Clone : creates a copy of the array
GetLength: returns the length of a given dimension
IndexOf : returns the index of the first occurrence of a value
Clear : sets a range of elements to zero or null
Clone : creates a copy of the array
GetLength: returns the length of a given dimension
IndexOf : returns the index of the first occurrence of a value
[예제]
using System;
class Array2
{
static void Main(string[] args)
{
int[] one = new int[] {2, 1, 4, 5};
int[] clone = (int[])one.Clone();
foreach(int i in clone)
{
Console.Write("{0} ", i);
}
int where = Array.IndexOf(clone, 4);
Console.WriteLine("\n4의 위치는 {0} 번째 입니다.",
where+1);
class Array2
{
static void Main(string[] args)
{
int[] one = new int[] {2, 1, 4, 5};
int[] clone = (int[])one.Clone();
foreach(int i in clone)
{
Console.Write("{0} ", i);
}
int where = Array.IndexOf(clone, 4);
Console.WriteLine("\n4의 위치는 {0} 번째 입니다.",
where+1);
Array.Sort(clone);
Console.WriteLine("Sort후 ...");
foreach(int i in clone)
{
Console.Write("{0} ", i);
}
}
}
Console.WriteLine("Sort후 ...");
foreach(int i in clone)
{
Console.Write("{0} ", i);
}
}
}
[결과]
2 1 4 5
4의 위치는 3 번째 입니다.
Sort후 ...
1 2 4 5
4의 위치는 3 번째 입니다.
Sort후 ...
1 2 4 5
아래의 예제를 통해 배열을 메소드의 리컨 값으로 사용하는 것을 이해하세요.
class Example {
static void Main() {
int[] array = CreateArray(42); //메소드의 리컨값을 고려해서 등호 좌측을 int[] 배열로 받았습니다.
…
}
static int[] CreateArray(int size) {
int[] created = new int[size];
Return created;
}
}
static void Main() {
int[] array = CreateArray(42); //메소드의 리컨값을 고려해서 등호 좌측을 int[] 배열로 받았습니다.
…
}
static int[] CreateArray(int size) {
int[] created = new int[size];
Return created;
}
}
다음은 배열을 파라미터로 이용하는 예제 입니다...
class Example2 {
static void Main() {
int[] arg = { 10, 9 , 8, 7 };
Method(arg);
System.Console.WriteLine(arg[0]);
}
static void Method(int[] parameter){
parameter[0]++; //이곳에서 값을 바쭈어도 메인에 있는 배열의 값이 바뀝니다. 배열을 인자로 넘길때는 Pass By Reference로 넘기니까요...
}
}
static void Main() {
int[] arg = { 10, 9 , 8, 7 };
Method(arg);
System.Console.WriteLine(arg[0]);
}
static void Method(int[] parameter){
parameter[0]++; //이곳에서 값을 바쭈어도 메인에 있는 배열의 값이 바뀝니다. 배열을 인자로 넘길때는 Pass By Reference로 넘기니까요...
}
}
[결과]
11
이상과 같이 배열에 대해 자세히 알아 보았습니다.
댓글 없음:
댓글 쓰기