본문 바로가기

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

유니티와 C# 개념 정리_005_타입과 초기화

타입(Type)

흔히 메모리를 임시 작업대 또는 저장소로 비유한다.

메모리에 변수를 사용해서 데이터를 저장하거나 참조한다.

그래서 변수는 임시 작업대 위에 올려진 상자에 비유하기도 한다.

변수의 타입은 변수라는 상자 안에 넣을 수 있는 유형을 정해 둔 것이다.

 

C#에서 변수는 모양과 크기가 다른 상자를 준비해야 한다.

이것을 앞 글에서 Strongly typed(강한 타입화)라고 했다.

반면에 약한 타입화를 가진 어떤 언어에서는 모양,크기에 상관없이 무엇이든 넣을 수 있는 상자를 만들 수 있기도 하다.

 

어쨌든 C#에서 변수를 사용하려면 <타입>을 지정하고 <변수명>을 지어야 한다.

타입이 지정된 변수는 해당 타입에 맞는 값만 넣거나 뺄 수 있다.

 

타입의 종류

 

타입은 크게 built-in type (빌트인 타입; 미리 만들어져 있는 타입)과 사용자가 정의해서 만드는 custom type(커스텀 타입)으로 나눌 수 있다.

 

유니티에서 주로 사용하는 변수의 타입(Type)은 다음과 같다.

 

1. bool (부울 타입)

Boolean(불리언)을 줄인말이다.

bool 타입은 true(참) 또는 false(거짓) 2가지 값만 넣을 수 있다.

isGameOver (게임 종료되었나) 이라는 변수를 bool 타입으로 선언하고 true값을 저장하려면 다음과 같이 표현할 수 있다.

 

bool isGameOver = true ;

 

2. int (인트 타입)

Integer(정수)의 줄인말이다.

음의 정수, 0, 양의 정수를 저장할 수 있다.

가장 많이 사용하며, 계산이 정확하고 빠르다.

메모리의 32bit(비트) 크기를 사용하므로 이 타입으로 선언한 변수에 넣을 수 있는 정수의 범위는 아래와 같다.

-2,147,483,648 에서 2,147,483,647 까지

 

int 타입으로 선언한 integerNumber라는 변수에 1234567890(십억삼천~)을 저장하려면 다음과 같다.

int integerNumber = 1234567890 ;

 

3. float (플로트 타입)

A floating-point number (부동 소숫점 수)를 나타낸다.

floating(부동)은 '(물)위에 떠서 다니다'라는 뜻인데 소숫점이 고정되어 있지 않기 때문에 붙여졌다.

소숫점 있는 실수를 사용할 때 가장 많이 사용하는 타입이다.

 

소숫점이 있는 수는 대부분 근사치를 나타내므로 계산이 정확하지 않을 수 있다.

하지만 정밀도가 낮은 문제는 게임 제작에서 그렇게 중요하지 않지만 게임오브젝트(개체)의 크기가 1보다 작은 경우 충돌을 감지하는 Collider(콜라이더) 컴퍼넌트 등에서 오류를 일으킬 가능성이 있다고 한다.

 

정밀도가 2배인 double (더블) 이라는 타입도 있지만 계산 속도가 float에 비해 느리기 때문에 게임의 특성상 빠른 계산이 필요하므로 float를 사용한다.

float타입을 사용할 때는 double타입과 구별하기 위해 숫자 뒤에 f 를 붙인다.

 

float 타입으로 선언한 pi 라는 변수에 3.14를 저장하려면 다음과 같다.

float pi = 3.14f ;

 

 

4. char (캐릭터 타입)

character(캐릭터; 성격, 특징, 문자)의 줄인말이다.

단일 문자를 나타낼 때 사용한다.

유니티에서는 단일 문자를 유니코드(Unicode)를 사용해서 저장한다.

 

유니코드는 전 세계 모든 문자를 컴퓨터에서 나타내기 위해 만들었다.

메모리에 미리 일정 공간을 만들고 그 안에 각각 코드 포인트를 표시해서 세계의 모든 문자와 숫자, 기호 등을 넣어 두었다. 예를 들어 키보드의 A키를 치면 유니코드의 해당 위치에 있는 문자를 호출하는 방식이다.

char 값은 작은 따옴표 ( ' ' ) 안에 넣는다.

 

char 타입으로 선언한 theLetter 라는 변수에 A 문자를 저장하려면 다음과 같다.

char oneLetter = 'A' ;

 

5. string (스트링 타입)

string(스트링) 타입은 한 문자 이상의 문자열 또는 텍스트를 저장할 수 있다.

메모리가 허용하는 한 백과사전의 모든 텍스트도 저장할 수 있다.

큰 따옴표 ( " " )안에 넣는다.

 

string 타입으로 선언한 myFirstString 이라는 변수에 Hello C# 이라는 문자열을 저장하려면 다음과 같다.

string myFirstString = "Hello C#" ;

 

참고로 아래와 같이 문자열 변수에 대괄호 [ ] 를 사용하여 문자열 값의 단일 문자를 가져올 수 있다.

위 코드에서 변수 myChar에는 스트링 문자열 값의 6번째 문자가 저장된다.(왼쪽에서 0부터 시작한다)

Basic02.cs 스크립트를 Basic 개체에 연결하여 실행하면 myChar에 저장된 문자를 확인할 수 있다.

 

6. class (클래스 타입)

 

클래스 타입은 custom type(커스텀 타입)이다.

즉, class(클래스)를 만들면 클래스를 이용하여 사용자가 필요에 따라 새 변수 타입을 만들 수 있다. 

이때 클래스 타입은 클래스 이름을 사용한다.

 

