Unity 강의 정리 5-6장: C# 프로그래밍 [중급] (1/2) : List🎮

나무·2023년 8월 31일
1

Unity

목록 보기
15/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

리스트의 활용과 기능 📚


1. 배열의 한계와 제약사항 🚧

배열(Array)은 일련의 동일한 타입의 원소로 구성된 데이터 구조이다. 하지만 배열을 사용하면서 겪게 되는 몇 가지 한계와 제약 사항이 있다.

  • 고정된 크기: 배열은 선언 시점에 크기를 지정해야 하며, 이후에는 크기를 변경할 수 없다. 이로 인해 메모리 낭비가 발생할 수 있다. 예를 들어, 아래의 Unity C# 코드에서 scores 배열은 크기가 10으로 고정되어 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScoreManager : MonoBehaviour
{
    public int[] scores = new int[10]; 
    private int index = 0;

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            scores[index] = Random.Range(0, 100);
            index++;
        }
    }
}
  • 원소의 타입 제한: 배열은 동일한 타입의 원소만 저장할 수 있다. 다양한 타입을 저장하려면 object 배열을 사용해야 하며, 이는 타입 변환으로 인한 성능 저하를 가져올 수 있다.
object[] mixedArray = new object[] { 1, "string", true }; // 다양한 타입을 저장
  • 메모리 할당: 배열은 연속적인 메모리 공간에 할당되므로, 큰 크기의 배열을 생성할 때 메모리 부족 문제가 발생할 수 있다.

  • 인덱스 오버플로우: 위의 샘플 코드에서 index를 배열의 크기보다 큰 값으로 증가시키면 인덱스 오버플로우 문제가 발생한다. 이러한 문제는 런타임 에러를 유발하며, 디버깅이 어렵다.

이러한 한계와 제약 사항 때문에 배열은 정적인 데이터 구조로 사용되며, 동적인 요구사항에는 적합하지 않다.


2. 리스트의 정의와 특성 📘

리스트(List)는 동적 배열로, 배열의 한계를 극복한 데이터 구조이다. C#에서는 System.Collections.Generic 네임스페이스의 List<T> 클래스를 사용하여 리스트를 구현한다.

  • 동적 크기: 리스트는 동적으로 크기를 조절할 수 있다. 즉, 원소를 추가하거나 제거하는 동작이 자유롭다.

  • 타입 안정성: 제네릭 타입 T를 사용하여 리스트를 선언하면, 해당 타입의 원소만 추가할 수 있다. 이로 인해 타입 안정성이 높아진다.

  • 메서드 다양성: 리스트는 원소를 추가(Add), 검색(Find, IndexOf), 정렬(Sort), 제거(Remove, RemoveAt) 등 다양한 메서드를 제공한다.

아래는 Unity에서 C#으로 리스트를 사용하는 예시 코드이다.

using System.Collections;
using System.Collections.Generic;
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);
        }
    }
}
  • scores.Add(randomNumber): randomNumber를 리스트에 추가한다. 이 메서드를 통해 리스트의 크기는 동적으로 늘어난다.

이러한 특성 덕분에 리스트는 동적인 요구사항에 적합하다.


3. 리스트에서 원소 제거하기 ❌

리스트에서 원소를 제거하는 것은 게임 개발에서 자주 발생하는 시나리오 중 하나이다. 예를 들면, 아이템을 사용하거나 몬스터를 처치할 때 해당 아이템이나 몬스터를 게임에서 제거해야 할 수 있다. 리스트에서 원소를 제거하는 방법은 크게 두 가지가 있다.

  1. 인덱스를 이용한 제거: RemoveAt 메서드를 사용하여 특정 인덱스의 원소를 제거할 수 있다. 이 방법은 원소의 위치를 정확히 알고 있을 때 유용하다.

  2. 값을 이용한 제거: Remove 메서드를 사용하여 특정 값을 가진 첫 번째 원소를 제거할 수 있다. 이 방법은 원소의 위치를 모르지만, 값을 알고 있을 때 유용하다.

아래는 Unity에서 리스트의 원소를 제거하는 예제 코드이다.

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);
        }
    }
}
  • scores.Count: 리스트의 현재 원소 개수를 반환한다.
  • scores.RemoveAt(0): 리스트의 첫 번째 원소를 제거한다. 이 작업을 리스트의 원소가 없을 때까지 반복한다.

이 예제에서는 Start 메서드에서 리스트 scores의 모든 원소를 제거하는 작업을 수행한다. RemoveAt 메서드를 사용하여 인덱스 0의 원소를 계속 제거하고, scores.Count로 리스트가 비어있는지 확인한다. 리스트가 비어있지 않다면 계속해서 첫 번째 원소를 제거한다.

정리 🎓

  1. 배열의 한계와 제약사항: 배열은 고정된 크기와 유형을 가지며, 크기를 동적으로 변경할 수 없다는 제약이 있다.

  2. 리스트의 정의와 특성: 리스트는 동적 배열이며, 원소의 추가 및 삭제가 유연하다. 또한 제네릭을 이용해 다양한 유형을 저장할 수 있다.

  3. 리스트 사용의 장점: 리스트는 동적으로 크기가 변경되고, 다양한 메서드를 통해 데이터를 쉽게 관리할 수 있다.

  4. 리스트에서 원소 제거하기: RemoveRemoveAt 메서드를 사용하여 리스트의 원소를 특정 조건에 따라 제거할 수 있다.

profile
개인 공부를 정리함니다

0개의 댓글