본문 바로가기
유니티5 독학 & 게임 제작

유니티5 독학하기 그 24번째 걸음-C# 공부 중간 정리

by 인터넷떠돌이 2017. 8. 4.
반응형

안녕하세요?


[유니티5와 함께하는 C# 첫걸음]이라는 책을 읽고서 유니티5로 게임을 제작하는 것에 있어서 프로그래밍에 대한 부분을 공부하고 있는 중입니다. 일단 책의 챕터5까지는 읽고서 중요하다고 생각한 내용을 정리하였고, 이번 포스팅에서는 그렇게 정리한 내용을 다시 한번 더 정리해서 포스팅에 들어가고자 합니다.


먼저 변수에 관해서 이야기를 해야 겠습니다. 책에서 소개가 되어 있는 것은 카멜 표기법(camel casing)이라는 것을 속개하고 있는데, 변수의 이름을 정하는 규칙인데... 아래의 예제와 같이 첫단어를 소문자로 시작하고, 두번째 단어부터 시작하는 알파벳을 대문자로 시작한다고 보시면 됩니다.


firstSecondThirdForth


이런 식으로 작성을 해서, 띄워쓰기가 없는 한단어로 만들어야 한다고 합니다. 왜 이렇게 변수의 이름을 길게 만드냐고 하면, 너무 포괄적이고 구체적이지 않은 이름을 쓰면, 자기가 만든 변수라고 해도, 이 변수가 무엇을 의미하는 지를 알 수 없어서 후회하는 사태가 벌어진다고 합니다. 그래서 아래처럼 '톰아저씨의 핫도그 갯수'를 의미하는 변수라면 다음과 같은 이름을 지어야 한다고 합니다.


uncleTomHotdogNumber


물론 이름을 짓는 것은 본인의 자유이지만, 주의해야 할 것은 분명히 자기가 작성한 코드를 다시봐야 할 일이 있는데 그때마다 코드를 전체적으로 다시 봐야 할 필요 없이, 이름만 보고서 이게 무엇을 의미하는 지를 알 수 있도록, 이름의 길이가 길어지는 한이 있어도 구체적으로 지어야만 한다는 것입니다.


이어서 변수를 선언하기 위해서는 3가지 요소가 있어야 하는데, 그 요소는 다음과 같습니다.

1) 변수사 저장할 수 있는 데이터 형식

2) 변수의 이름

3) 끝을 장식하는 세미콜론(;)


int testVariation;


위 세3지만 지정해도 변수를 선언하는 데는 지장이 없다고 합니다. 위에 올라와 있는 예시에서 보면 알 수 있듯이, 일단 public이라는 선언을 하지 않았으므로 유니티5에서 private로 처리를 하며, 그 결과 유니티5의 inspector창에 표시가 되지 않으며, 다른 스크립트에서 접근할 수 없습니다. 따로 값을 대입하지 않으면 정수인 int라고 선언했으니, 기본적으로 0의 값으로 처리가 됩니다.


다음으로는 메소드라는 것에 대해서 정리를 해 보겠습니다. 메소드는 이름만 호출하면 다시 실행할 수 있는 코드블록이며, 이를 이용하면 두번이상 실행하길 바라는 코드를 그때마다 일일히 입력할 필요없이 메소드만 호출하면 됩니다. 그리고 메소드란 '함수'와 정확히 같은 뜻이라고 합니다.


이 메소드의 이름 역시 길이가 길어지더라도 한눈에 의미를 알 수 있는 이름으로 지어야만 합니다. 이 역시 자기가 작성한 코드를 다시봐야 하는 일이 생기는데, 그럴 때 마다 자세한 의미를 알 수 있기 때문입니다. 그리고 메소드의 이름을 짓는 규칙은 변수와의 차별화를 위해서 시작하는 첫 알파벳은 대문자로 하며, 이후 이어지는 단어의 시작 알파벳을 대문자로 하는 것입니다.


메소드를 구성하는 최소 요건은 3가지라고 합니다.

1) 메소드를 호출한 위치로 리턴할 데이터의 형식

2) 코드 블록을 담은 중괄호 한쌍

3) 괄호 한쌍으로 끝나는 메소드의 이름


void FirstSecondThirdForth() { } 


위에 나온 예시에서 처럼 저렇게 만들어도 메소드가 만들어 지기는 집니다. 이 경우 public이라고 하지 않았기 때문에, 기본적으로 private처리를 하기에 다른 스크립트에서 이 메소드를 호출할 수 없습니다. 그리고 코드 블록인 중괄호에 아무것도 없기에 아무런 일도 일어나지 않습니다. 그리고 void라고 해서 아무것도 없다는 것을 선언했기 때문에, 어떠한 값도 리턴하지 않는다는 의미가 됩니다.