클래스 안에는 변수, 메서드 같은 클래스 멤버가 포함되어 있으므로 클래스 타입을 만들면 그 안에 있는 기능을 활용할 수 있다. 

 

유니티에는 게임 제작에 필수적인 수 많은 클래스들이 이미 만들어져 있기 때문에 어떤 기능이 어느 클래스에 있는 지만 알면 타입을 만들어서 원하는 기능을 구현할 수 있게 준비가 되어 있다.

 

또한 직접 스크립트에 클래스를 작성할 수도 있다.

 

MonoBehaviour 클래스 안에 있는 클래스들을 사용하거나, using 키워드를 사용해서 namespace 안에 있는 클래스들을 불러와서 사용할 수 있다.

 

클래스 타입은 다음 글에 따로 정리한다.

 

 

인스턴스(Instance)와 오브젝트(object, 개체)

 

어떤 데이터 값을 메모리에 저장할 때는 타입에 이름(변수명)을 붙여서 사용한다고 했다.

위의 1~4 같은 기본 타입의 경우는 정해진 크기를 가지고 있다.

타입과 함께 변수를 선언하면 타입의 크기에 맞게 메모리의 공간을 확보하고 값을 저장하게 된다.

그러므로 타입이라는 개념은 메모리를 정확한 기준에 의해 효율적으로 사용하기 위해 만들어진 것이다.

 

이런 과정을 인스턴스화(instantiating)라고 부르며 그 결과로 인스턴스가 생긴다.

그러므로 C#에서는 모든 값들이 어떤 특정한 타입의 인스턴스(instance)라고 할 수 있다.

 

Instance는 우리말로 '사례, 경우, 예를 들다'라는 뜻이다.

 

인스턴스를 간단하게 설명하면 다음과 같다.

 

아래와 같이 int(정수) 타입으로 number라는 변수를 만들고 정수 56을 할당한다고 하자.

 

int number = 56 ; 

 

코드를 실행했을 때 변수(number)는 int타입의 인스턴스가 되어 메모리 공간을 확보한다.

그리고 56이라는 object(오브젝트, 개체)를 그 공간에 저장한다.

Instance의 뜻 그대로 '타입의 예'가 만들어지는 것이다.

 

이런 식으로 개체를 직접 저장하는 타입을 Value Type(값 타입)이라고 부른다.

Value타입은 모든 숫자 타입, bool, char, struct , enum 타입이 있다.

 

클래스 타입의 경우는 다음과 같다.

 

MyClass 라는 이름을 가진 어떤 클래스가 있다고 하자.

이 클래스 이름을 이용해서 클래스 타입의 변수를 만들 수 있다.

 

MyClass test = new MyClass( ) ;

 

코드를 실행했을 때 변수(test)는 MyClass타입의 인스턴스가 되어 메모리 공간을 확보한다.

그리고 클래스의 개체(object)를 만들어서 메모리에 저장하고 test 공간에는 개체의 주소를 저장해 둔다.

C#에서 클래스의 개체를 만들 때는 new 클래스명( ) 과 같이 표시한다.

즉, 클래스 타입은 클래스를 통째로 오브젝트(개체)로 만든다.

클래스의 경우는 클래스의 오브젝트(개체)를 만들어야 그 안에 작성되어 있는 변수와 함수를 이용할 수 있기 때문이다.

 

클래스 타입의 인스턴스는 기본 타입과 다르게, 개체를 변수가 있는 위치에 저장하지 않고,

개체가 저장되어 있는 곳의 주소(위치)를 저장하고 있다. 이것을 참조(reference)라고 부른다.

이렇게 변수가 인스턴스가 있는 위치를 참조하는 타입을 Reference Type (참조 타입)이라고 한다.

 

즉, 값 타입과 참조 타입의 차이는 개체(값)를 변수와 함께 저장하느냐, 아니면 개체(인스턴스)가 저장되어 있는 곳을 참조하고 있느냐의 차이다.

 

참조 (Reference) 타입은 모든 클래스, interface(인터페이스), array(배열), delegate(델리게이트) 타입이 있다.

미리 만들어져 있는 타입 중에서는 String(문자열) 타입과 Object(오브젝트) 타입도 참조 타입이다.

Object 타입은 나중에 정리한다.

 

 

초기화(Initializing)

 

변수에 처음 값을 할당하는 것을 변수 초기화(initializing; 이니셜라이징)라고 한다.

'값이 없음'을 나타내는 말은 null (널)이라고 부른다.

 

변수를 선언한 후 변수를 사용하려면 초기화(초깃값을 가진 상태)되어 있어야 한다.

그런데 지금까지 살펴본 기본 타입들은 변수로 선언되면 default(디폴트; 기본)값을 가지고 있다.

 

위와 같이 변수를 선언한 후 Start( )메서드에서 print ( ) 메서드로 출력하면 다음과 같은 결과를 얻을 것이다.

네번째 char의 경우는 디폴트값은 유니코드에서 Null(널)에 해당하는 \0 이다.

값이 없기 때문에 비어 있다.

 

주석(comment)

컴파일러는 주석을 코드로 인식하지 않는다.

그래서 코드를 설명하는 용도로 사용할 수 있다.

 

문법: 주석을 슬래시 2개 후에 적거나, /*로 시작한 후 끝에 */를 붙여서 만들 수 있다.

추가로 슬래시 3개(///)를 붙이는 주석도 있는데 이렇게 만든 주석 내용은 XML 타입의 문서를 만들 수 있다.

자세한 내용은 마이크로소프트 docs 설명서를 참고하거나 '주석 xml 문서'로 검색하면 문서 만드는 방법을 찾을 수 있다.

 

끝.

Wraven...