상세 컨텐츠

본문 제목

#8. 리스트(List)

유니티 학습/세미나 자료

by 남민우_ 2024. 7. 30. 00:56

본문

1. 리스트란?

"배열과 비슷하지만 좀 더 유연한 형태" 라고 정의할 수 있다.

그렇다면 리스트를 알기 전에 배열의 개념과 활용 방식을 먼저 알아보는 것이 순서가 맞을 것이다.

 

 1-1.  배열의 형태

배열은 일종의 '방'과 같은 개념으로, 정보를 저장하거나 나열할 수 있는 형태를 말한다.

 

예시 코드

public int[] scores = new int[10];
    int index = 0;

    // Update is called once per frame
    void Update() 
    {
				// 0번은 마우스 좌클릭 / 1번은 마우스 우클릭
        if(Input.GetMouseButtonDown(0))
        {
            scores[index] = Random.Range(0,100);
            index++;
        }
    }

 

실행 결과

총 10개의 배열이 만들어지고, 좌클릭을 할 때마다 0부터 100 사이의 랜덤한 숫자가 할당되는 모습이다.

 

이 때, 좌클릭의 횟수가 10번을 넘어가면 어떻게 될까?

Index가 배열의 경계(총 10개)를 넘어갔다는 에러 문구

이처럼 에러가 발생하면서 배열은 처음 정해진 인덱스의 크기를 넘어가지 못한다는 사실을 알 수 있다.

 

하지만 우리가 프로그래밍을 하다보면 처음 정한 크기 이상의 공간이 필요한 순간이 있다. 이 경우에는 어떡해야 할까?

이미 위의 예시에서 배열을 이용해서는 불가능하다는 것을 알았다.

배열은 인덱스의 크기를 넘어가면, 배열 자체를 없애고 새로 만들지 않는 이상 새로운 정보를 저장할 수 없다.

따라서 이러한 경우에는 List 를 사용한다.

 

2. 리스트의 형태

"공간이 정해진 것이 아니라, 들어오거나 나가는 값의 수 만큼 생성되고 삭제된다" 는 리스트 개념이다.

먼저 생성의 경우를 살펴보자

 

 2-1. 공간의 생성

예시 코드

public List<int> scores = new List<int>();

	private void Update()
	{
		if(Input.GetMouseButtonDown(0))
		{
			int randomNum = Random.Range(0, 100);
			scores.Add(randomNum);
		}
	}

 + 주의할 점으로 List 키워드를 사용하려면

using System.Collections.Generic

의 네임스페이스가 필요하다.

 

코드 결과

값이 할당되는 수 만큼 리스트 공간이 생성된다

초기 리스트의 수가 0이었음에도 좌클릭을 할 때마다 리스트 공간과 그에 랜덤값이 할당된다.

=> 값이 입력되는 만큼 공간이 생성된다는 것이다.

 

 2-2. 공간의 삭제

코드 추가

//Update 문에 코드 추가
if(Input.GetMouseButtonDown(1))
{
	scores.RemoveAt(0);
}

RemoveAt() 함수는 매개변수 번째의 공간을 지우는 함수다.

 

실행 결과

0번째 공간이 지워지고 1번째 요소가 0번째 요소로 당겨지는 밀어내기 방식으로 작동되는 모습을 볼 수 있다.

 

배열과 리스트는 어떤 차이이길래 이러한 결과가 가능한걸까?

 

 2-3. 배열과 리스트의 차이

  2-3-1. 배열의 경우

 

위 사진처럼 배열의 경우, 특정 요소를 지우고 싶을 때는 새로운 값으로 대체해야 하고

공간 크기를 조절하려는 경우는 배열 자체를 없애지 않는 한 불가능하다

 

  2-3-2. 리스트의 경우

위의 경우가 Before, 아래의 경우가 공간 삭제의 After가 된다

리스트에서 2의 값이 들어있는 공간을 지우고자 할 경우, 해당 공간이 사라지고 그 뒤의 공간이 앞으로 한 칸씩 당겨진다.

 3 값이 3번째에서 2번째로, 4 값이 4번째에서 3번째 공간으로 바뀌는 것이다.

 

 + 주의해야 할 점으로

값을 저장하고 있는 공간이 사라지는 것이지,  값 자체가 사라지는건 아니라는 것이다.

이전에 설명했던 클래스/오브젝트의 관계를 생각하면 이해하기가 쉬울 것이다.

 

2-4. 리스트 실습

  2-4-1. 리스트 값 직접 할당

코드

public List<int> scores = new List<int>();

	int scores0 = 10;
	int scores1 = 20;
	int scores2 = 30;

	private void Start()
	{
		scores.Add(scores0);
		scores.Add(scores1);
		scores.Add(scores2);

		Debug.Log(scores[1]);
	}

해당 코드를 실행해보고 결과를 직접 확인해보자.

 

결과

코드 상에서 입력한 10, 20, 30 값이 그대로 적용된 모습

선언한 List 자체가 public 이라 코드 외부인 에디터에서도 수정할 수 있지만, 실행 후 바로 확인해도 입력한 값이 그대로 할당된 것을 볼 수 있다.

 

 

  2-4-2. 리스트 공간 삭제

 코드

private void Start()
	{
		scores.Add(scores0);
		scores.Add(scores1);
		scores.Add(scores2);

		scores.RemoveAt(1);

		Debug.Log(scores[1]);
	}

 

실행 결과

1번째 공간이었던 20이 사라지고 2번째 공간이었던 30의 값이 1번째 공간으로 당겨진다.

 

 

  2-4-3. 삭제 part2 - 공간과 값의 구분

코드

// 2-4-2 에서 진행했던 코드를 주석처리하고 새로 추가한다
private void Start()
	{
		scores.Add(scores0);
		scores.Add(scores1);
		scores.Add(scores2);

		//scores.RemoveAt(1);
		scores.Remove(20);

		Debug.Log(scores[1]);
	}

 - RemoveAt() : 매개변수 번째의 공간을 찾아서 지운다.

 - Remove() : 매개변수 값을 찾아서 지운다.

 

실행 결과

매개변수로 들어갔던 20이 할당된 공간이 사라진 모습

결과 자체는 2-4-2와 동일하지만 공간을 삭제하는 방식에서 인덱스를 찾아서 지울건지, 값을 찾아서 지울건지에 대해

차이가 있다.

 

그런데 만약 동일한 여러개라면 어떻게 될까?

 

코드 수정

private void Start()
	{
		scores.Add(scores0);
		scores.Add(scores1);
		scores.Add(scores2);
		scores.Add(scores1); // 20값을 가진 scores1 변수를 리스트에 할당하는 코드 추가

		//scores.RemoveAt(1);
		scores.Remove(20);

		Debug.Log(scores[1]);
	}

 

결과

20을 가진 첫번째, 리스트의 2번째 공간만 지워졌다

새로 추가한 코드의 리스트 공간은 남아있다.

이 결과로 우리는 Remove() 함수는 가장 먼저 검색된, 리스트의 가장 앞쪽의 공간만이 지워진다는 것을 알 수 있다.

 

 

한 줄 정리

List 는 더하는 만큼 늘어나고, 빼는 만큼 줄어드는 유동적인 공간의 나열이다.

'유니티 학습 > 세미나 자료' 카테고리의 다른 글

#10. 코루틴(Coroutine)  (0) 2024.07.31
#9. 싱글톤(Singleton)  (0) 2024.07.31
#7. 정적 변수/함수(Static)  (0) 2024.07.29
#6. 오버로드(Overload)  (0) 2024.07.28
#5. 인스턴스(Instance)  (0) 2024.07.24

관련글 더보기