배열의 선언


데이터형식[] 배열이름 = 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

+ Recent posts