"배열과 비슷하지만 좀 더 유연한 형태" 라고 정의할 수 있다.
그렇다면 리스트를 알기 전에 배열의 개념과 활용 방식을 먼저 알아보는 것이 순서가 맞을 것이다.
배열은 일종의 '방'과 같은 개념으로, 정보를 저장하거나 나열할 수 있는 형태를 말한다.
예시 코드
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번을 넘어가면 어떻게 될까?
이처럼 에러가 발생하면서 배열은 처음 정해진 인덱스의 크기를 넘어가지 못한다는 사실을 알 수 있다.
하지만 우리가 프로그래밍을 하다보면 처음 정한 크기 이상의 공간이 필요한 순간이 있다. 이 경우에는 어떡해야 할까?
이미 위의 예시에서 배열을 이용해서는 불가능하다는 것을 알았다.
배열은 인덱스의 크기를 넘어가면, 배열 자체를 없애고 새로 만들지 않는 이상 새로운 정보를 저장할 수 없다.
따라서 이러한 경우에는 List 를 사용한다.
"공간이 정해진 것이 아니라, 들어오거나 나가는 값의 수 만큼 생성되고 삭제된다" 는 리스트 개념이다.
먼저 생성의 경우를 살펴보자
예시 코드
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이었음에도 좌클릭을 할 때마다 리스트 공간과 그에 랜덤값이 할당된다.
=> 값이 입력되는 만큼 공간이 생성된다는 것이다.
코드 추가
//Update 문에 코드 추가
if(Input.GetMouseButtonDown(1))
{
scores.RemoveAt(0);
}
RemoveAt() 함수는 매개변수 번째의 공간을 지우는 함수다.
실행 결과
0번째 공간이 지워지고 1번째 요소가 0번째 요소로 당겨지는 밀어내기 방식으로 작동되는 모습을 볼 수 있다.
배열과 리스트는 어떤 차이이길래 이러한 결과가 가능한걸까?
2-3-1. 배열의 경우
위 사진처럼 배열의 경우, 특정 요소를 지우고 싶을 때는 새로운 값으로 대체해야 하고
공간 크기를 조절하려는 경우는 배열 자체를 없애지 않는 한 불가능하다
2-3-2. 리스트의 경우
리스트에서 2의 값이 들어있는 공간을 지우고자 할 경우, 해당 공간이 사라지고 그 뒤의 공간이 앞으로 한 칸씩 당겨진다.
3 값이 3번째에서 2번째로, 4 값이 4번째에서 3번째 공간으로 바뀌는 것이다.
+ 주의해야 할 점으로
값을 저장하고 있는 공간이 사라지는 것이지, 값 자체가 사라지는건 아니라는 것이다.
이전에 설명했던 클래스/오브젝트의 관계를 생각하면 이해하기가 쉬울 것이다.
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]);
}
해당 코드를 실행해보고 결과를 직접 확인해보자.
결과
선언한 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() : 매개변수 값을 찾아서 지운다.
실행 결과
결과 자체는 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]);
}
결과
새로 추가한 코드의 리스트 공간은 남아있다.
이 결과로 우리는 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 |