배열의 선언
데이터형식[] 배열이름 = new 데이터형식 [ 용량 ];
ex) int[] arr = new int[3];
배열을 초기화하는 세가지 방법
string[] array1 = new string[2] {"안녕", "hello", "halo"};
string[] array2 = new string[] {"안녕", "hello", "halo"}; // 배열을 선언과 동시에 초기화할때는 [] 안에 용량을 명시하지않아도됨
string[] array3 = {"안녕", "hello", "halo"};
System.Array
C#에서는 모든 것이 객체이며 , 기반이되는 형식이 있다. 배열또한 객체이며 , .NET 프레임워크의 CTS(Common Type System}에서 배열은 System.Array 클래스에 대응된다.
// GetType() 메소드를 사용하면 객체의 클래스 타입을 알 수 있고, BaseType() 메소드를 사용하면 객체의 기반클래스의 타입을 알 수 있다.
ex ) int[] array = new int[2]; 에서 array.GetType() 의값은 System.Int32[] 이며 array.BaseType(); 의 값은 System.Array 이다.
* 객체의 클래스 타입을 알게 되면 , 그 클래스에 포함되어있는 메소드와 프로퍼티를 모두 이용할 수 있게되므로, 유용하게 쓰일 수 있다.
2차원 배열의 선언
데이터형식[ , ] 배열이름 = new 데이터형식 [ 2차원길이 , 1차원길이 ];
ex ) int [ , ] array = new int [2,3]; 은 2X3 배열을 만든다. (행이 2 , 열이 3)
2차원배열의 초기화 또한 1차원배열초기화 방법처럼 3개가있고 , 동일하게 사용하면된다.
ex) int[,] array = new int[2,3] = { {1,2,3} , {4,5,6} };
가변배열
가변배열은 영어로 jagged array 인데 , 이는 들쭉날쭉한 배열이라는 뜻이다. 배열의 길이를 늘였다 줄였다 할 수 있는 배열이라는 뜻이 아니다.
가변배열의 요소는 배열이다 . 배열은 객체이므로 하나하나의 배열 객체를 담고있는것이된다.
데이터형식[][] 배열이름 = new 데이터형식[가변배열의 용량(행의길이)] [ ];
ex)
int[][] jagged = new int[3][];
jagged[0] = new int[5] { 1,2,3,4,5 }; // 배열은 객체이다
jagged[1] = new int[] {10,20,30};
jagged[2] = new int[] {10,20};
가변배열또한 선언과 동시에 초기화 할 수 있다.
int[][] jagged = new int[2][]
{
new int[] { 1000 , 2000 , 3000 }, // ; 가아닌 , 를 사용한다.
new int[2] { 1,3 }; // 마지막에는 ; 사용
};
컬렉션
컬렉션은 같은 성격을 띄는 데이터의 모음을 담는 자료구조이다. 배열또한 컬렉션 자료구조의 일부분이다. 컬렉션에 속한 ArrayList , Queue , Stack , Hashtable 클래스들에 대해 알아보자.
ArrayList
ArrayList 컬렉션은 컬렉션요소에 접근할때는 [] 연산자를 이용하고, 특정 위치에 있는 요소를 임의로 할당할 수있다. 또한 컬렉션을 생성할 때 , 용량을 따로 지정할 필요 없이 자동으로 용량이 늘었다가 줄었다가 한다.
ArrayList의 가장 중요한 메소드는 Add() , RemoveAt() , Insert() 이렇게 세가지인데, Add() 메소드는 컬렉션의 가장 마지막에있는 요소 뒤에 새 요소를 추가하는 메소드이고, RemoveAt()메소드는 특정 인덱스에 있는 요소를 제거하고, Insert() 메소드는 원하는 위치에 새 요소를 삽입한다.
ex)
ArrayList list = new ArrayList();
list.Add(10);
list.Add(20);
lsit.Add(30);
list.RemoveAt(1); // 20을 삭제
list.Insert(1,25); // 25를 1번 인덱스에 삽입
Queue
Queue 컬렉션은 데이터나 작업을 차례대로 입력해뒀다가 들어온 순서대로 하나씩 꺼내 처리하기 위해 사용한다. 프린터가 여러 문서를 출력할때 , 인터넷 동영상 스트리밍 서비스에서 컨텐츠를 버퍼링할 때 등에 사용된다. Queue에서 데이터를 입력하는것은 오로지 맨뒤에서만 이루어지며, 이는 Enqueue() 메소드를 이용해서 이루어진다.
ex)
Queue que = new Queue();
que.Enqueue(1);
que.Enqueue(2):
que.Enqueue(3);
데이터를 꺼낼때는 Dequeue() 메소드를 통해 이루어진다. Dequeue()메소드로 데이터를 꺼내면 , 실제로 데이터를 컬렉션에서 꺼내게 된다( 컬렉션에서는 꺼낸 데이터가 사라진다). 맨앞에서부터 꺼내진다.
ex)
int a = que.Dequeue(); // a에 1 값 저장.
int b = que.Dequeue(); // b에 2 값 저장.
Stack
Stack은 먼저 들어온 데이터가 나중에 나가고 , 나중에 들어온 데이터는 먼저 나가는 구조의 컬렉션이다.
Stack에 데이터를 넣을 때는 Push() 메소드를 이용하고. 데이터를 꺼낼때는 Pop() 메소드를 이용한다.
ex)
Stack stack = new Stack();
stack.Push(1); // 가장 나중에나올 데이터
stack.Push(2);
stack.Push(3); // 가장 나중에 나올 데이터
int a = (int)stack.Pop(); // a에 3 저장
Hashtable
Hashtable 컬렉션은 Key와 Value 의 쌍으로 이루어진 데이터를 다룰때 사용한다. 예를들어 "book"을 Key로 , "책"을 Value로 입력하는 식이다.
Hashtable은 탐색속도가 빠르고, 사용하기도 편하다.
ex)
Hashtable ht = new Hashtable();
ht["book"] = "책";
ht["cook"] = "요리사";
ht["tweet"] = "지저귀다";
Console.WriteLine(ht["book"]); // 책 출력
Hashtable 형식은 문자열뿐만아니라 int 형식 , double 형식 등등 어떤형식이든 Key로 활용할 수 있다.
인덱서
인덱서는 index 를 이용해서 객체 내의 데이터에 접근할 수 있게 해주는 프로퍼티이다. 객체를 마치 배열처럼 사용할 수 있게 해준다.
인덱서의 선언
class 클래스이름
{
한정자 인덱서형식 this [형식 index] // 인덱스의 식별자가 꼭 index일 필요없으므로 적당한 이름을 사용하면 된다.
{
get
{
// index를 이용하여 내부 데이터 반환
}
set
{
// index를 이용하여 내부 데이터 저장
}
}
}
ex)
class MyList
{
private int[] array;
public MyList()
{
array = new int[3];
}
public int this [int index]
{
get
{
return array[index];
}
set
{
if (index >= array.Length)
{
Array.Resize<int>(ref array, index+1);
Console.WriteLine("Array Resized : {0}" , array.Length);
}
array[index] = value;
}
}
}
foreach가 가능한 객체
foreach문은 IEnumerable 과 IEnumerator인터페이스를 상속하는 클래스만 지원한다. 배열과 컬렉션은 이 두개의 인터페이스를 상속하는 클래스이기 때문에 사용 가능하다.
IEnumerable 인터페이스가 가지고 있는 메소드
IEnumerator GetEnumerator() - IEnumerator 형식의 객체를 반환한다. (컬렉션을 반복하는 열거자를 반환한다)
IEnumerator 인터페이스가 가지고 있는 메소드
boolean MoveNext() - 다음 요소로 이동한다. 컬렉션의 끝을 지난 경우에는 false, 이동이 성공한 경우에는 true 를 반환한다.
void Reset() - 컬렉션의 첫번째 위치의 "앞"으로 이동한다. ex) 첫번째 위치가 0이라면 -1 로 이동, 첫번째 위치로의 이동은 MoveNext()를 호출한 다음에 이루어진다.
Object Current { get; } - 컬렉션의 현재 요소를 반환한다.
ex)
//IEnumerable 멤버
public IEnumerator GetEnumerator()
{
for(int i = 0; i < array.Length; i++)
{
yield return (array[i]);
}
}
//IEnumerator멤버
int position = -1;
public bool MoveNext()
{
if(positoin == array.Length-1)
{
reset();
return false;
}
position ++;
return (position< array.Length);
}
public object Current()
{
get
{
return array[position];
}
}
public void Reset()
{
position = -1;
}
'C#언어 > 뇌자극C#5.0' 카테고리의 다른 글
C# : Chapter - 11 예외 처리하기 (0) | 2018.01.26 |
---|---|
C# : Chapter -10 일반화 프로그래밍 (0) | 2018.01.14 |
C# : Chapter -8 프로퍼티 (0) | 2018.01.08 |
C# : Chapter -7 인터페이스 (0) | 2017.12.16 |
C# : Chapter -6 클래스 (0) | 2017.12.08 |