Unity Chapter 5-6. C# 프로그래밍 [중급] (1/2) : 리스트

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 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사용시 꼭 적어주자.
  • 리스트 특징
    • 처음 시작은 사이즈 0 으로 시작한다.
      • 들어오는 것만큼 사이즈를 늘리고 원소를 추가한다.
    • 배열과 달리 여러 함수들을 제공한다. ex) Add, RemoveAt
    • 배열과 달리 원소의 개수를 플레이 도중 늘릴 수 있다.원소의 개수를 처음부터 정할 필요가 없다.
      • 5개가 들어오면 자동으로 리스트 크기가 +5 된다.
    • 원소를 RemoveAt으로 삭제하면 리스트 크기도 1 줄어들고 뒤에 원소들도 인덱스가 한칸 땡겨진다.
      • 5번째 원소가 삭제되어 6번째 원소가 새로 5번째 원소에 들어오는게 아니고 그냥 6번째 원소 메모리가 땡겨진 것.
        • 즉 방은 그대로인데 값이 사라지는게 아니고 값은 그대론데 그 값을 가리키는 방이 날아간 것.
        • 자료구조 연결리스트에서의 삭제 연산 개념과 같음
    • 배열은 아예 연속적인 하나의 메모리를 할당받아서 크기 변경이 불가능하지만 리스트는 각 원소마다 메모리를 연속적으로 붙어서 쓰는게 아니라서 가능한 일.
      • 방이 따로 따로 있는데 체인으로 연결해준 것 뿐이라고 생각하자
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); 원소를 계속 빼주면 원소들을 전부 삭제하고 빈 리스트로 만들 수 있음.
    • 삭제할수록 앞으로 계속 땡기니까


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기