본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티와 C# 개념 정리_Concept Summary

유니티와 C# 개념 정리_013_컬렉션즈_Collections

collection(컬렉션)의 뜻은 '물건의 더미 또는 사람의 무리'이다.

그러므로 C#에서 Collection(컬렉션)은 데이터를 그룹으로 관리하는 것을 나타낸다.

 

코드를 작성할 때 데이터 또는 개체를 하나로 묶어서 그룹으로 관리해야 하는 경우가 있다.

예를 들어 서로 관련있는 숫자(점수, 등수 등)나 문자열(과목, 플레이어 등)이 여러 개일 경우에는 하나의 변수에 함께 저장해서 관리하면 편리할 것이다.

 

이렇게 묶어서 관리할 수 있는 방법에는 2가지가 있다.

1. Array (어뢰이; 배열)

2. Collections (컬렉션즈)

 

Arrays는 가장 기본적인 컬렉션 구조이다.

Collections는 배열(Array)의 단점을 보완하고 기능을 추가해서 만들어진 구조이다.

Collections에는 Array(배열)의 기능을 보완한 ArrayList 를 비롯해서 Queue, Stack, Hashtable 등이 있다.

 

이후에 좀 더 기능이 강화되어

ArrayList를 대체할 수 있는 List(리스트; 목록) ,

Hashtable 을 대체할 수 있는 Dictionary(딕셔너리; 사전)가 생겼다.

많이 사용하는 컬렉션

컬렉션 중에서 많이 사용하는 3가지는 다음과 같다.

  • Array
  • List
  • Dictionary

컬렉션은 데이터를 처리할 때 모든 타입을 저장할 수 있는 object 타입을 사용한다.

object타입은 처리 속도가 상대적으로 느리다.

그래서 최근에는 컬렉션에 제네릭(generic ; 포괄하는) 기능을 추가하여 사용하는 것을 추천한다.

제네릭은 <T> 기호를 사용하며, T에 지정하는 타입으로 개체의 타입을 바꾸어 주는 기능이다.

제네릭은 컬렉션에 속도와 안정성을 높여 준다.

Array(배열)

배열의 특징

  • 같은 타입만 저장할 수 있다.
  • 요소(element)가 index(인덱스)로 매겨지며 순서대로 정렬된다.
  • 선언할 때 배열의 길이(Length)를 정해야 한다.

참고로 배열은 System.Collections가 아니라 System.Array클래스에 정의되어 있기 때문에 컬렉션에 속하지는 않지만 IList 인터페이스를 상속하기 때문에 컬렉션으로 취급할 수 있다.

배열 선언하기

 

배열은 변수를 여러 개 붙여놓은 것과 비슷하다.

예를 들어 int(정수) 타입의 배열을 선언하려면 다음과 같이 작성한다.

 

int[ ] scores = new int[3];

 

int타입으로 scores라는 배열 변수명으로 선언하고,

새로운 int타입의 배열 3개를 만들어서 변수에 저장하라는 코드이다.

 

만약 string(문자열) 타입의 배열을 선언하려면 다음과 같이 적는다.

 

string[ ] array = new string[3];

 

위와 같이 배열을 만들면 보이지는 않지만 첫번째 배열 부터 숫자 0, 1, 2 가 순서대로 매겨진다.

이것을 index(인덱스; 색인)라고 한다.

9번줄: array라는 문자열 배열을 선언하고, 요소 3개를 넣을 수 있는 배열을 생성하여 array변수에 저장한다.

11~13번줄: 첫번째 배열부터 세번째 배열까지 각각 문자열을 저장한다.

9번줄에서 13번줄까지의 코드는 15번줄 주석처럼 간단하게 작성할 수도 있다.

17~20번줄: for반복문을 이용해서 array배열 변수에 들어있는 요소를 출력하면 아래와 같은 결과를 확인할 수 있다.

 

 

11번줄: 배열을 for반복문으로 확인할 때 반복할 조건으로 사용할 요소의 개수를 Length(길이) 속성을 사용해서 구한다.(위 코드에서 array.Length는 3이다.)

13~16번줄: 배열의 요소 중에서 20보다 크거나 같은 요소만 출력하는 조건을 만들면 아래와 같은 결과가 나온다.

 

배열과 관련된 속성,메서드들은 System.Array클래스에 정의되어 있다.

몇 개를 확인 해 보면 다음과 같다.

 

11번줄: array 배열의 0번째 요소를 출력한다.

13번줄: System.Array 클래스에 있는 IndexOf( )메서드는 요소의 인덱스 번호를 반환한다.