그런데 만약 두 정수의 값을 더해서 그 합을 만드는 메소드를 만들었다면 어떻게 해야 할까요? 그리고 그 값을 표시해야 할 필요가 있다고 하면? 이 경우에는 void라고 하면 안되고, int라고 테이터의 형식을 지정해야만 합니다. 그래야만 두 정수의 합이라는 정수를 정수 형식으로 호출한 곳으로 보낼 수 있습니다.




여기서 헷갈릴 수도 있는게, 호출한다라는 것은 별것없이 스크립트 어디에서나 


메소드이름();


이라고 하면 코드 블록 안에 있는 코드가 메소드의 이름을 입력한 곳에서 실행이 되는 것을 의미합니다. 당연 리턴값이라는 것도, 이 메소드의 이름을 집어넣은 곳에다가 메소드 안에서 계산이 된 값을 다시금 주는 것을 의미합니다. 먼저 public으로 선언이 된 A라는 이름의 메소드를 first.cs라는 스크리브에서 만들었다고 칩시다. 이 A라는 메소드는 두 정수의 합을 구해주는 메소드인데, second.cs라는 스크립트에서 A(); 이라고 입력을 해서 메소드를 호출했습니다.


그럼 second.cs라는 스크립트에 A라는 메소드의 계산값을 줘야 하는데, 이 경우에 사용되는 것이 데이터 형식으로 void를 지정하면 아무것도 주지 않겠다는 의미가 되어서 second.cs는 아무런 값을 받을 수도 없는 것입니다. 그런데 아래의 형식으로 A라는 메소드를 지정했다고 합니다.


public int A() { }


이 경우에는 second.cs라는 스크립트에다가 정수 형식이라고 int를 선언했으니, 정수값을 가져다가 주는 것입니다. 


그리고 메소드는 언제나 괄호 두개로 끝이 나는데, 이 괄호안에 들어가 있는 것을 '파라미터'라고 합니다. 즉, 메소드에 들어가는 변수로서 위에 예시에 든 A라는 메소드가 성립하기 위해서는 2개의 정수값을 넣어줘야 하는데, 이때 괄호안에 정수 2개가 들어가는 것입니다.


그리고 마지막으로 값을 리턴하기 위해서는 코드블록 안에다가 return; 이라는 키워드를 적어 주어야 합니다. 이렇게 해야 메소드를 호출한 위치로, 메소드의 리턴하는 값을 끼워주는 행동을 하게 됩니다.


다음으로는 배열이라는 것에 대해서 정리를 하도록 하겠습니다.


배열이라는 것은 간단하게 값을 목록을 하나의 변수에 저장하는 것으로 아래의 형식을 지정하면 된다고 합니다.


public 데이터형식[] 배열이름 = new 데이터형식[숫자];


* 여기서 public은 다른 스크립트나 메소드에서 접근할 수 있음을 의미하는 것입니다. 

* 데이터 형식은 int라는 정수나 string같은 문자열인 데이터의 형식을 의미합니다.

* 숫자는 배열안에 들어가는 데이터의 갯수입니다. 만약 문자열인 사람이름이 4명분 들어간다고 하면, 4라는  숫자가 입력됩니다.


그러니 여기서 리스트라는 것이 등장하는데, 배열에 비래서 2가지의 더 나은 점이 있다고 합니다.

1) 배열의 크기는 바꿀 수 없으나, 리스트의 크기는 바꿀 수 있다.

2) 배열은 '안에 들어가는 데이터-요소'를 늘리기 위해서는 요소의 수를 늘리고, 기존의 요소를 복사하는 과정이 필요하나, 리스트는 요소의 추가나 삭제가 쉽습니다.


이런 이유로 리스트가 쓰이며, 유니티5에서 주로 쓰이는 예시로는 RPG게임의 인벤토리 같은 것으로 사용이 된다고 합니다. 이런 리스트를 사용하기 위해서는 C# 스크립트 상위에 아래에서 나오는 구문을 써야만 한다고 합니다.


using system.Collections.Generic;


예전에 포스팅을 하였는 prime[31]을 사용할 때와 마찬가지인 것으로 보입니다. 아무튼 이런 것을 사용해야 하며, 배열과는 다르게 아래의 예시와 같은 형식으로 선언을 해야 한다고 합니다.


public List<데이터형식> 리스트이름 = new List<데이터형식>( );


