배열 컬렉션 인덱서

최태선·2022년 3월 8일
0

이것이 C#이다

목록 보기
4/10

1. 배열선언

int[] scores= new int[5];

2. System.Index를 이용하면 배열에 역순으로 쉽게 접근할 수 있다. (^ 연산자 이용)

System.index last = ^1; // ^1은 마지막 인덱스, ^2는 마지막에서 두번째 인덱스
Scores[last] = 34;

or

Scores[^1] = 34;

3. 배열은 System.Array 클래스이므로, Array 클래스가 기본 제공하는 함수를 이용할 수 있다.

sort() , BinarySearch<T>() Clear()등

4. System.Range를 활용하여 시작인덱스와 마지막 인덱스를 저장하고 이것으로 배열을 분할할 수 있다. ( ..연산자 이용)

System.Range r1 = 0..3; // ..은 연산자
int [] sliced = scores[r1];

or

int[] sliced = scores[0..3];

5. 2차원 배열 선언

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

6. 가변배열 선언 - 들쭉날쭉한 배열!

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};

컬렉션

7. ArrayList 컬렉션

ArrayList에서 중요한 메소드는 Add(), RemoveAt() , Insert()가 있다.

ArrayList list = new ArrayList();
list.Add(10);
list.Add(20);
list.Add(30);

list.RemoveAt(1); // 20 삭제
list.Insert(1,25); // 삭제된 1번자리에 25삽입
  • ArrayList는 Object 형식으로 매개변수를 받기 때문에 모든 객체를 받을 수 있다.
    public virtual int Add( Object value )

컬렉션

8.Queue - 대기열

입력한 데이터를 입력한 순서대로 꺼내 처리하기위해 사용.
데이터 입력 : 큐 객체.Enqueue(추가할 데이터);
데이터 출력 : 큐 객체.Dequeue();

Queue que = new Queue();
que.Enqueue(1);
que.Enqueue(2);
que.Enqueue(3);
while (que.Count>0)
{
	Console.WriteLine(que.Dequeue());
}
// 123 출력

9.Stack

먼저 들어간 데이터가 나중에 나가는 방식.
데이터 입력 : 스택 객체.Push(추가할 데이터);
데이터 출력 : 스택 객체.Pop();

Stack stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
while(stack.Count>0)
{
	Console.WriteLine(stack.Pop());
}
// 321출력

10. Hashtable

키와 값의 쌍으로 이루어진 데이터를 다룰 때 사용.
데이터 입력 : 해시터블객체["키"] = 추가할 데이터;
데이터 출력 : 해시터블객체["키"]

Hashtable ht = new Hashtable();
ht["book"] = "책";
ht["cook"] = "요리사";
Console.WriteLine(ht["book");
// 책 출력

11. 컬렉션 초기화 (ArrayList,Queue,Stack) - 배열로 가능

int[] arr = {123,456,789};
ArrayList list = new ArrayList(arr); 
Queue que = new Queue(arr);
Stack stack = new Stack(arr);

12. hashtable 초기화

Hashtable ht2 = new Hashtable()
{
	{"하나",1},
    {"둘",2},
    {"셋",3}
};

13. 인덱서

인덱서는 인덱스를 이용해서 객체 내의 데이터에 접근할 수 있게 해주는 프로퍼티.

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;
        }
    }
}

14. foreach가 가능한 객체

foreach는 IEnumerable을 상속하는 형식에만 사용할 수 있다.
IEnumerable 인터페이스가 갖고있는 메소드는 IEnumerator GetEnumerator() 메소드 하나 뿐이다.
IEnumerable 객체를 반환하기 위해서는 두가지 방법이 있다.
1) yield return을 활용하면 된다.
2) IEnumerator을 상속하는 클래스를 구현한다.

yiled return 활용

using System.Collections;

class MyEnumerator
{
	int[] numbers = {1,2,3,4};
    public IEnumerator GetEnumerator()
    {
    	yield return numbers[0];
        yield return numbers[1];
        yield return numbers[2];
        yield return break; // GetEnumerator() 종료시킴
        yield return numbers[3];
     }
 }
 class MainApp
 {
 	static void Main(string[] args)
    {
    	var obj = new MyEnumerator();
        foreach(int i in obj)
        {
        	console.WriteLine(i)
        }
     }
 }
 // 123 출력 , 4는 그 전에 break을 리턴했으므로 출력되지 않는다.

IEnumerator 상속 클래스 구현

using System.Collection;

class MyList : IEnumerable , IEnumerator
{
	private int[] array;
    int position = -1; // 컬렉션의 현재위치를 다루는 변수 , -1이 기본값
    
    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;
        }
    }
    
    // IEnumerator 멤버
    
    public object Current
    {
    	get
        {
        	return array[position];
        }
    }
    
    public bool MoveNext()
    {
    	if (position == array.Length -1)
        {
        	Reset();
            return false;
        }
        position ++;
        return(position < array.Length);
    }
    
    public void Reset()
    {
    	position = -1;
    }
    
    public IEnumerator GetEnumerator()
    {
    	return this;
    }
}

class MainApp
{
	static void Main(string[] args)
    {
    	MyList list = new Mylist();
        for (int i=0; i<5; i++)
        {
        	list[i] = i;
        }
        foreach (int e in list)
        {
        	Console.WriteLine(e);
        }
    }
}  
//Array Resized : 4 , Array Resized : 5 , 01234 출력
profile
최태선입니다

0개의 댓글