본문 바로가기
C#을 같이 공부해보자!

C# 변수에 대해서 공부해보자!

by 코뭉2434 2021. 6. 5.
반응형

[ C# 유니티 기초 ] 제 2 화

 

[ 변수 ]

변수란 어떤 언어든 반드시 외워야 할 명령어인데, 여기서 변수란 데이터를 담아두기 위해서 할당하는 공간을 말한다.

변수는 여러가지 타입이 있으며, 그 타입에따라서 이름과 사용방법이 크게 달라진다. 또한, 그 값을 실시간으로 수정이 가능하기에 매우 복잡한 명령어이기도 하다.

 

[ 변수를 선언하는 방법 ]

변수는 프로그램을 코딩할 수 있는 비주얼 스튜디오같은 전문적인 프로그램에서 선언이 가능하다. 변수의 위치를 어디에 지정하느냐에 따라서 사용 방법이 크게 달라지는데, 클래스 앞에 선언하게 되면 모든 메소드에서 사용이 가능하고, 메소드안에서 선언하게 되면 그 메소드에서만 유효한 변수가 된다.

예를 들어서 int 라는 변수를 선언해 보도록 하자! int에 대해서는 나중에 자세히 다뤄보도록 하고, 지금은 정수형 타입 이라고만 알아두면 된다.

가장 기본적인 방식으로 변수를 선언해 보았다.

클래스 부분에서 main 이라는 정수형 변수(int)를 선언하고, 그 안에 1이라는 숫자를 지정해주었다.

Start에서는 main 의 숫자를 표기하라고 명령을 해두었다. 반드시 + 가 붙어야 하며, 선언된 변수가 표시될때는

"변수 선언 :  숫자 로 표기가 된다.

이것을 유니티에 적용을 시켜보면 " 변수 선언 = 1 " 이라고 출력이 된다.

여기서 주의할 점은, C# 스크립트를 수정하고나서 Main Camera 같은 오브젝트에 넣어줘야 정상적으로 출력이 된다.

[ 코무는 몰라서 여러번 시도한 것은 비밀... 쉿! ]

 

변수는 int 외에도 몇가지가 더 있고, 그것까지 다 외우려면 머리가 깨질수도 있다. 하지만 게임을 만들려면 반드시 외워야 하는 과정이므로, 머리가 깨지더라도 수십번 사용해서 머리에 익혀두도록 하자!

 

[ 유니티에서 사용되는 변수는? ]

알아보니까 유니티에 사용되는 전용 변수가 존재한다고 한다. 코무도 아직 거기까지는 공부하지 못해서 잘은 모르겠지만, 참고만 하라고 아래에 적어두도록 하겠다.

GameObject 게임의 오브젝트를 저장한다
Transform 오브젝트의 위치를 저장한다
Rigidbody 오브젝트의 물리엔진을 저장한다
Collider 충돌체(뼈대)의 정보를 저장한다.

GameObject는 게임을 만드는 강좌를 보았을때 자주 사용하는 변수다. Collider은 슈팅게임을 만들때 자주 들어가던 변수였다. 예를 들어서 적과 충돌할때나, 총알에 맞았을때 대미지를 부여하는 용도로 사용된다. 

GmaeObject는 총알을 양산하는데 사용되었는데, 메모리 풀? 이라고 했던가? 그거없이 사용하면 메모리 누수가 일어난다는 무서운 변수였다. 어떻게 사용하냐에 따라서 오브젝트를 처리하는가는 본인의 실력에 달려있다. 오브젝트는 총알 외에도 RPG에 몬스터나 지형같은 종류도 만들 수 있다. 하나당 어느정도의 메모리가 할당되므로 잘 생각하며 사용하자.

유니티의 변수는 정말로 복잡하기 때문에 책을보고 배우는 것이 빠르다. 인터넷에서 독학하는 것도 한계가 크기때문에 이런 설명보다는 직접 책을보고 찾아보는 것이 좋다.

 

[ 변수의 참조란? ]

참조란 그 값을 가져와서 저장하는 방식인데, 예를들어서 A 에서 1이라는 숫자를 저장하고, B에서 A의 갑을 참조하라면 B의 값은 1으로 된다. 여기서 B값을 2라고 저장한 후에 A의 값을 요구하면 1이 나온다. 

이유는 A보고 B를 참조하라고 명령을 하지 않았으므로, A의 값이 변할리가 없다. 그렇기에 A = 1 , B = 2 라고 출력이 된다. 설명이 어렵다면 아래의 소스를 확인하면서 읽어보자!

동시에 두개의 변수를 출력하도록 만들었다. Debug.Log를 기준으로 명령이 달라진다. 잘 읽어보고 본인이 직접 참조값을 만들어 보자!

유니티의 값은 이렇게 출력되면 정상이다. A와 B가 1로 출력되어야 한다. 

변수를 선언하면서 많이 실수하는 [ ; ] 를 잊지말고 입력하도록 하자! 스크립트 에러가 발생하면 ; 가 빠져있는 경우가 대부분이다.

 

[ 변수를 선언할 수 있는 범위는 어디까지인가? ]

강좌를 시작하기전에 언급했지만 변수를 어디에서 선언하냐에 따라서 사용 용도가 크게 달라진다. 아래의 사진을 보면서 배우는 것이 가장 빠르므로, 사진을 보면서 설명을 보기 바란다.

예를들어서 위와같은 스크립트를 작성했다고 하자! 

사진을 보면 빨간색 상자와 초록색 상자가 있는데, 이것은 변수외에도 적용이 가능한 범위를 설명한 것이다. 붉은색 상자는 클래스에서 선언한 것이라서 Start 와 Update 모드 변수를 불러올 수 있다. 

두번째는 초록색 상자인데, 이것은 메소드의 범위를 나타낸다. Start를 보면 변수 B를 선언해 두었는데, 이것은 Start 메소드 내부에서만 사용이 가능한 변수이다.

Update는 A와 B값을 출력하라고 Debug.Log를 이용해서 명령을 해두었는데, 당연히 오류가 날수밖에없다. 왜냐하면 B라는 변수를 찾을 수 없으므로, 출력이 불가능하기에 출력을 할수 없다고 오류가 발생하게 된다.

실제로 유니티에 적용을 해보면 error CS0103이 발생하는 것을 확인할 수 있다. 당연한 결과이다.

이 오류를 고치기 위해서는 같은 메소드 내부에 변수를 선언하거나, 클래스 전체에 변수를 선언해야 한다.

 

정리를 해보자면 변수는 사용할 수 있는 범위가 있으므로, 본인이 사용해야 할 변수가 있다면 이름이 중복되지 않게 잘 사용하자.

 

[ 변수를 비공개로 바꿀수 있다고? ]

변수를 선언하기 전에 메소드 자체에서 외부 수정을 금지할 수 있다. 가장 자주 사용되는 [ Public , Private ] 인데, 쉽게 설명하자면, Public는 어디서는 간섭하여서 그 값을 수정할 수 있다. 반대로 Private는 그 메소드 내부에서만 값을 변경할 수 있다. 외부의 간섭은 받지 않는다는 말이다.

Private를 이렇게 말하면 상당히 어려운데, 예를들어서 게임의 조작키를 설정한다고 하자!

그런데, 게임의 조작키는 값으 간섭을 받으면 안되는 절대적인 영영이지 않은가? 그렇기에 Private의 메소드를 만들어두고, 그 안에서만 조작이 가능하게 키를 추가해두면 좋다. 어디까지나 예를 들어서다.

 

물론 변수에서도 선언이 가능하다. 예를 들어서 만든 아래의 스크립트를 참조하도록 하자!

예를들어서 클래스에 2가지의 정수형 변수를 선언하고 유니티에서 확인해보자! 만약 변경이 가능하다면 유니티 내부에서도 그 값을 수정할 수 있게된다.

당연하다. Ep라는 변수는 비공개이므로 목록에 나올리가 없다. 그렇지만 Op는 유니티 내부에서도 그 값을 수정할 수 있다. 그렇다고 이대로만 사용하면 뭔가 그렇지 않는가??

하지만 공개 비공개를 바꿀수 있는 명령어도 존재한다. 그것도 나중에 알아보도록 하ㅇ자!

 


[ 변수의 타입 ]

아래의 표는 변수를 선언했을때 사용하는 방법과 범위이다. 외우면 좋지만 그것은 어려운일이니 참고만 해두자

변수 범위
int -2147483648 ~ 2147483647
byte 0 ~ 255
sbyte -128 ~ 127
short -32768 ~ 32767
ushort 0 ~ 4294967295
long 9223372036854770000
ulong 18446744073709500000
float ~f
dobule ~m
bool true , false
string ""
char ""

 

반응형

'C#을 같이 공부해보자!' 카테고리의 다른 글

C# 기초 [ DeBug.Log ] 란?  (0) 2021.05.26

댓글