이 메서드는 static 메서드이다.

System.Array.IndexOf ( ) 처럼 사용해도 되지만 using 키워드를 사용하려면 위와 같이 static System.Array; 로 적는다.

15번줄: 배열의 인덱스[1] 에 문자열 list를 저장하면 기존 문자열을 대체한다.

17번줄: Resize( ) 메서드는 배열의 길이를 조정한다. 첫째 매개변수는 ref 키워드를 사용해서 참조할 배열 인스턴스를 지정하고 두번째 매개변수에 새로운 길이를 입력한다. 추가된 길이에는 null 값이 들어간다.

24번줄: array를 List로 변환할 수 있다.

 

 

List (리스트; 목록)

List의 특징

  • array와 ArrayList의 장단점을 합하고 보완해서 만들어졌다.
  • 길이가 고정되어 있지 않다.(추가, 삭제, 수정이 가능하다)
  • 같은 타입만 저장할 수 있다.
  • 인덱스를 사용해서 요소에 접근한다.

List 선언

List list = new List();

 

제네릭 리스트를 사용하여 선언하면 다음과 같다.

List<T> list = new List<T>();

 

8번줄:

제네릭 리스트 타입의 heroes(히어로즈) 변수를 선언한다.

제네릭을 string으로 하는 List 개체를 생성한다.

초기값에 문자열 슈퍼맨과 원더우먼을 저장한다.

 

10번줄: 리스트에 저장된 요소를 출력한다.

11번줄: 리스트에 저장된 요소의 개수를 확인하기 위해 Count 속성을 이용한다.

13번줄: 리스트에 요소를 추가하려면 Add( )메서드를 사용한다. 리스트의 제일 마지막에 추가된다.

14번줄: 리스트의 인덱스[2]에 요소를 삽입하려면 Insert( )메서드를 이용한다.

16~19번줄: foreach반복문으로 리스트의 요소를 출력한다.

21번줄: 요소를 특정 인덱스를 사용해서 제거하려면 RemoveAt( )메서드를 이용한다. 

22번줄 주석: 인덱스가 아니라 요소를 삭제하려면 Remove( )메서드를 사용한다.

 

추가로 List 사용시 자주 사용하는 메서드는 다음과 같다.

Clear( ) : 요소를 모두 깨끗하게 지운다. 즉 비어있는(empty) 상태가 된다.

IndexOf( ) : 앞에서 부터 몇 번째에 있는지 찾아서 인덱스를 반환한다(알려준다). (만약 없으면 -1 반환)

ToArray( ) : List를 array(배열)로 변환해 준다. 함수에서 리스트 대신 배열을 요구할 때 사용할 수 있다.

 

Dictionary(딕셔너리)

Dictionary의 특징

요소 하나에 Key(키)와 Value(값)을 쌍으로 저장한다.

Key를 사용해서 요소에 접근한다.

표 형태로 된 데이터를 관리하는데 편리하다.

 

Dictionary선언

 

Dictionary<T1, T2> dict = new Dictionary<T1, T2>();

 

8번줄:

제네릭 딕셔너리를 <int, string> 타입으로 변수 dict를 선언한다.

제네릭 딕셔너리 개체를 생성해서 변수에 저장한다.

 

9번줄 주석:

var 타입의 변수를 선언하면 좀 더 간편하다.

var 타입은 변수의 값을 추론할 수 있는 기능을 가지고 있다.

 

11~12번줄: 딕셔너리 변수에 키와 값을 추가하려면 Add( )메서드를 이용한다.

14번줄 주석: 딕셔너리 선언과 동시에 초기값을 저장할 수도 있다.

16~19번줄: foreach반복문으로 요소를 출력하면 아래와 같은 결과가 나온다.

 

추가로 딕셔너리에서 자주 사용하는 속성과 메서드는 다음과 같다.

 

21번줄: 변수명[키값] 은 해당 키값과 연결된 Value값을 반환한다.

23번줄: Count 속성은 몇 개의 쌍이 있는지 반환한다.

25번줄: ContainsKey( ) 메서드는 Key값이 있는 지 확인한 후 true 또는 false를 반환한다.

27번줄: ContainsValue( ) 메서드는 Valeu값이 있는 지 확인한 후 true 또는 false를 반환한다.

29번줄: Remove( ) 메서드는 Key값으로 해당 키-값 쌍을 지운다. 성공하면 true를 반환한다.

 

컬렉션에서 사용할 수 있는 속성과 메서드는 수 없이 많다.

지금까지 살펴본 것 이외의 것들은 게임을 만들 때 다루기로 한다.

 

끝.

Wraven...