본문 바로가기

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

유니티06_C#_02_변수_Variable

1. 변수 타입

코틀린에서도 다루었듯이 변수(Variable)는 '변할 수 있는 수'라는 뜻이다.

변수값이 계속 변할 수 있기 때문에 붙여진 이름이다.

 

변수 자체는 데이터를 담는 상자 또는 그릇이라고 할 수 있다.

변수라는 상자에 이름을 붙이고 그 안에 데이터를 저장하게 된다.

 

그런데 이 상자는 여러 가지 모양(형태)가 있고 크기도 다르다.

이 변수라는 상자에 데이터를 담을 때는 모양(형태)에 맞는 값만 담을 수 있다.

이것을 변수 타입(Type) 또는 자료형(Data Type)이라고 한다.

 

간단히 말해서 숫자는 숫자 타입이라고 적힌 상자에, 문자는 문자 타입이라고 표시한 상자에만 넣을 수 있다는 뜻이다.

 

요약하면, 변수는 데이터를 저장하는 공간이며, 변수명(이름)을 지어서 표시하고, 어떤 형태(타입, type)의 데이터를 넣을 지 표시해야 한다.

 

코틀린과 마찬가지로 씨샵(C#)에서도 변수를 사용할 때는 변수명과 변수타입(Type; 데이터 형 또는 자료형)에 유의해야 한다.

 

  • 변수명은 코드에서 중복되지 않는 유일한 이름을 사용한다.
  • 변수 타입에는 정수, 실수(소수), 문자열, 불리언(boolean 또는 bool) 등이 있다.
  • 씨샵에서만 사용하는 타입도 있다.

 

아래에 자주 사용하는 변수 타입은 굵게 표시했다.

 

정수 타입(Integer types)

int

 

int의 범위는 -2147483648 ~ 2147483647 이며 크기는 부호있는 32bit 정수이다.

int 외에도 정수를 표현하는 타입은 sbyte (byte) , short (ushort) , long (ulong)이 있다.

괄호 안은 부호가 없는 즉, 음수를 표현하지 않는 경우에 사용하는 타입이다.

int는 음수를 표현하지 않는 경우 unsigned의 첫글자를 붙여 uint를 사용한다.

 

정수 타입을 정리하면 아래와 같다.

정수를 표현하는 타입을 여러 개로 구분한 이유는 메모리를 효율적으로 사용하기 위해서이다.

예를 들어 수를 나타내야 하는 어떤 변수가 8bit (-128 ~127)로 충분한데 64bit인 long 타입을 만들면 사용하지 않는 부분이 생기므로 메모리를 낭비하게 된다. 

소수(실수) 타입 (Floating point types)

소수점 이하의 수를 부동소수점(floating point) 방식으로 표현하는 타입이다.

부동소수점 방식이란 컴퓨터에서 실수를 처리하는 방식 중 하나인데 고정소수점(fixed point) 방식은 표현할 수 있는 실수 범위가 좁기 때문에 일반적으로는 부동소수점 방식을 사용한다.

예를 들어 123.0 처럼 소수점 있는 수 데이터는 floating point type(부동소수점 타입)으로 처리한다.

 

부동소수점 타입은 2가지다.

 

float 

double 

 

float는 32bit 부동소수점 값을 나타낼 수 있고, double은 64bit 부동소수점 값을 나타낼 수 있다.

이 외에 128bit 고정소수점 타입인 decimal 이라는 타입도 있다.

 

실수 타입은 기본적으로 double 타입으로 처리한다.

그러므로 특별한 상황에 사용하는 float타입 변수에 값을 넣을 때는 수 마지막에 f 또는 F를 적어야 한다.

float타입 변수 값에 f를 붙이지 않으면 에러가 난다.

 

문자, 문자열 타입(Character, String type)

char

string

 

char 타입의 값은 ' (작은 따옴표)를 사용하며 1개의 문자만 넣을 수 있다.

string 타입의 값은 " (큰따옴표)를 사용하고 0개 이상의 문자를 넣을 수 있다.

 

논리 타입 (Boolean 불리언 type)

bool

 

이 타입은 true 또는 false 값만 넣을 수 있다.

 

object 타입

object

 

C#에는 모든 타입의 값을 담을 수 있는 오브젝트 타입이 있다.

어떤 값도 사용할 수 있으므로 변수를 object타입으로 선언하면 간단할 것 같지만 이렇게 하면 메모리를 낭비하고 오류 발생의 위험이 있으므로 각 변수에 맞는 타입을 사용해야 한다.

 

2. 변수 사용해보기

먼저 정수 타입의 변수 test를 만들면 다음과 같다.

Start() 메서드 이전인 7번줄에서 클래스(class) 내에서 사용할 수 있는 전역(global ; 전체 구역) 변수로 변수타입(int 정수)과 변수명(test)을 선언했다. 그리고 명령문을 끝내기 위해 세미콜론(;)을 붙인다.

 

전역변수(Global Variable)와 지역변수(Local Variable)

변수가 영향을 미치는 범위를 말할 때 전역(global)과 지역(local)이라는 용어가 있다.

전역은 '전체 지역' , 지역은 '부분 지역'으로 이해할 수 있다.

그래서 전역 변수 클래스(Class) 안에서 선언하여 클래스 전체에서 사용할 수 있는 변수이다.

지역 변수 메서드(Method) 안에서 선언하여 해당 메서드에서만 사용할 수 있는 변수이다.

 

 

C#에서 변수 선언할 때는 다음과 같이 한다.

 

데이터타입 변수명;

 

여기까지 마치면 초기값을 넣지 않았지만 int(정수) 타입의 기본값인 0이 test라는 변수에 생성된다. 

Debug.Log 메서드(함수)로 test 변수의 값을 출력해 보면 0 임을 알 수 있다.

 

이번에는 Start 메서드(함수) 안에 지역(local) 변수로 만들어서 초기값을 넣어보자.

 

9번줄: 변수타입(int 정수)과 변수명(age)을 선언한다, 그리고 명령문을 끝내기 위해 세미콜론(;)을 붙인다.

 

10번줄: 선언한 변수age 안에 대입 연산자 = 을 사용하여 정수 55를 넣는다.

참고로 함수 안에서 사용하는 지역 변수를 선언한 후 초기화 하지 않거나 값을 넣지 않으면 에러가 난다.

*age (나이)

 

11번줄: 변수값을 콘솔(Console)창에 출력하기 위해 Debug.Log를 사용하고 변수age를 괄호 안에 넣으면 콘솔창에서 값을 확인할 수 있다.

 

3. 초기화(Initialization)

 

앞의 age변수와 달리 9번줄에서 float 타입의 변수 height1을 선언하고 값을 바로 대입할 수 있다.

이렇게 변수를 선언하고 동시에 값(value)을 대입하는 것을 변수의 초기화(initializing variables)라고 한다.

*height (키)

 

값에 f를 붙이면 부동소수점(float) 타입으로 취급한다는 뜻이다.

만약 붙이지 않으면 double타입으로 취급하므로 에러가 난다.

그러므로 float타입에 소수를 대입할 때는 반드시 value(값) 뒤에 f를 붙여야 한다.

 

10번줄에서 float타입의 height2 라는 변수를 선언한다.

11번줄에서 height2에 height1 값을 대입한다.

이렇게 같은 타입의 변수끼리는 값을 대입할 수 있다.

위의 경우 height1의 값을 복사해서 height2에 저장하므로 변수 height1에는 값이 그대로 남아있다.

 

4. 문자열 변수

이번에는 변수에 문자열을 넣어본다.

숫자도 큰따옴표(" ")에 넣으면 문자열로 취급한다.

 

 

5. 연산

 

사칙연산에는

+ , - , * , / 를 사용한다.

 

참고: 별표 기호 * 는 asterisk(애스터리스크)라고 부른다.

 

 

다음과 같이 변수의 연산도 가능하다.

위와 같이 변수에 값을 넣은 후 변수를 사칙연산할 수 있다.

 

9번줄에서 int 변수 num을 만들고 10으로 초기화한다.

10번 줄에서 num에 5를 더해서 num에 넣는다.(여기까지 하면 num값은 15)

11번 줄에서 num에 5를 더해서 num에 넣는다.(여기까지 하면 num값은 20)

그러므로 10번 코드와 11번 코드는 같지만 사용할 때는 11번 코드가 더 간단하고 편리하다.

즉, 변수 값에 어떤 값을 증가시켜서 저장할 때 += 연산자를 사용한다.

 

6. 증가 연산자와 감소 연산자

 

변수 값을 1만큼 증가할 때 사용하는 증가 연산자가 있다.

1증가 연산자는 다음과 같은 모양으로 사용한다.

 

변수명++

 

변수 값을 1만큼 감소하는 감소 연산자는 다음과 같이 사용한다.

 

변수명--

 

7. 문자열 연결

string 문자열을 + 연산을 사용해서 연결할 수 있다.

 

다음과 같이 += 연산자를 사용해도 결과는 같다.

그러나 앞의 코드와 다른 점은 str1값에 str2값을 더한 후 다시 변수str1에 저장하므로 변수 str1의 값이 바뀐다는 것이다.

 

8. 문자열과 숫자의 연결

 

문자열과 숫자를 연결하면 변수message가 string(문자열) 타입이므로 숫자는 문자열로 취급하여 저장한다.

 

9. 타입 변환(형 변환, Type conversion)

타입 변환(형 변환)은 타입이 바뀌는 경우를 말한다.

 

암시적(Implicit) 타입 변환

implicit은 '암시된, 내포된' 이라는 뜻이다.

암시적 타입 변환은 '포함하는 타입 변환'이다.

 

이것은 범위(크기)가 작은 타입을 큰 타입에 저장(할당)하는 경우를 말한다.

예를 들면 int 타입의 값을 long 타입 변수에 저장할 때이다.

이 경우 작은 범위인 int에서 큰 범위인 long으로 옮겨지므로 자연스럽게 변환할 수 있다.

 

int a = 1;

long b = a;

 

int타입 변수 a에 1을 넣었다.

그 다음 long 타입 변수 b에 int 타입 변수 a 값을 넣었다.

작은 것은 큰 것에 포함되어 있으므로 자연스럽게 저장할 수 있다.

 

크기가 작은 타입부터 순서대로 표시하면 다음과 같다.

 

char --> int --> long --> float --> double

 

예를 하나 더 들어본다.

위와 같은 암시적 변환이 가능하다.

그런데 char은 문자 하나만 넣을 수 있는 타입인데 숫자인 int(정수) 타입의 변수에 넣을 수 있는 것도 이상하고 int에 포함된다는 말도 이상하다고 생각할 지 모르겠다.

유니티로 출력하면 다음과 같이 44032라는 숫자(정수)가 나온다.

이것을 이해하려면 유니코드(Unicode)라는 것을 알아야 한다.

char 타입은 유니코드 UTF-16 문자를 나타낸다.

유니코드는 간단하게 말해서 전세계 언어를 모두 넣어둔 표준코드이다.

이것이 만들어졌기 때문에 인터넷에서 한글,영어,중국어 등 모든 언어를 표시할 수 있게 된 것이다.

 

각 언어의 글자들은 Unicode라고 하는 표준 코드의 특정 위치(코드표)에 자리잡고 있다.

예를 들어 한글 '가'는 유니코드로 'U+AC00'이다.

코드표의 U+AC00 위치에 '가'라는 한 글자가 표시되어 있는 것이다.

 

이 유니코드를 컴퓨터에 저장할 때는 encoding(인코딩)이라는 과정을 거치는데, 컴퓨터가 이해하는 bit라는 이진수로 바꾸는 작업이다. UTF-16은 이 인코딩 작업을 16bit로 처리한다는 뜻이다.

컴퓨터는 char타입을 인코딩한 후 다시 사람이 알 수 있는 숫자(십진법)로 표현할 때는 int타입으로 나타내도록 만들어져 있다. char은 16비트 크기이고 int는 32비트 크기이므로 char를 int타입으로 암시적 변환이 가능한 것이다.

 

또한 char타입을 연산하더라도 각 문자의 값을 계산하여 결과를 int타입으로 보여준다.

 

예를 들어 위와 같은 코드를 실행하면 다음과 같은 결과가 나올 것이다.

즉, 44032 + 45208 을 더한 값을 보여주게 된다. 

 

참고로 같은 문자를 표현하는 타입인 string타입은 위와 같이 int로 암시적 변환을 할 수 없다.

간단히 말하면 char타입은 값을 가지고 있는 value type(값 타입)이며 string타입은 문자열의 위치를 참조하는 reference type(참조 타입)이기 때문이다. 이 내용은 다음에 설명하도록 한다.

 

명시적(Explicit) 타입 변환

암시적 타입 변환의 반대이다.

강제적이라는 뜻으로 해석하면 된다.

다른 말로 casting(캐스팅)이라고 한다.

큰 타입을 작은 타입에 저장할 때를 말한다.

이 경우에는 캐스팅 연산자인 ( ) 괄호 안에 변환하려는 데이터 타입(자료형)을 적어서 명시적으로 알려줘야 한다.

 

long a = 1;

int b = (int) a;

 

위의 경우에는 변수a를 int타입으로 캐스팅 할 것임을 명시(분명히 알림) 해줘야 한다.

 

참고로 나중에 알아보겠지만 방금 언급한 타입은 value(값)타입의 경우이고, 참조형 타입(string, array, class)의 경우는 casting을 할 때 as 연산자를 사용한다.

 

 

끝.

Wraven...