본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 35. 컬렉션

지금까지 여러변수를 다루기 위하여 배열을 이용하였다.

2018/10/03 - [교육 노트/C# 강의] - [C# 때려잡기] C# 강의 8. 배열 foreach

그러나 배열만으로 사용하기에는

귀찮은 점이 조금많다.

일단 사이즈가 처음 지정되면 변경이 불가능하고

FIX 된 데이터가 아니면 배열은 사용하기 귀찮다.


물론 C#의배열은 상당히 강력한 기능을 제공해주기는 한다만..



아무튼


이러한 데이터들의 모음들을 관리하기위하여

사용하는 것이 자료구조이고 C#에서는 컬렉션이라는 이름으로 각종 클래스를 만들어 두었다.


using System.Collections;


를 추가해주어야 사용할수있다.


1. ArrayList

배열처럼 사용가능하지만 크기가 동적이다.

class Program
{

static void Main(string[] args)
{
ArrayList a = new ArrayList();

a.Add(1); //Add: 맨끝에 추가
a.Add("2");
a.Add(3.1);
a.Insert(2, "IDX2"); //Insert: 지정한 인덱스에 추가

foreach (var item in a)
{
Console.WriteLine(item);
}

a.RemoveAt(2); //RemoveAt: 지정한 인덱스에 있는 값 삭제
a.Remove("2"); //Remove: 해당 값을 삭제
foreach (var item in a)
{
Console.WriteLine(item);
}
}
}

2. Stack Queue

자료구조 자체에 대한 설명은 https://see-ro-e.tistory.com/32 참고

static void Main(string[] args)
{
Stack s = new Stack();
Queue q = new Queue();
}


3.해쉬 테이블

해쉬테이블은 키-벨류 쌍을 하나의 요소로 가진다.

예를 들어 학생의경우

이름,학번,성적 ... 등등 에 맞는 값을 가지고 있다

이름:철수

학번:2018333333

성적:3.0

이런 key-value의 연관관계를 표현하기위한 자료형이 해쉬테이블 이다

왜 해쉬테이블이냐하면 해쉬함수가 어쩌고 설명이 길어지므로 생략


암튼


class Program
{

static void Main(string[] args)
{
Hashtable StuTable = new Hashtable();

StuTable.Add(2018152225, "김철수");
StuTable.Add(2018152846, "이짱구");
StuTable.Add("교수님", "정교수");

Console.WriteLine("{0}교수님",StuTable["교수님"]);

Console.WriteLine("2018152225 학번의 학생 {0}",StuTable[2018152225]);


}
}


뭐 요런식



4. Object 클래스


위의 예시를 잘보면 하나의 컬랙션에 다른 자료형의 데이터들이 들어갈수있는것을 확인할수있다.

a.Add(1); //Add: 맨끝에 추가
a.Add("2");
a.Add(3.1);


StuTable.Add(2018152846, "이짱구");
StuTable.Add("교수님", "정교수");
처럼

만약 배열의 경우 int배열이면 int만 student 배열이면 student 만들어갈수있었는데
어떻게 이렇게 모든 자료형이 들어갈수있을까?


그것은 C#에서 자료형은 모두 Object (object) 클래스의자식이기때문이다.

따라서 C#의모든 자료형은
Object자료형으로형변환 될수있다.


class Program
{
class MyClass
{

}
static void Main(string[] args)
{
object i = 10;
object s = "S";
object m = new MyClass();
Console.WriteLine(i);
Console.WriteLine(s);
Console.WriteLine(m);

}
}


심지어 우리가만든 클래스조차도 자동적으로 object가 최상위 부모클래스가 된다.


따라서 ArrayList a의

a.Add(1); //Add: 맨끝에 추가
a.Add("2");
a.Add(3.1);

과 같은 내용은

실제로


뭐 이런식으로 이루어져있는것이다.

따라서 사용할때마다 명시적으로든 묵시적으로든 형변환이 이루어지고

당연히 소요시간이 걸리게된다. 이는 런타임에서 발생하는 시간이고

역시 당연히 데이터가 많아지면 타임은 훨씬 길어지게된다.


그래서 이렇게 여러가지 각기 다른 자료형 (이질적인) 데이터를 넣는 컬렉션의 성능은 떨어질수밖에 없다.

따라서 이질적은 데이터를 넣을 필요가 없다면  성능을위해 (혹은 관리의 편의성을 위해)

앞서 배운 "제네릭" 을 이용하여 만들어진 컬렉션

즉 제네릭 컬렉션을 이용하여 성능을 향상시킬수있다. (제네릭이 이럴때 쓰인다!)



728x90