티스토리 뷰

FrontEnd 마이닝/Unity

[유니티 C# 기초 강의] 2. 변수

광부 금광캐는광부 2016.07.23 15:21


이 글은 PC 버전 TISTORY에 최적화 되어있습니다.


서론

 C# 뿐 아니라 변수는 모든 언어에서 핵심적인 개념입니다. 플레이어의 이름, HP, 위치, 방향 등의 많은 종류의 정보를 취급할 때 변수가 필요합니다. 즉 각 데이터마다 다른 단위를 지니므로 변수가 여러개 필요합니다. 이름은 'Tom', 'Jane', 'Jerry' 와 같이 문자열이고, HP는 '10', '50', '100'과 같은 정수형이죠. C# 프로그래밍에 빠질래야 빠질 수가 없는 변수에 대해 알아보도록 하겠습니다.







변수란?


데이터를 담아두기 위한 상자
이름 그대로 프로그램 진행 중에 값이 변할 수 있다는 뜻

변수는 프로그램의 흐름에 따라 값이 변하기 때문에 이름을 지정해서 사용합니다. 아무때나 변하는 것은 아니고 오브젝트 인스펙터에서 값을 수정하거나, 호출을 통해서 변하는 것입니다. 




변수의 선언





변수의 선언은 위와 같이 변수 안에 넣을 데이터의 타입 + 변수명으로 합니다.

여기서 int는 정수형 타입으로 정수형 데이터만 넣을 수 있음을 의미합니다.








변수 이름 규칙


1. 영문과 숫자를 이용해 작성해야하고, 숫자로 시작하는 변수명은 불가능합니다.
2. 공백이나 특수 문자 사용 불가, 언더바( _ ) 사용은 가능합니다.
3. 유니티 C# 키워드는 사용 불가하고, 이미 선언한 변수명을 중복 선언할 수 없습니다.






C#의 데이터 타입




변수가 선언된 타입에 따라 어떤 데이터를 저장할 것인지 지정합니다.

데이터 타입이 다른 값을 변수에 저장하면 에러가 발생합니다.

C#엔 더 많은 데이터 타입이 있지만 유니티에서는 위 4가지가 가장 많이 쓰입니다.










위와 같이 타입에 알맞게 데이터를 넣어주면됩니다.







유니티 만의 데이터 타입



유니티에는 유니티만의 독특한 타입이 있습니다. 위와 같은 타입인데요.


GameObject : 게임의 오브젝트 저장

Transform : 오브젝트의 위치정보를 저장

Rigidbody : 오브젝트의 물리엔진 정보를 저장

Collider : 충돌체의 정보를 저장합니다.








 GameObject 타입에 대해 설명하도록 하겠습니다. C# 데이터 타입의 사용법과는 조금 다르게'참조' 방식을 사용하는데, GameObject가 생성되면 메모리의 어떠한 주소에 Object가 할당됩니다.그리고 GameObject 타입에 주소 값을 찾아서 넣어주는데 이를 참조라고 합니다.참조라는 것은 4개의 파일이 생성되는 것이 아닌, 하나의 파일에 4개의 변수가 참조하는 것입니다. 









값 형식  VS 참조 형식


위에서 설명한 C#의 데이터 타입과 유니티의 데이터 타입을 보듯이 두 개의 데이터 타입은 무엇인가 다르게 작동합니다. 전자를 값 형식, 후자를 참조 형식이라고 표현하는데, 이번엔 값 형식과, 참조 형식의 동작 차이를 비교해 보도록 하겠습니다.




참조 형식




참조 형식은 위와 같이 하나의 오브젝트에 여럿이 참조하게 됩니다.









 위의 코드처럼 monster1의 이름을  (name은 MonoBehavior 클래스를 상속했으므로 사용 가능합니다. 뒤에 설명하도록 하겠습니다.) Troll로 바꾸고 monster1 과 monster2의 이름을 출력하게 되면 어떻게 될까요?











monster1 은 Troll로 나오게 됩니다. 또한 monster2도 같은 객체를 참조하므로 Troll로 출력되게 됩니다.










값 형식





값 형식은 참조형식과 다르게 동작합니다. 참조의 개념으로 위의 결과를 생각하면 num2는 num1의 주소를 참조하므로 num1의 출력결과는 20일 것 같지만, num2는 단순히 num1의 값을 가져와서 저장하므로 num2에 값을 저장하는 것이 num1에 영향을 미치지 못합니다. 결국 num1의 출력 결과는 10인 것이죠.









변수의 사용 범위





기본적으로 변수를 선언하면 private가 숨겨져있습니다. 위의 myAge는 private int myAge = 10;과 같은 의미입니다. private로 선언된 변수는 선언된 클래스 어디서든 접근할 수 있는 특징을 가지고 있습니다. Start 메소드, Update 메소드 모두 같은 클래스에 속해있으므로 myAge는 물론 접근 가능한 것입니다.












어떠한 메소드나 블록 안에 선언된 변수는 지역 변수라고 불리며 그 블록 안에서만 사용 가능합니다.








Public과 Private 변수의 차이점


Private 로 선언된 변수는 해당 변수가 작성된 클래스에서만 사용 가능합니다. 하지만 때론 클래스 밖에서 변수를 참조하거나, 바꿔야하는 경우가 있습니다. 이런 경우 public 으로 선언하게 되면 인스펙터의 스크립트 위치에 public으로 선언된 변수들이 나타나게 되고, 값을 바꿀 수도 있습니다. 인스펙터에서 바꾼 값이 스크립트 내에 할당된 값보다 높은 우선순위를 가지게 됩니다.







위와 같이 public, private로 선언하고 인스펙터 창을 보도록 합시다.










보시면 public으로 선언한 mySpeed만 보입니다. 이 값을 바꾸면 어떤 값이 출력될까요?










보시다시피 인스펙터 창에 입력한 값이 우선되어 출력하는 것을 볼 수 있습니다.








Public과 Private 변수 표시







그렇다면 public은 항상 나타나고 private는 항상 안보일까요 아닙니다. HideInInspector를 이용하면 public 변수를 감출 수 있고, SerializeField를 이용하면 private 변수를 나타낼 수 있습니다. 









위와 같이 결과를 확인할 수 있습니다.







댓글
댓글쓰기 폼