2008. 5. 9. 22:20ㆍETC Programmings
문법도 익히고 C#도 손에 익힐수 있었던 시간.. 뭐 List 에 대한 자료구조는 이해하고 있었기 때문에 만드는데 그렇게 오래 걸리지는 않았다 ^^ 큭큭;;
using System;
using System.Collections.Generic;
using System.Text;
namespace List
{
class ArrayList<T> : ListInterface<T>
{
private T[] dataSet;
private int length;
private int initSize;
public ArrayList()
{
reset();
}
public ArrayList(int size)
{
this.initSize = size;
this.dataSet = new T[initSize];
this.length = 0;
}
public void add(T entry)
{
if (!isFull())
{
dataSet[length] = entry;
length++;
}
else{
expandArray();
add(entry);
}
}
private void expandArray()
{
this.initSize *= 2;
T[] tempDataset = dataSet;
dataSet = new T[initSize];
tempDataset.CopyTo(dataSet, 0);
}
public void add(T entry, int index)
{
if (!isFull())
{
T tempData = dataSet[index];
if (index < length)
{
replace(entry, index);
index++;
add(tempData, index);
}
else
add(entry);
}
}
public void remove(int index)
{
for (int i = index; i < length - 1; i++)
{
dataSet[i] = dataSet[i + 1];
}
length--;
}
public void replace(T newEntry, int index)
{
dataSet[index] = newEntry;
}
public T get(int index)
{
if (index <= length)
return dataSet[index];
else
throw new Exception("리스트의 길이를 초과합니다.");
}
public bool isContains(T entry)
{
bool isContained = false;
for (int i = 0; i < length; i++)
if (dataSet[i].Equals(entry))
isContained = true;
return isContained;
}
public void reset()
{
this.initSize = 100;
this.dataSet = new T[initSize];
this.length = 0;
}
public bool isFull()
{
return length == initSize;
}
public bool isEmpty()
{
return length == 0;
}
public int getLength()
{
return length;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < length ; i++)
sb.Append("["+ dataSet[i] + "] ");
return sb.ToString();
}
}
}
오버라이드를 하기 위해서 자바에서 어노테이션을 써줬던것 처럼 override라고 선언을 해줘야 한다는 점과 String 값 끼리는 연산이 되지 않는다는 점을 배웠다 'ㅅ';; 더불어 null 값은 안드로메다이다 ㅠㅠ
특히 값을 넣을때에 add 메소드에 주목할 필요가 있다.
public void add(T entry)
{
if (!isFull())
{
dataSet[length] = entry;
length++;
}
else{
expandArray();
add(entry);
}
}
private void expandArray()
{
this.initSize *= 2;
T[] tempDataset = dataSet;
dataSet = new T[initSize];
tempDataset.CopyTo(dataSet, 0);
}
보통 ArrayList는 배열의 크기가 정해져 있어 일정한 갯수가 초과하면 삽입을 더이상 할수 없지만 확장 ArrayList의 개념을 써서 배열의 메모리가 넘치면 알아서 더 큰 배열을 만들어서 사용하도록 했다. 뭐 ArrayList의 단점이 여실히 들어가기는 하나 나름 잘 돌아간다.