본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티09_C#_05_배열_Array

배열(Array)은 여러 값을 하나의 변수에 저장하여 처리할 때 사용한다.

예를 들어 게임 플레이어의 점수를 기록해야 할 때 사람이 많다면 변수 score_player를 그 수 만큼 만들어야 하므로 작업이 많아진다. 100명이라면 score_player1 부터 score_player100까지 만들어야 할 것이다.

 

이런 경우 배열을 사용할 수 있다.

배열을 사용하면 변수 100개를 만들지 않아도 된다.

 

배열 선언

 

배열을 사용(선언)하려면 대괄호 [ ]와 함께 다음과 같은 형태를 사용한다.

 

타입[ ] 배열명;

 

예를 들면 string(문자열) 타입의 books라는 배열을 선언하려면 다음과 같이 표현한다.

string[ ] books;

 

int(정수) 타입의 scores라는 배열의 선언은 다음과 같다.

int[ ] scores;

 

만약 scores라는 배열명으로 정수(int) 타입의 배열을 만들고, 필요한 요소(element)수를 5개로 만들려면 아래와 같이 정의한다.

 

int[ ] scores = new int[5];

 

위 코드에서는 int(정수) 배열 타입을 저장하기 위해 scores라는 배열 변수를 선언했다.

대입연산자(=)는 저장(대입)하라는 뜻이다.

 

(다음에 저장할 대상(객체)을 적는다)

 

저장할 인스턴스(객체)는 new 키워드로 만든다.

참고로 배열은 참조 타입(reference type)이므로 인스턴스(객체)를 만들기 위해서는 new 키워드를 사용해야 한다.

인스턴스(객체)의 크기는 int타입의 요소가 5개인 배열이다.

배열을 정의할 때는 반드시 요소 개수(크기)를 표시해야 한다.

 

위와 같이 정의하면 scores 변수에 5개 요소가 들어갈 수 있는 정수 타입의 배열  상자가 만들어져 저장된다.

각 상자에 넣는 값(value)을 요소(element)라고 부른다.

그리고 각 요소에는 인덱스(index) 번호가 0부터 4까지 매겨져 관리된다. 

 

scores[0] scores[1] scores[2] scores[3] scores[4]

 

배열을 상자라고 생각하면 연속된 상자 5개가 만들어지고, 0부터 시작하는 인덱스 번호는 각 상자에 붙인 상자번호라고 할 수 있다.

 

만약 배열 요소에 아래와 같은 정수 값을 저장하면 다음과 같은 형태가 된다고 생각할 수 있다.

이제 이 배열에 어떤 값을 저장하거나 가져올 때는 정수값을 직접 다루는 것이 아니라 해당 배열 상자에 붙은 인덱스 번호를 변수명 처럼 이용한다.

 

 

기본 배열

 

5개 요소를 가진 scores라는 배열을 코드로 작성하면 다음과 같다.

 

요소의 값을 넣지 않기 때문에 전역변수로 정의했다.

Start함수에서 각 요소의 값을 출력하기 위해 인덱스 적어서 확인하면 다음과 같다.

배열 scores에 만들어진 모든 요소는 int 타입의 기본값 0 으로 초기화 되어있는 것을 알 수 있다.

 

배열에 요소값 넣기

 

 

요소 수 5개를 가진 scores라는 배열을 만들고 각 요소값(70, 92, 65, 88, 50)을 저장하고 앞에서 배운 반복문을 사용해서 출력하는 스크립트를 작성하면 다음과 같다.

 

 

그런데 위와 같이 요소 값을 입력할 때 11번줄~15번줄 처럼 입력하면 번거롭다.

이런 경우 다음과 같이 적으면 된다.

 

int[] scores = {70, 92, 65, 88, 50};

 

위와 같이 적는 방법은 코드를 좀 더 간결하게 작성하려는 목적으로 변화되었다.

배열의 작성법에 따른 본래 코드는 int[] scores = new int[5]{70, 92, 65, 88, 50} 였다.

코드를 보면 int[] 이 중복되어 있기 때문에 new키워드와 함께 생략하게 된 것이다.

요소의 개수도 생략할 수 있었던 것은 컴파일러가 코드를 번역할 때 쉼표로 구분된 개수를 추정해서 5라는 것을 자동으로 인식하게 만들었기 때문이다.

 

