2015년 3월 6일 금요일

뇌자극 C# 5.0 - 10강

-배열과 컬렉션, 그리고 인덱서-


10.1 All for one, one for all


같은 성격을 띤 다수의 데이터를 한번에 다뤄야 하는 경우 배열을 사용한다

데이터형식[] 배열이름 = new 데이터형식[용량]

예제)

int[] scores = new int[5];

scores[0] = 80;
scores[1] = 74;
scores[2] = 81;
scores[3] = 90;
scores[4] = 34;

foreach(int score in scores)
   Console.WriteLine(score);

10.2 배열을 초기화 하는 세 가지 방법


1) string[] array1 = new string[3]{ "배열의", "용량을", "명시하는 방법"};

2) string[] array2 = new string[]{ "배열의", "용량을", "생략하는 방법"};

3) string[] array3 = { "new키워드도", "생략하고", "초기화하는 방법"};

10.3 알아두면 삶이 윤택해지는 System.Array


Array 클래스의 주요 메소드와 프로퍼티

Sort() : 배열을 정열
BinarySearch<T>() : 이진 탐색을 수행합니다.
IndexOf() : 배열에서 찾고자하는 특정 데이터의 인덱스를 반환
TrueForAll<T>() : 배열의 모든 요소가 지정한 조건에 부합하는지 여부를 반환
FindIndex<T>() : 배열에서 지정한 조건에 부합하는 첫 번째 요소의 인덱스 반환
Resize<T>() : 배열의 크기를 재조정
Clear() : 배열의 모든 요소를 초기화
ForEach<T>() : 배열의 모든 요소에 대해 동일한 작업을 수행
GetLength() : 배열에서 지정한 차원의 길이를 반환
Length : 배열의 길이를 반환
Rank : 배열의 차원을 반환

10.4 2차원 배열


데이터형식[,] 배열이름 = new 데이터형식[2차원길이, 1차원길이];

예제)
int[, ]array = new int[2,3];
array[0,0] = 1;
array[0,1] = 2;
array[0,2] = 3;
array[1,0] = 4;
array[1,2] = 5;
array[1,3] = 6;

2차원 코드를 읽을 때는 []안에 있는 차원의 길이를 뒤에서 읽으면 이해하기 쉽다.
예를 들어 int[2,3]은

1,2,3
4,5,6

이다.

2차원 배열을 선언과 동시에 초기화 하는법

int[,] arr = new int[2,3]{ {1,2,3}, {4,5,6} };  //배열의 형식과 길이 명시
int[,] arr = new int[,]{ {1,2,3}, {4,5,6} };  //배열의 길이 생략
int[,] arr = { {1,2,3}, {4,5,6} };  //형식과 길이를 모두 생략

10.5 다차원 배열


차원이 둘 이상인 배열

예제)
int[, ,] array = new int[4,3,2]
                {
                    {{1,2},{3,4},{5,6}},
                    {{1,4},{3,4},{5,3}},
                    {{4,6},{5,5},{2,1}},
                    {{3,5},{3,6},{5,5}}
                }

10.6 가변 배열


직사각형이 아닌 필요한 부분만 데이터를 넣는 배열 형식

데이터형식[][] 배열이름 = new 데이터형식[가변 배열의 용량][];

예제)
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[]{100, 200};

[1][2][3][4][5]
[10][20][30]
[100][200]

10.7 컬렉션 맛보기


컬렉션 = 같은 성격을 띄는 데이터의 모음을 담은 자료구조
ArrayList, Queue, Stack, HashTable

10.7.1 ArrayList


배열과 비슷한 컬렉션이지만 용량을 지정할 필요 없이
자동으로 용량이 바뀌는 특성이 있다.
그리고 배열과 다르게 다양한 형식의 객체를 담을 수 있다.

예제)
ArrayList list = new ArrayList();
list.Add(10);  //인덱스 번호는 0부터 시작
list.Add(20);  //1
list.Add(30);  //2

list.RemoveAt(1);  //20을 삭제
list.Insert(25, 1);  //25를 1번 인덱스에 삽입 즉, 10과 20사이에 25를 삽입

10.7.2 Queue


Queue는 대기열이라는 뜻이다.
데이터나 작업을 차례대로 입력해뒀다가 입력된 순서대로 하나씩 꺼내 처리하기 위해 사용
데이터 입력시 = Enqueue() 메소드 사용
데이터 출력시 = Dequeue() 메소드 사용

예제)
//큐에 데이터 입력
Queue que = new Queue();
que.Enqueue(1);
que.Enqueue(2);
que.Enqueue(3);
que.Enqueue(4);

//큐에서 데이터 출력
while(que.Count > 0)
     Console.WriteLine(que.Dequeue());


10.7.3 Stack


스텍은 큐와 반대로 먼저 들어온 데이터가 나중에 나가고,
나중에 들어온 데이터가 먼저 나가는 구조의 컬렉션

데이터 입력시 = Push() 메소드 사용
데이터 출력시 = Pop() 메소드 사용

예제)

Stack stack = new Stack();
stack.Push(1);
stack.Push(2);
stack.Push(3);

int a = (int)stack.Pop();  // a = 3

10.7.4 Hashtable


Hashtable는 키(Key)와 값(Value)의 쌍으로 이루어진 데이터를 다룰 때 사용
탐색 속도가 빠르고, 사용하기도 편하다.

Hashtable ht = new Hashtable();
ht["book"] = "책";
ht["cook"] = "요리사";
ht["tweet"] = "지저귀다";

Console.WriteLine( ht["book"]);
Console.WriteLine( ht["cook"]);
Console.WriteLine( ht["tweet"]);

해쉬테이블 컬렉션은 키 데이터를 그대로 사용한다. 어떤 형식이든 키로 사용가능하다.
키를 이용해서 단번에 데이터가 저장되어 있는 컬렉션 내의 주소를 계산한다.
이 작업을 해싱이라고 한다.

10.8 인덱서


인덱서는 인덱스를 이용해서 객체 내의 데이터에 접근하게 해주는 프로퍼티
객체를 배열처럼 사용할 수 있게 해준다.

class 클래스이름
{
    한정자 인덱서형식 this[형식 index]
    {
       get
       {
          //index를 이용하여 내부 데이터 반환
       }
       set
       {
          //index를 이용하여 내부 데이터 저장
       }
    }
}

예제)
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);
              Cosole.WriteLine("Array Resized : {0}", array.Length);
          }
          array[index] = value;
       }
    }
}

프로퍼티는 객체 내의 데이터에 접근할 수 있도록 하는 통로다.
인덱서도 프로퍼티처럼 객체 내의 데이터에 접근할 수 있도록 하는 통로다.
프로퍼티와 다른 점은 인덱스를 이용한다는 것.

댓글 없음:

댓글 쓰기