class Enemy
{
public string Name { get; set; }
}
class Ally
{
public string Name { get; set; }
}
//기존 배열이 몇개의 사이즈였던, 새로운 객체를 주기만 하면 현재의 배열 맨 뒤에 알아서 추가하는 기능
class Troop<T>
{
T[] army;
int count; //실제 null이 아닌 T 의 보유 갯수 기억용
public int Capacity // 배열의 길이를 반환시켜주는 프로퍼티
{
get { return army.Length; }
}
public int Count
{
get { return count; }
private set { count = value; }
}
public T this[int index]
{
get {
return army[index];
}
set {
army[index] = value;
}
}
public Troop(int troopSize) //생성자, 숫자 주면 그만큼을 담을 수 있는 배열 활성화
{
army = new T[troopSize]; // 그저 배열 공간을 빌리기 위한 new라, 굳이 T 에 new() 같은 제약을 걸 필요 없음
}
public Troop() // 배열이 Add를 통해 자동으로 늘어나니, 배열 초기값을 굳이 줄 필요가 없어서 기본 생성자 생성
{
army = new T[10];
count = 0;
}
public void RemoveAt(int index)
{
for(int i = index; i < count -1; i++)
{
army[i] = army[i + 1];
}
count--;
}
public void Add(T unit)
{
// 지금 보유중인 배열의 길이 vs count 비교해서, 만약 배열이 부족하면 더 늘린다
// 배열의 길이가 넉넉한지 체크, 넉넉하면 유닛 추가
// 아니면 배열을 늘려야함
// 직접 더 큰 크기의 임시 배열을 생성, 요소들을 하나씩 복사해준 다음
// 기존 배열을 다른 배열로 옮기는 작업이 있어야함
if (army.Length <= count) // 실제 값보다 배열이 작으면 아래 내용 실행
{
//Array.Resize(ref 원본배열, 새로운크기);
Array.Resize(ref army, army.Length * 2);
}
army[count] = unit;
count++;
}
//public T GetEnemy(int index)
//{
// return army[index];
//}
//public void AddEnemy(T changedEnemy, int index)
//{
// army[index] = changedEnemy;
//}
}
internal class Program
{
static void Main(string[] args)
{
Troop<Ally> myTeam = new Troop<Ally>(10);
// 텅 빈 Ally 10개를 담을수 있는 배열이 들은 Troop 객체 생성
myTeam.Add(new Ally());
}
}
}
Debugging Life