그러므로 배열을 선언하고 요소값을 바로 넣어서 정의하려면 위와 같이 중괄호 안에 쉼표로 구분해서 적어주면 된다.

 

예를 들면 다음과 같다.

double[ ] height = { 164.5 , 170.0 , 183.2 }

string[ ] pets = { "강아지", "고양이", "앵무새" }

 

 

결과는 같으며 코드 길이도 줄어들었다.

 

만약 요소의 개수가 많을 경우는 몇 개인지 일일이 세는 것이 불편하므로 위 for 반복문의 조건식은 다음과 같이 수정하여 사용할 수 있다.

 

for(int i = 0; i < scores.Length; i++)

 

for반복문 괄호안 i의 조건식에서 scores.Length는 배열 변수 scores의 Length(길이) 를 나타낸다.

길이는 요소의 개수를 나타낸다. 

 

Length는 요소의 총 개수를 가져오도록 만들어 놓은 메서드(함수)이다.

요소의 개수가 많거나 일정하지 않고 변할 때 이 메서드를 사용해서 배열의 요소가 총 몇 개 인지 쉽게 알 수 있다.

 

그래서 scores라는 배열 변수의 요소 개수를 알고 싶으면 scores 다음에 점(.)을 찍고 Length를 적으면 된다.

여기서는 요소의 총 개수 5 를 가져오게 된다.

그러므로 for 반복문에서는 i 초기값을 0으로 하고 i가 5미만일 때 까지 i값을 1씩 더하는 것을 반복하게 된다.

 

foreach 반복문

앞 글 제어문2에서 생략한 foreach문에 대한 설명을 여기에 추가한다.

 

foreach문은 여러 요소를 가지고 있는 데이터 구조에 접근해서 모든 요소에 차례대로 접근하는 반복문이다.

위 코드는 scores라는 배열을 만들고 그 요소를 하나씩 보여주는 스크립트이다.

이때 요소 출력을 위해 for반복문을 사용했는데 foreach를 사용하는 방법도 있다.

for each는 '각각에 대해 반복하라'는 의미라고 생각하면 된다.

 

기본 형태는 다음과 같다.

 

foreach (배열타입 변수명 in 배열명)

{

    실행할 내용

}

 

for 반복문에서는 배열의 인덱스 번호를 사용했지만

foreach 반복문에서는 인덱스를 사용하지 않고 배열타입과 배열명을 사용하는 것에 주의해야 한다.

 

그래서 위 코드에서 for과 foreach를 사용한 코드는 다음과 같다.

foreach문으로 작성하면 scores 안에(in) 있는 요소값 각각을 차례대로 가져와서 변수 i에 저장한 후 출력하는 과정을 반복한다. 그러므로 for문의 변수 초기화, 배열의 길이 등을 줄일 수 있어서 간편하다.

foreach문은 요소에 하나씩 접근해서 어떤 작업을 반복하는데는 유용하므로 for문 처럼 다양한 형태의 반복을 만들기는 어렵다.

그래서 foreach 반복문은 주로 배열과 나중에 배울 컬렉션에서 이용한다.

 

위에서 foreach 반복문에서는 인덱스를 사용하지 않고 배열타입과 배열명을 사용하는 것에 주의해야 한다고 했다.

추가로 예를 하나 더 만들어보자.

만약 string(문자열) 타입의 배열 pets에 요소(element)를 3개 넣고 각 요소의 출력을 반복하는 코드를 작성한다면 아래와 같이 작성해야 한다.

 

변수명 element는 아무 이름이나 지어도 되지만 여기서는 배열의 요소(element)를 나타내므로 그렇게 지었다.

 

 

배열 예1

 

이번에는 위 배열의 요소값을 사용하여 요소값이 80 이상인 것을 출력하는 스크립트를 만들면 다음과 같다.

 

 

 

12번줄: if조건문에서 제일 처음 scores[0] 요소값이 80보다 크거나 같은지 비교하여 맞으면 요소값을 출력하고 그렇지 않으면 반복문으로 돌아간다. i의 값이 0부터 4까지 바뀌면서 조건에 맞는지 비교하게 된다.

 

 

배열 예2

 

위 배열의 요소값을 사용하여 평균을 구해서 출력하는 스크립트는 다음과 같다.

 

평균을 구하려면 요소의 합을 구한 후 요소의 개수로 나누면 된다.

