Post

[C#] Lec 05 - 자료구조

[C#] Lec 05 - 자료구조

배열

  • 같은 성격을 가진 다량의 데이터를 다룰 때 사용
  • 다수의데이터를 한번의 선언으로 사용가능
  • 데이터 형식 뒤에 대괄호를 붙여 선언
1
Datatype[] Array_name = new Datatype[Amount] {initial values};
  • 배열에 값을 넣는 경우 : array[i]=j; 형태로 넣을 수 있음.
  • 배열의 값에 접근하는 경우 : foreach (int item in array) {Console.WriteLine(item);}
  • 초기화를 하지 않는 경우 : 해당 datatype의 intitial 값이 지정됨.
  • 초기화를 하는 경우 : new int[]를 생략가능 (초기화를 통해 배열의 크기를 지정하였으므로)
1
2
3
4
5
int[] a = new int[2] {0, 1};
int[] b = new int[] {0, 1};
int[] c = {0, 1};
int[] d = new int[]; // 오류 발생
int[] e = new int[4];
  • 배열의 index는 0부터 시작, 배열 이름뒤 대괄호에 index를 넣어 접근할 수 있음.

배열에서 제공하는 methods

static method

  • Sort() : 배열 정렬
  • BinarySearch() : 이진 탐색 수행
  • IndexOf() : 찾고자 하는 특정 요소의 인덱스 반환
  • TrueForAll() : 모든 요소가 지정한 조건에 부합하는 여부 반환
  • FindIndex() : 지정한 조건에 부합하는 첫번째 요소의 인덱스 반환
  • Resize() : 배열의 크기 재조정
  • Clear() : 배열의 모든 요소를 초기화
  • ForEach() : 배열의 모든 요소에 대해 동일한 작업 수행

instance method

  • GetLength() : 배열의 지정한 차원의 길이를 반환.

Property

  • Length : 배열의 길이 반환
  • Rank : 배열의 차원 반환

  • <T> : 형식 매개변수(type parameter), 메소드를 호출할 때 T 대신 배열의 기반 자료형을 매개변수로 입력하여 컴파일러가 해당 형식에 맞추어 동작하도록 컴파일.

예제

1
2
int[] array = new int[] {1, 2, 3, 4, 5};
int index5 = Array.IndexOf(array,5);
  • array에서 5의 index는 4이므로 Array.IndexOf(array,5) = 4
  • 메서드 사용시 System.Array 사용하므로 Array 사용

2차원 배열

  • 2차원 배열 또한 1차원 배열과 마찬가지로 행, 열의 순서대로 지정하여 선언할 수 있음.
  • 2차원 길이, 1차원 길이 순서임.(행렬에서 (행, 열) 순서)
1
2
3
int[,] array = new int[2, 5];
int[,] array2 = new int[,]{ {12, 20, 30, 40, 50},{1, 2, 3, 4, 5} };
int[,] array3 = { {12, 20, 30, 40, 50}, {1, 2, 3, 4, 5} };
  • 2차원 배열 사용시 반드시 1, 2차원의 index를 같이 활용하여 접근하여야 함.

다차원 배열

1
2
3
4
5
6
7
8
9
int[,,] array = new int[4, 3, 2]
{
	{ {1, 2}, {3, 4}, {5, 6} },
	{ {1, 2}, {3, 4}, {5, 6} },
	{ {1, 2}, {3, 4}, {5, 6} },
	{ {1, 2}, {3, 4}, {5, 6} }
};
Console.WriteLine(array.GetLength(0)); //4 출력
Console.WriteLine(array.Length); //24 (4 * 3 * 2) 출력
  • 3차원 이상의 배열도 선언하여 사용가능하지만 데이터를 이해하기 매우 어려워 3차원 이상은 활용 비추천. 특히 디버깅이 어려움.

가변 배열(jagged array)

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

예제

1
2
3
4
5
6
7
8
9
int[][] array = new int[3][];
//각 배열 내 길이가 같을 수 있으므로 배열들의 갯수(행의 갯수)만 명시
array[0] = new int[5] {0,1,2,3,4};
array[1] = new int[] {0,1,2};
//array[2] = {0,1};이렇게 선언하면 안됨.
//array[3] = new int[] {0,1,2,3,4,5,6};  // 3 부터는 range 3(0, 1, 2)를 넘어가므로 오류 발생시킴
array[2] = new int[]{1, 2, 3};

Console.WriteLine(array[0][3]); //앞선 오류들을 수정하면 3이 나옴.
  • 일반적으로 다차원 배열보다 가변배열의 활용성이 더 높음
  • 그 길이가 모두 같을 필요가 없음.

컬렉션 (Collection)

  • 컬렉션은 다양한 기본 메소드를 이용하여 배열보다 편리하게 사용할 수 있는 자료형
  • System.Collections; 가 포함되어야 함.
  • Collection의 배열 길이는 가변.

Arraylist

  • 배열의 입력을 받아야하는 경우 등에서는 array의 길이를 지정하지 않고 array를 선언할 수 없음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections;

namespace ConsoleApp1
{

	class Program
	{
		static void Main(string[] args)
		{
			ArrayList al = new ArrayList();
			al.Add(1); //1
			al.Add(2); //1, 2
			al.Add(3); // 1, 2, 3
			al.Add(4); // 1, 2, 3, 4
			al.Remove(2); // 1, 3, 4
			al.RemoveAt(2); // 1, 3
			al.Insert(1, 24); // 1, 24, 3
			al[100]=0; // 100번째는 지정되지 않아 런타임 오류 발생
		}
	}
}
// Arraylist는 object이므로 원하는 형식을 집어넣을 수 있음.

Queue

  • 대기열 이라는 의미로, 데이터나 작업을 차례대로 입력해뒀다가 입력된 순서대로 하나씩 꺼내 처리하기 위해 사용됨.
  • Queue 입력은 오직 뒤에서 이루어지며 출력은 앞에서 이루어짐 (FIFO)
1
2
3
4
Queue queueCollection = new Queue();
queueCollection.Enqueue(10);
queueCollection.Enqueue(20);
int a = queueCollection.Dequeue(); // a = 10;

Stack

  • Stack은 Queue와 반대로 먼저 들어온 데이터가 나중에 나가고 나중에 들어온 데이터가 먼저 나감(heap의 자료구조) (FILO, LIFO)
1
2
3
4
Stack stackCollection = new Stack();
stackCollection.Push(10);
stackCollection.Push(20);
int a = stack Collection.Pop(); // a = 10;

Hashtable

  • 키(Key)와 값(Value)의 쌍으로 이루어진 데이터를 다룰 때 사용함, 사전처럼 정의가 가능한 데이터 형식에 많이 사용.
  • 탐색 속도가 빠르며 편리.
1
2
3
4
5
Hashtable ht = new Hashtable();
ht["no1"] = 10;
ht["no2"] = "asdf";
ht["no3"] = 1.1;
int a = (int)ht["no1"];
This post is licensed under CC BY 4.0 by the author.