이렇게 리스트를 사용하는 것이 편하기는 편하나, 배열은 처리의 속도가 빠르다는 장점이 있습니다. 그래서 유연하게 요소를 추가하고 빼야하는 상황에서는 리스트를 사용하고, 데이터처리의 속도가 빨라야먄 하는 경우에는 배열을 사용하는 것이 좋다고 책에서는 언급하고 있습니다.


그럼 여기서 궁금한 것이, 어떻게 배열과 리스트에 데이터를 넣고 빼느냐 하는 것일 건데, 방법은 간단합니다. 유니티의 C# 스크립트를 실행해 보면 나오는 start()와 update()라는 함수가 기본적으로 있습니다. 이런 메소드는 스크립트가 시작할때, 주로 유니티5에서 플레이 버튼을 눌렀을 때를 지칭하고 있는 경우가 많습니다. 아무튼 이런 start() 에다가 아래의 형식으로 배열이나 리스트에 데이터를 추가할 수 있습니다.


배열이름 or 리스트이름.Add(배열이나 리스트에 넣을 데이터);


이런 형식을 지켜서 데이터를 추가할 수 있으며, 그 외의 명령어는 LIst<T> 라는 형식으로 검색을 하는 것으로 알 수 있습니다. 그리고 유의해야 하는 것은 이 배열이나 리스트는 인덱스라고 해서 번호를 매겨서 안에 들어가 있는 데이터를 관리하고 있는데, 1이 아니라 0으로 시작을 한다는 것을 잊으면 안됩니다.


반대로 배열이나 리스트의 안에 들어가 있는 요소를 가지고 오고자 하면 아래의 형식을 입력하면 됩니다.


배열이나 리스트의 이름[정수인 숫자]


이와 같은 식으로 입력하는 것으로 배열이나 리스트안에 들어가 있는 데이터를 가지고 올 수 있는 것입니다. 마지막으로 리스트나 배열은 같은 형식의 데이터만 저장할 수 있습니다. 예를 들면 문자열인 string을 지정했으면 문자열만 저장할 수 있는 것으로 되는 것입니다.


추가로 배열의 경우에는 배열이름.Length 로 배열의 크기를 확인할 수 있으며, 리스트의 경우에는 리스트이름.Count 를 지정해서 배열이나 리스트의 크기를 확인할 수 있다. 


다음은 ArrayList라는 것이 있습니다. 가장 중요한 특징은 ArrayList의 경우에는 데이터의 형식과 관계없이 저장을 할 수 있다는 것입니다. 가령 리스트나 배열은 문자열과 정수를 둘 다 저장할 수 없는데, ArrayList는 가능하다는 것입니다. 이 ArrayList를 지정하는 방법도 간단합니다.


public ArrayList 이름 = new ArrayList();


이제 마지막으로 해시 테이블이라는 것에 대해서 언급을 하고 지나가야 겠습니다. 이 해시 테이블이라는 것은 딕셔너리라는 것 일종으로 가장 많이 사용되는 딕셔너리라고 합니다.배열이나 리스트는 인덱스라는 정수를 이용해서 저장된 데이터를 관리를 하는데, '문자열'인 키를 이용해서 각자의 데이터를 관리한다고 할 수 있습니다.


public Hashtable 해시테이블이름 = new Hashtable();


위와 같이 나와서 해시 테이블을 선언할 수 있으며, 해시 테이블은 크기를 얼마든지 바꿀 수 있으며, 문자열과 정수 등 다른 형식의 데이터를 동시에 저장할 수 있으며, 중요한 특징으로 유니티5의 inspector창에서 전혀 보이지 않습니다. 그리고 해시 테이블의 경우에는 아래와 같은 형식으로 해시 테이블에 데이터를 저장할 수 있습니다.


해시테이블이름.Add("문자열 값", 저장할 데이터);


즉, "문자열 값"이라는 것을 키로 해서, 저장할 데이터를 해시 테이블에 저장하라는 의미인데, 이 때문에 불러올 때도 아래와 같은 형식을 띄게 됩니다.


(데이터형식)해시테이블이름["문자열 값"];


이것으로 챕터5까지 공부해서 중요하다고 생각한 것을 마칩니다. 다만 여기까지 정리한 것은 이론상으로 볼 때 중요하다고 생각한 것이었지, 실습을 해서 얻은 것은 아니기는 합니다. 그래서 아마 책의 후반부에 들어가면 실습할 기회가 올 것으로 생각이 되는데, 그 때 가서 포스팅의 내용을 더욱 알차게 해서 올리도록 하겠습니다.




반응형