Unity Chapter 5-6. C# 프로그래밍 [중급] (1/2) : 리스트
카테고리: Unity Lesson 1
태그: C Sharp Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 5. C# 프로그래밍 : 중급 (1/2)
🔔 리스트
배열
의 확장 개념.- 다만 배열과 달리 사이즈를 바꾼다던가 손쉽게 원소를 삭제 후 땡긴다던가 할 수 있는 장점이 있다.
배열의 한계
📜ScoreManager.cs
. 빈 게임 오브젝트 만들어서 아래 스크립트를 붙여준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public int[] scores = new int[10]; // 배열 ✨
private int index = 0;
void Start()
{
}
void Update()
{
if(Input.GetMouseButtonDown(0)) // 마우스 왼쪽 버튼 누르는 순간
{
scores[index] = Random.Range(0, 100); // 마우스 좌클 누를때마다 배열의 원소에 '차례대로' 0~100사이의 랜덤 정수가 들어감
index++;
}
}
}
- 💥 11번째로 마우스를 클릭하게 되는 순간 에러가 발생한다.
- 크기가 10인 배열의 크기를 넘어서서 넣을 자리가 없는데 넣을라고 해서 생긴 에러.
- 배열은 한번 선언된 크기를 실시간으로 바꿀 수가 없다
socres = new int [20];
하고 새로운 배열로 이사가는 것 외에는 답이 없다. (C# 에선가능)- 이마저도 기존 원소들은 다 없어져 버림. 빈 새집으로 이사가는거니까.
리스트란
리스트
는 배열과 달리 게임 플레이 도중에 원소의 개수를 늘려나갈 수 있다.
using System.Collections;
using System.Collections.Generic; // List를 제공하는 라이브러리. Generic과 관련된 것들은 C#에서 나중에 추가됐다.
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public List<int> scores = new List<int>(); // 리스트 ✨
void Update()
{
if(Input.GetMouseButtonDown(0)) // 마우스 왼쪽 버튼 누르는 순간
{
int randomNumber = Random.Range(0, 100);
scores.Add(randomNumber);
}
if(Input.GetMouseButtonDown(1)) // 마우스 오른쪽 버튼 누르는 순간
{
scores.RemoveAt(3); // 3번째 원소를 삭제한다.
}
}
}
- 리스트 사용하기
using System.Collections.Generic; public List<int> scores = new List<int>();
- Generic과 관련된 것들은
using System.Collections.Generic;
를 꼭 해주어야 한다. List사용시 꼭 적어주자.
- Generic과 관련된 것들은
- 리스트 특징
- 처음 시작은 사이즈 0 으로 시작한다.
- 들어오는 것만큼 사이즈를 늘리고 원소를 추가한다.
- 배열과 달리 여러 함수들을 제공한다. ex) Add, RemoveAt
- 배열과 달리 원소의 개수를 플레이 도중 늘릴 수 있다.원소의 개수를 처음부터 정할 필요가 없다.
- 5개가 들어오면 자동으로 리스트 크기가 +5 된다.
- 원소를
RemoveAt
으로 삭제하면 리스트 크기도 1 줄어들고 뒤에 원소들도 인덱스가 한칸 땡겨진다.- 5번째 원소가 삭제되어 6번째 원소가 새로 5번째 원소에 들어오는게 아니고 그냥 6번째 원소 메모리가 땡겨진 것.
- 즉 방은 그대로인데 값이 사라지는게 아니고 값은 그대론데 그 값을 가리키는 방이 날아간 것.
- 자료구조 연결리스트에서의 삭제 연산 개념과 같음
- 5번째 원소가 삭제되어 6번째 원소가 새로 5번째 원소에 들어오는게 아니고 그냥 6번째 원소 메모리가 땡겨진 것.
- 배열은 아예 연속적인 하나의 메모리를 할당받아서 크기 변경이 불가능하지만 리스트는 각 원소마다 메모리를 연속적으로 붙어서 쓰는게 아니라서 가능한 일.
- 방이 따로 따로 있는데 체인으로 연결해준 것 뿐이라고 생각하자
- 처음 시작은 사이즈 0 으로 시작한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public List<int> scores = new List<int>(); // 리스트 ✨
void Start()
{
int a = 45;
int b = 60;
int c = 75;
scores.Add(a);
scores.Add(b);
scores.Add(c); // 여기까지 [45], [60], [75]
scores.RemoveAt(1); // [45], [75] 가된다.
scores.Remove(45); // [75] 가 된다.
Debug.Log(scores[0]); // 75 출력
}
}
RemoveAt(i)
: 해당 인덱스를 가진 원소 삭제Remove(60)
: 리스트 원소들 중 60 값을 가진 원소 삭제. 원소 내용 중복이 있다면 인덱스 앞쪽 원소.
리스트를 사용하는 이유
리스트는 배열보단 무겁다. 그러나 게임 플레이 도중 그룹화할 오브젝트가 총 몇개일지 알 수 없을때 리스트를 사용하면 좋다.
리스트 원소 전체 삭제
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScoreManager : MonoBehaviour
{
public List<int> scores = new List<int>(); // 리스트 ✨
void Start()
{
while(scores.Count > 0)
{
scores.RemoveAt(0);
}
}
}
- 리스트는 길이를
Count
변수로 쓴다.scores.Count
는 scores 리스트의 원소 개수를 말함
- 리스트의 원소들이 0개가 될 때까지 그냥 맨앞
scores.RemoveAt(0);
원소를 계속 빼주면 원소들을 전부 삭제하고 빈 리스트로 만들 수 있음.- 삭제할수록 앞으로 계속 땡기니까
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기