C# 복습하기 9) 배열, 컬렉션, 인덱서

배열 초기화 방법

 - C#에서는 3가지 방법으로 배열을 초기화할 수 있다.

 - {} 블록은 컬렉션 초기자(Collection Initializer)라고 부른다.

string[] array1 = new string[3]{ "A", "B", "C" };
string[] array2 = new string[]{ "A", "B", "C" }; // 크기 생략가능
string[] array3 = { "A", "B", "C" }; // 형식도 생략가능

 

System.Array 클래스

분류 이름 설명
정적 메소드 Sort() 배열을 정렬
BinarySearch<T>() 이진탐색
IndexOf() 특정 데이터의 인덱스 반환
TrueForAll<T>() 모든 요소가 조건에 부합하는지 여부 반환
FindIndex<T>() 조건에 일치하는 첫 번째 요소의 인덱스 반환 
Resize<T>() 배열의 크기를 조정
Clear() 모든 요소를 초기화. 숫자면 0으로, 논리면 false로.
ForEach<T>() 모든 요소에 대해 동일한 작업을 수행
인스턴스 메소드 GetLength() 지정한 차원의 길이를 반환
프로퍼티 Length 배열의 길이를 반환
Rank 배열의 차원을 반환

 

2차원 배열

 - 축을 헷갈리기 쉬우니 주의

데이터형식[,] 변수명 = new 데이터형식[2차원길이, 1차원길이];

 - 2 x 3 크기의 int형식 2차원 배열은 다음과 같다.

   (길이가 3인 1차원 배열을 원소로 2개 갖고 있는 2차원 배열)

int[,] array = new int[2,3];
[0 , 0] [0 , 1] [0 , 2]
[1 , 0] [1 , 1] [1 , 2]

 

다차원 배열

 - 차원이 둘 이상인 배열.

int[,,] array = new int[4, 3, 2]
                {
                    { {1, 2}, {3, 4}, {5, 6} },
                    { {1, 4}, {2, 5}, {3, 6} },
                    { {6, 5}, {4, 3}, {2, 1} },
                    { {6, 3}, {5, 2}, {4, 1} },
                };

 

가변 배열(Jagged Array)

 - 배열을 요소로 가지는 배열.

데이터형식[][] 변수명 = new 데이터형식[가변 배열의 용량][ ];
int[][] jagged = new int[2][];
jagged[0] = new int[5] { 1, 2, 3, 4, 5 };
jagged[1] = new int[] { 15, 35 };
int[][] jagged = new int[2][]
{
    new int[5] { 1, 2, 3, 4, 5 },
    new int[] { 15, 35 }
};

 

다차원 배열(Rectangular Array) vs 가변 배열(Jagged Array)

 - 다차원 배열은 각 차원이 같은 길이를 가진다.

 - 가변 배열은 각 차원의 길이가 다를 수 있다.

 

컬렉션 (Collection)

 - 같은 성격을 띄는 데이터의 모음을 담는 자료구조

 - Array / ArrayList / List / SortedList / Queue / Stack / Hashtable

 

ArrayList

 - [] 연산자를 이용하여 컬렉션의 요소에 접근

 - 컬렉션 생성 시 용량을 미리 지정할 필요 없음.

 - Add(), RemoveAt(), Insert()

ArrayList list = new ArrayList();
list.Add(1);
list.Add("A"); // Add(object) 형식이라 박싱을 통해 다양한 객체를 담는다.

 - 초기화 시 직접 컬렉션 초기자를 이용하여 초기화 가능

ArrayList list = new ArrayList(){ 1, 2, 3 };

 

Queue

 - 먼저 들어온 것이 먼저 나감. FIFO

 - EnqQueue(), Dequeue()

 

Stack

 - 먼저 들어온 것이 나중에 나감. FILO

 - Push(), Pop()

 

Hashtable

 - 키(key)와 값(value)이 쌍으로 이루어진 데이터의 집합.

 - 탐색 속도가 빠른 편.

Hashtable ht = new Hashtable();
ht["book"] = "책";
ht["cook"] = "요리";

Console.WriteLine( ht["book"] );
Hashtable ht = new Hashtable()
{
    ["book"] = "책",
    ["cook"] = "요리"
};

Hashtable ht2 = new Hashtable()
{
    {"book", "책"},
    {"cook", "요리"}
};

 

컬렉션의 초기화

 - ArrayList, Queue, Stack 등의 컬렉션은 생성자를 호출할 때 매개변수로 배열을 넘기면 해당 배열을 사용하여 초기화된다.

 - ArrayList는 컬렉션 초기자로 바로 초기화할 수 있지만, Stack과 Queue는 Add를 구현하고 있지 않기 때문에 컬렉션 초기자로 초기화할 수 없다.

int[] arr = { 1, 2, 3 }

ArrayList list = new ArrayList(arr); // 1, 2, 3
Stack stack = new Stack(arr); // 3, 2, 1
Queue queue = new Queue(arr); // 1, 2, 3

 

인덱서

 - 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있게 해 준다.

 - 인덱서는 해당 접근자가 매개 변수를 사용한다는 점을 제외하면 프로퍼티와 유사하다.

 - 매개변수 형식은 숫자가 아니어도 된다.

class MyClass
{
    한정자 인덱서형식 this[형식 index]
    {
        get
        {
        
        }
        set
        {
        
        }
    }
}
class MyClass
{
    private int[] array;
    
    public MyClass()
    {
        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);
            }
            
            array[index] = value;
        }
    }
}

 

Foreach가 가능한 객체 만들기

 - foreach는 배열, 리스트와 같은 컬렉션에서만 사용 가능하다.

 - IEnumerable과 IEnumerator를 상속하면 된다.

 

IEnumerable 인터페이스

메소드 설명
IEnumerator GetEnumerator() IEnumerator 형식의 객체를 반환.
class MyEnumerator
{
    int[] numbers = {1, 2, 3 };
    public IEnumerator GetEnumerator()
    {
        yield return numbers[0];
        yield return numbers[1];
        yield return numbers[2];
		yield break; // 메소드를 종료시킴
    }
}

class Main
{
    static void Main(string[] args)
    {
        var obj = new MyEnumerator();
        foreach(int i in obj)
            Console.WriteLine(i);
    }
}

 

IEnumerator 인터페이스

메소드 또는 프로퍼티 설명
bool MoveNext() 다음 요소로 이동. 컬렉션의 끝을 지난 경우 false를 반환
void Reset() 컬렉션의 첫번째 위치의 1개 전으로 이동.
첫 번째가 0이면 -1로 이동함.
따라서 MoveNext()를 호출해야 첫 번째가 됨.
Object Current{ get; } 컬렉션의 현재 요소를 반환

 

 

 

 

 

 

댓글

Designed by JB FACTORY