[Unity/C#]Array List Dict

강동현·2024년 1월 29일
0

Unity/C#

목록 보기
19/26

0. Intro : 예시 사용 코드

public class Item
{
	public int code;
    public string cname;
    public Item(int code, string name)
    {
    	this.code = code;
        this.name = name;
    }
    public void Print()
    {
    	Debug.Log($"code : {code}, name : {name}");
    }
}

1. Array

  • 고정 길이 배열
public Item[] items = new Item[]
{
    new Item(1, "carrot"),
    new Item(2, "banana"),
    new Item(3, "apple"),
    new Item(4, "apple"),
};

1-1. Sort

  • 두 items code에 따라 오름차순 정렬
System.Array.Sort(items, (x, y) => x.code.CompareTo(y.code));

1-2. Foreach

System.Array.ForEach(items, item => item.Print());

1-3. Exists

  • 배열 중 하나라도 조건에 해당하는 원소가 있다면 true, 아니면 false
bool b1 = System.Array.Exists(items, x => x.code == 3);

1-4. TrueForAll

  • 모든 원소가 조건 달성 시 true, 아니면 false
bool b2 = System.Array.TrueForAll(items, x => x.code > 0);

1-5. Find 계열

//5-1. Find
Item item1 = System.Array.Find(items, x => x.name == "apple");
//5-2. FindIndex
int idx1 = System.Array.FindIndex(items, x => x.name == "apple");
//5-3. FindLast
Item item2 = System.Array.FindLast(items, x => x.name == "apple");
//5-4. FindLastIndex
int idx2 = System.Array.FindLastIndex(items, x => x.name == "apple");
//5-5. FindAll: 일치하는 모든 것을 배열로 반환
Item[] _items = System.Array.FindAll(items, x => x.name == "apple");

1-6. 얕은 복사

  • 불완전 복사 = 포인터가 연결되어 공유
  • 동일한 주소를 가리키므로, 같은 값 참조
//얕은 복사: 포인터만 준다.
Item[] _items1 = items;//동일한 주소를 가르킴

1-7. 깊은 복사

  • 완전 복사
  • 힙에 새로운 공간을 만들고 할당
//5-6. 깊은 복사
System.Array.ConvertAll(items, x => new Item(x.code, x.name));

1-8. Reverse

//5-7. Reverse
System.Array.Reverse(items);//배열 뒤집기

1-9. Resize

//5-8. Resize: Array는 고정길이 배열 => 배열의 크기를 바꾸기 위해 Resize 사용
System.Array.Resize(ref items, 5);//앞에것부터 잔류

2. List

  • 리스트(Bidirectional Linked List)
[SerializeField]
List<Item> items = new List<Item>()
{
    new Item(1, "A"),
    new Item(2, "B"),
    new Item(3, "C"),
    new Item(4, "D"),
};

2-1. List 순회

  • for / foreach를 통한 순회
for(int i = 0; i < items.Count; ++i)
{
    items[i].Print();
}
foreach(var i in items)
{
    i.Print();
}

2-2. Add

  • List의 맨 뒤에 원소 추가
Item item = new Item(5, "E");
items.Add(item);

2-3. Remove

  • Remove(T t)
    • 특정 원소 삭제
    • 삭제 성공 여부를 bool으로 반환
//리턴 값 존재: bool
bool b1 = items.Remove(item);//Remove 성공 시, true, 실패 시, false
  • RemoveAt(int idx)
    • idx 위치의 원소 삭제
    • void 반환
items.RemoveAt(0);//A 삭제
  • RemoveAll(Func)
    • 특정 조건을 만족 시, 해당 원소 삭제
    • 삭제한 원소 개수 리턴
//삭제한 아이템 수 리턴
int count = items.RemoveAll(x => x.code > 5);//코드가 5 이상인 모든 아이템 삭제

2-4. Insert

  • 특정 위치에 원소 삽입
//1 위치에 해당 아이템을 삽입
items.Insert(1, new Item(6, "F"));

2-5. Sort

//List 정렬
items.Sort((x, y) => x.code.CompareTo(y.code));

2-6. Reverse

//List 뒤집기
items.Reverse();

2-7. Exists

  • 조건을 만족하는 원소가 1개라도 존재 시, true, 아니면 false 리턴
bool b2 = items.Exists(x => x.name == "A");

2-8. TrueForAll

  • 리스트의 모든 원소가 조건 만족 시, true
//TrueForAll: List의 모든 원소가 조건을 만족 시, true
bool b3 = items.TrueForAll(x => x.code > 1);

2-9. Find 계열

Item fi = items.Find(x => x.name == "E");
fi.Print();
int idx = items.FindIndex(x => x.name == "A");
print(idx);
item = items.FindLast(x => x.name == "B");
print(idx);
idx = items.FindLastIndex(x => x.name == "C");
print(idx);
List<Item> _items = items.FindAll(x => x.code > 2);
_items.ForEach(x => x.Print());

2-9. List ↔ Array 변환

  • List -> Array
//리스트 -> 배열 변환
Item[] itemArray = items.ToArray();
  • List <- Array
//배열 -> 리스트 변환
List<Item> lst = new List<Item>(itemArray);

2-10. 얕은 복사

//얕은 복사: 포인터만 준다.
List<Item> _items1 = items;//동일한 주소를 가르킴
_items1[0].code = 10;//items[0].code = 10;

2-11. 깊은 복사

//깊은 복사: 완전 복사(새로운 공간(주소값) 할당 => 아예 새걸 만들어 복사 붙여넣기)
List<Item> _items2 = items.ConvertAll(x => new Item(x.code, x.name));
_items2[0].code = 10;//items2[0].code = 10; items[0] = 1;

3. Dictionary

  • 키와 값으로 구성된 자료구조
  • C++의 map과 동일
Item item = items["A"];//Key를 인덱스로 사용

3-1. Add

  • 특정 원소 추가
items.Add("F", new Item(6, "F"));

3-2. Remove

  • 특정 키를 가진 원소 삭제
items.Remove("F");

3-3. Key & Value

* 특정 아이템의 Key와 Value 접근 가능
foreach(var key in items)
{
    //Key & Value 변수
    print(key.Key);
    key.Value.Print();
}

3-4. ContainsKey & ContainsValue

  • 아이템이 특정 Key & Value를 가졌는지 확인
//키 존재 여부 확인
bool b1 = items.ContainsKey("A");
bool b2 = items.ContainsValue(item);

3-5. TryGetValue

  • 특정 Balue를 찾으면 아이템 반환
bool b3 = items.TryGetValue("A", out Item _item);
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글