합에 사용할 변수명은 sum(합계)이라고 하고 평균값에 사용할 변수명은 average(평균)라고 하자.

 

 

14번줄: 배열 scores의 요소값을 모두 더하여 합을 sum변수에 저장한다.

17번줄: 평균값을 저장할 변수 average 를 정의한 후 합계값을 요소 수로 나누어 구한 값을 저장한다.

18번줄: average변수 값을 출력한다.

평균값은 73이다.

 

여기서 평균값을 저장한 변수 타입을 int (정수)로 정의했기 때문에 소수점 이하값은 버려지고 정수만 표현된다.

소수점까지 표현하고 싶으면 변수 타입을 float로 정의하면 된다.

 

소수점으로 나오는지 확인해 보자.

그런데 위 sum값은 365 이다.

5로 나누면 정확히 73이므로 마지막 50을 51로 바꾸고 아래 코드처럼 average를 float타입으로 바꿔서 출력해 보자.

366 / 5 = 73.2 가 나오는지 확인해 보자.

 

float average = sum / scores.Length;

 

여전히 소수점이 나오지 않고 73만 나온다.

이렇게 되는 이유는 C#에서는 정수끼리 나눗셈 하면 소수점 이하는 무조건 버리고 정수만 나타내기 때문이다.

 

정수끼리의 나눗셈에서 소수점까지 출력하려면 다음과 같은 편법을 사용하면 된다.

float타입 값 1.0f 를 처음에 곱해주면 소수점을 나타낼 수 있다.

 

float average = 1.0f * sum / scores.Length;

 

 

위 코드 중에서 for 반복문을 앞에서 배운 foreach 반복문으로 수정하면 다음과 같다.

본래 var은 배열 타입인 int가 되어야 하지만 위 처럼 var로 표현할 수도 있다.

배열이 어떤 타입이든 var로 대신할 수 있다는 뜻이다.

 

var

var에 대해 간단히 설명하기로 한다.

var은 variable(변수)의 줄임말인데 C# 언어에서는 컴퍼일러가 타입을 추론해서 결정하도록 맡기는 타입으로 사용한다.

코틀린 언어에서도 이 추론 기능을 이용하여 변수 선언할 때 타입을 생략했었다.

 

간단한 예를 들면 int test = 5; 와 var test = 5; 는 서로 같다.

int는 타입을 명확하게 지정해준 것이고, var은 값을 보고 추론하도록 맡기는 것이다.

int가 명시적 타입이라면, var은 암시적 타입이라고 할 수 있다.

 

@참고

에러 코드에서 괄호 안에 있는 숫자는 에러가 일어난 곳의 위치를 나타낸다.

위 에러 코드에서 (17,25)는 17번줄 25번째 글자에 오류가 있다는 뜻이다.

 

배열 예3

이번에는 배열의 요소를 정렬하는 방법을 알아본다.

 

다음과 같은 배열을 만들었다고 하자.

이 배열의 요소들은 현재 정렬되어 있지 않은 상태이다.

이런 상황에서 사용할 수 있도록 Array(배열) 클래스 안에 요소를 정렬해 주는 Sort( ) 라는 메서드를 만들어 두었다.

즉, Sort( ) 메서드를 사용하면 요소를 올림차순(1,2,3~) 또는 알파펫 순으로 정렬할 수 있다.

 

다음은 위 코드를 Sort( )메서드를 사용하여 정렬한 예다.

 

2번 줄처럼 using System; 을 추가해야 한다.

Sort()메서드를 사용하려면 Array클래스가 속해 있는 네임스페이스(namespace)를 사용할 수 있어야 한다.

Array클래스는 네임스페이스 System 안에 포함되어 있다.

 

10번 줄에 Array.Sort( ) 의 뜻은 'Array의 Sort( ) 메서드에 접근한다'고 이해하면 된다.

그리고 괄호 안에 정렬할 배열명을 적으면 Sort메서드에 전달하게 된다.

 

12번 줄에 배열이 정렬되었는 지 확인하기 위해 foreach 반복문으로 요소(element)를 출력해보자.

유니티로 실행하면 다음과 같은 결과가 나올것이다.

 

다음과 같은 string타입의 배열은 영어는 알파벳, 한글은 자음순으로 정렬된다.

 

 

 

 

끝.

Wraven...