배열과 리스트를 왜 사용할까?
// 1.
public class ScoreTest1 : MonoBehaviour
{
// 학생 점수를 각각 변수로 만든다면...
int score = 85;
Debug.Log(score)
}
// 2.
public class ScoreTest2 : MonoBehaviour
{
int score1 = 85;
int score2 = 85;
int score3 = 85;
int score4 = 85;
int score5 = 85;
// .... score가 100개가 넘어간다고 생각해보자...
Debug.Log(score1);
Debug.Log(score2);
Debug.Log(score3);
Debug.Log(score4);
Debug.Log(score5);
// ... score100 까지 전부 써야 한다!
}
// 3.
public class ScoreTest3 : MonoBehaviour
{
int[] scores1 = new int[100];
List<int> scores2 = new List<int>();
}
1번과 같이 한개의 점수만 출력하고 싶다면 위와 같이 입력할 수 있을 것이다.
근데 만약, 2번과 같이 10개 혹은 100개가 넘어간다고 했을 때 따로따로 관리하는 것은 굉장히 비효율 적일 것이다.
그렇기 때문에 3번과 같이 배열 혹은 리스트로 관리를 한다.
배열(Array) 선언
접근지정자 타입[] 변수명 = new 타입[크기];
int[] numbers = new int[5];
string[] names = new string[] {"철수", "영희", "민수"};
GameObject[] prefabs = new GameObject[10];
배열의 장단점
장점
크기가 고정되어 있어 메모리 낭비가 적다.
인덱스로 접근하는 속도가 매우 빠르다
Inspector창에서 크기 조절과 값 수정이 쉽다.
다차원 배열을 지원한다
단점
크기가 고정되어 있기에 변경이 불가하다
중간에 요소를 삽입/삭제가 어렵다
크기를 변경하려면 새 배열을 만들어야 한다
리스트(List) 선언
접근지정자 List<타입> 변수명 = new List<타입>();
List<int> numbers = new List<int>();
List<string> names = new List<string>() {"철수", "영희", "민수"};
List<GameObject> enemies = new List<GameObject>();
리스트의 장단점
장점
크기를 동적으로 조절 가능
요소 추가/삭제가 쉬움
다양한 메서드 제공 (Add, Remove, Contains, Sort 등)
데이터 관리가 유연함
단점
배열보다 메모리를 더 사용
요소 접근 속도가 배열보다 약간 느림
용량이 자주 변경되면 성능에 영향을 줄 수 있음
리스트와 배열의 사용 예시
public class FruitCollector : MonoBehaviour
{
// 고정된 과일 종류는 배열로 관리
public string[] fruitTypes = { "사과", "바나나", "오렌지" };
// 수집한 과일은 리스트로 관리
public List<string> collectedFruits = new List<string>();
// 과일 수집하기
public void CollectFruit(int fruitIndex)
{
if (fruitIndex >= 0 && fruitIndex < fruitTypes.Length)
{
string fruit = fruitTypes[fruitIndex];
collectedFruits.Add(fruit);
// 수집한 과일 출력
Debug.Log($"과일 수집: {fruit}");
ShowCollectedFruits();
}
}
// 수집한 과일 모두 보여주기
void ShowCollectedFruits()
{
string message = "현재 수집한 과일 목록: ";
foreach (string fruit in collectedFruits)
{
message += fruit + ", ";
}
Debug.Log(message);
Debug.Log($"총 {collectedFruits.Count}개의 과일을 수집했습니다.");
}
private void Start()
{
FruitCollector collector = GetComponent<FruitCollector>();
// 과일 수집 테스트
collector.CollectFruit(0); // 사과 수집
collector.CollectFruit(1); // 바나나 수집
collector.CollectFruit(0); // 사과 다시 수집
}
}
배열(fruitTypes)은 고정된 과일 종류를 저장하였다
리스트(collectedFruits)는 플레이어가 수집한 과일을 동적으로 저장하였다
결과
과일 수집: 사과
현재 수집한 과일 목록: 사과,
총 1개의 과일을 수집했습니다.
과일 수집: 바나나
현재 수집한 과일 목록: 사과, 바나나,
총 2개의 과일을 수집했습니다.
과일 수집: 사과
현재 수집한 과일 목록: 사과, 바나나, 사과,
총 3개의 과일을 수집했습니다.
4. 예시를 바탕으로 만든 예제
플레이어가 과일에 부딪히면 위와 같이 출력 시켜보자
1. 하이어라키창과 태그
2. Collider와 RigidBody 컴퍼넌트를 붙여주자
3. 스크립트를 만들고 플레이어 객체에 붙여주자
public class Move : MonoBehaviour
{
float speed = 5f;
string[] fruitTypes = { "사과", "바나나", "오렌지" };
List<string> collectedFruits = new List<string>();
// 과일 수집하기
public void CollectFruit(int fruitIndex)
{
if (fruitIndex >= 0 && fruitIndex < fruitTypes.Length)
{
string fruit = fruitTypes[fruitIndex];
collectedFruits.Add(fruit);
// 수집한 과일 출력
Debug.Log($"과일 수집: {fruit}");
ShowCollectedFruits();
}
}
void ShowCollectedFruits()
{
string message = "현재 수집한 과일 목록: ";
foreach (string fruit in collectedFruits)
{
message += fruit + ", ";
}
Debug.Log(message);
Debug.Log($"총 {collectedFruits.Count}개의 과일을 수집했습니다.");
}
void Start()
{
Debug.Log($"총 {collectedFruits.Count}개의 과일을 수집했습니다.");
}
void Update()
{
float _horizontal = Input.GetAxis("Horizontal");
float _vertical = Input.GetAxis("Vertical");
transform.Translate(_horizontal * speed * Time.deltaTime, 0, _vertical * speed * Time.deltaTime);
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.CompareTag("Apple"))
{
CollectFruit(0);
}
if (collision.collider.CompareTag("Banana"))
{
CollectFruit(1);
}
if (collision.collider.CompareTag("Orange"))
{
CollectFruit(2);
}
}
}
4. 결과
'유니티 > 문법' 카테고리의 다른 글
[Unity] 유니티 C#) 생성자 (0) | 2024.11.26 |
---|---|
[Unity] 유니티 C#) ref 와 out 키워드 (0) | 2024.11.25 |
[Unity] 유니티 C# 인터페이스 ( Interface) (3) | 2024.11.13 |
[Unity] 유니티 C#) 자료구조 스택(Stack), 큐(Queue) (5) | 2024.11.02 |
[Unity] 유니티 C#) 자료구조 딕셔너리(Dictionary) (0) | 2024.10.28 |