02강) C# 프로그래밍 기초1 |
사실 지난 시간에 "다음 시간에는 ... 씬을 생성하고 비행기까지 생성하여 움직이는 것을 ..." 이라고 말했었습니다.
그런데 생각해보니 "비행기 움직이는 것"은 C#을 이용하여 프로그래밍을 해야하기 때문에 먼저 C# 프로그래밍 기초에 대해서 알아봐야 할 것 같아서 단원을 바꾸었습니다.
왜 C#인가? |
유니티에서 주로 사용하는 언어는 "자바스크립트"와 "C#" 입니다.
그런데 필자는 왜 C#을 이용하여 하려는 걸까요?
첫번째 이유는 저는 자바스크립트를 잘 모릅니다. 두번째 이유는 저는 C#을 어느정도는 압니다. 세번째 이유는 자바스크립트로 작성을 하게 되면 결국엔 기술적인 측면에서 C#으로 다시 오게 된다고 하더군요. (유니티 게임 개발자들의 말) 네번째 이유는 C#이 조금 더 빠릅니다. |
뭐 이정도라고는 하지만 "자바스크립트"가 "C#"보다는 처음 언어를 접하는 입장에서는 더 쉽게 배울수 있습니다만 저는 여러분께 C#을 이용해서 알려드릴 겁니다.
C#) 변수와 자료형 |
모든 프로그래밍 언어에서 처음 접하는 말인 "변수"와 "자료형"입니다.
변수란? |
자료형에 맞는 값을 저장할 수 있는 메모리 공간에 붙여진 이름!! 변수를 선언하면 메모리 공간이 자료형에 맞게 할당되고 할당된 메모리 공간에 이름이 붙는다!! |
자료형이란? |
데이터를 표현하는 방식!! (실수형, 정수형, 문자형) |
이렇게 설명드려도 이해를 못하시는게 당연할지도 모릅니다.
그럼 간단하게 예를 들어보며 맞추어 가봅시다.
농부가(프로그래머) 밭을 열심히 가꾸어 드디어 수확시기가 되었습니다. 총 3가지를 심었는데 감자(자료형1), 고구마(자료형2), 그리고 당근(자료형3)을 심었습니다. 열심히 수확을 마치고, 각각의 전용 박스를 만들어서(변수) 거기에 담기로 했습니다. |
위의 상황을 변수와 자료형으로 나타내어 봅시다.
사용된 자료형 : 감자, 고구마, 당근 선언된 변수 : 감자박스, 고구마박스, 당근박스 |
이렇게 되었죠.
각각의 야채들을 표현하는 방식으로 "감자, 고구마, 당근"이 되어 이것들을 자료형이라고 합니다.
그리고 이 자료형들에 맞게 만들어진 박스 "감자박스, 고구마박스, 당근박스"를 변수라고 합니다.
어느정도 이해가 가셨으면 좋겠습니다.....
이제 이 자료형의 종류에 대해서 알아보도록 하겠습니다.
C#의 모든 자료형을 보는 것이 아닌 유니티에서 많이 사용하는 자료형만 보겠습니다.
분류 | 자료형 | 크기(바이트) | 기본값 | 저장 값의 범위 | 유효숫자 |
정수
| byte | 1 | 0 | 0 ~ 255 |
|
short | 2 | 0 | -32,768 ~ 32,767 |
| |
int | 4 | 0 | -2,147,483,648 ~ 2,147,483,647 |
| |
실수 | float | 4 | 0.0F | -1.5e-45 ~ 3.4e38 | 7자리 |
논리 | bool |
| false | false, true |
|
문자 | char | 2 | '\0' | U+0000 ~ U+FFFF |
|
문자열 | string |
| char형의 배열형 모임 |
|
|
(더 배우고 싶다면? : Microsoft MSDN)
(float 에서 F를 붙인 이유는 F를 붙이지 않으면 double형으로 자동 캐스팅이 되버립니다.)
말 그대로 정수는 정수를 표현합니다.
그리고 실수는 실수를 표현하죠(소수점 계산).
그런데 논리는 무엇이냐!!! 바로 참(true), 거짓(false) 두가지만 표현하는 자료형입니다.
문자는 "문자 하나"만 표현하는 것이고
문자열은 "문자 여러개"를 표현하는 것입니다.
그런데 왜 같은 분류에서 여러개의 자료형으로 나누어지는 건가요? |
위의 자료형 표를 보시면 "저장 값의 범위"가 서로 다른 것을 볼 수 있습니다. 정말로 내가 표현하고 싶은 변수의 값은 1~10까지만 사용한다면 byte를 쓰면 되지만 10~500까지 사용하는데 저장 값의 범위가 넘어서는 byte를 사용하면 안됩니다. 그리고 중요한 건 저장 값의 범위만큼 메모리를 먹습니다. |
C#) 변수 선언해보기 |
변수와 자료형에 대해서 알아보았으니 이제 직접 사용해봅시다.
지난번에 만든 테스트용 프로젝트를 열어봅시다.
Project 구간에 스크립트를 저장할 폴더를 하나 만들어봅시다.
Project에서 Assets에서 "오른쪽 클릭 → Create → Folder" 를 선택하여
자신이 원하는 이름을 넣어 만듭니다.
그리고 만들어진 폴더를 클릭하여 폴더로 들어가서
"Create → C# Script"를 선택하여 스크립트를 생성하고
자신이 원하는 이름을 붙입니다.
이렇게 만들어진 스크립트파일을 한번 선택하면
Inspector에 현재 스크립트에 작성된 것들이 보입니다.
이제 이 스크립트를 더블클릭하여 편집해봅시다.
Visual Studio 2015가 깔려있는 경우 |
VS2015가 깔려있는 경우에는 VS로 열리게 될겁니다.
(필자도 VS 2015를 이용하여 할겁니다.)
Visual Studio 2015가 깔려있지 않은 경우 |
기본 내장 에디터인 "모노디벨롶"이 열리게 될겁니다.
"VS"를 사용하건, "Mono"를 사용하건 똑같습니다.
그냥 열심히 작성만 하면 됩니다.
이제 아까 배운 변수들을 이용하여 작성하여 봅시다.
변수 선언하는 방법!! |
[첫번째 방법] 자료형 변수이름; → int num; [두번째 방법] 자료형 변수이름 = 초기화값; → int num = 20; [같은 형의 변수 여러개 선언] 자료형 변수이름1, 변수이름2, ... , 변수이름n; → int num1, num2, num3; [같은 형의 변수 여러개 선언 및 초기화] 자료형 변수이름1 = 초기화값, ... , 변수이름n = 초기화값; → int num1 = 20, num2 = 3; |
이제 스크립트를 똑같이 작성하여 봅시다.
작성 전에 주의점!!! |
꼭 파일 이름과 class 옆의 이름은 같아야 합니다.
제가 스크립트 예제에서 class 옆부분의 이름을 본인과 다르게 쓴다고 하더라도 본인은 본인의 파일이름을 사용하세요!!
이제 진짜로 스크립트를 똑같이 작성하여 봅시다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestScript : MonoBehaviour { // ← 이 표시는 주석으로 프로그램에 영향을 주지 않는 메모같은 것입니다. byte byte_num; // byte형 변수 short short_num; // short형 변수 int int_num; // int형 변수 float float_num; // float형 변수 bool bool_var; // bool형 변수 char char_var; // char형 변수 string string_var; // string형 변수 // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
7번줄부터 13번줄을 추가했는데요.
위에서 표로 배운 자료형을 변수로 만들어 줬습니다.
이렇게 변수로 처음 만들어주는 행위를 변수 선언이라고 합니다.
변수 이름을 정하는 규칙!! |
변수 이름은 아래의 규칙을 따라서 원하는대로 정하면 됩니다. 1. 알파벳, 숫자, 언더바(_)를 사용한다. 2. C#은 소문자, 대문자를 구별한다. 3. 변수의 이름은 숫자로 시작할 수 없고, "키워드"도 변수 이름으로 사용이 불가능하다. 4. 이름사이의 공백(띄어쓰기)는 불가능 하다. 5. 변수의 이름은 고유해야한다.(중복 불가능) 그래서 띄어쓰기는 언더바로 표시!! 키워드는 미리 지정되어 있는 말을 뜻합니다. (return, int, double, float등등) 키워드는 불가능 하지만 키워드에 어떤 단어같은걸 추가해서 사용하는건 됩니다. double(X), double_var(O) |
이제 각각의 변수에 자신의 자료형에 맞는 값들을 집어넣어 줍시다.
아까 비어었던 16번줄의 void Start()에 다음과 같이 초기화합니다.
void Start () { byte_num = 255; short_num = 32767; int_num = 2147483647; float_num = 3.14159F; bool_var = true; char_var = 'A'; string_var = "C#은 처음이지?"; }
방금 "초기화"라는 말을 사용했는데
변수에 처음 값을 넣는 행위를 초기화라고 합니다.
void Start() 메소드 |
void Start() 메소드는 해당 스크립트를 사용하는 객체가 처음 생성됬을 때 단 한번 실행되는 메소드!! 메소드는 하나의 소스 뭉치라고 생각하시면 편합니다. |
위와 같이 선언을 하면 지금 만들고 있는 스크립트를 사용하는 어떤 객체가 처음 생성될 때 자동으로 딱 한번 실행되게 되죠.
이제 위의 값을 출력하여 봅시다.
위의 void Start() 메소드에 이어서 적어봅시다.
void Start () { byte_num = 255; short_num = 32767; int_num = 2147483647; float_num = 3.14159F; bool_var = true; char_var = 'A'; string_var = "C#은 처음이지?"; Debug.Log("byte_num : " + byte_num); Debug.Log("short_num : " + short_num); Debug.Log("int_num : " + int_num); Debug.Log("float_num : " + float_num); Debug.Log("bool_var : " + bool_var); Debug.Log("char_var : " + char_var); Debug.Log("string_var : " + string_var); }
새로운 것이 또 등장했습니다.
바로 Debug죠.
Debug.Log() 메소드 |
Debug.Log는 괄호안에 들어간 내용을 유니티엔진의 콘솔창에 띄워줍니다. (유니티 콘솔 창) |
이제 만든 코드를 저장합니다.
(Ctrl + S)
그리고 유니티로 돌아와서 스크립트를 클릭하면
이렇게 작성이 된 것을 볼 수 있습니다.
이제 한번 사용해봅시다.
만들어진 스크립트 파일을
위의 사진처럼 카메라에 드래그하여 넣습니다.
그러면 카메라에 해당 스크립트가 들어가게 됩니다.
이제 상단의 실행버튼
을 눌러서 게임을 실행시켜봅시다.
상단의 실행버튼이 "파란색"으로 바뀌면 게임이 진행중이라는 겁니다.
여기서 실행버튼을 한번 더 누르면 게임은 종료가 되죠.
진행중인 상황인데 뭔가 바뀐게 보이지 않나요?
바로 왼쪽 하단부에 뭔가가 나오게 됩니다.
이렇게 말이죠.
그럼 이걸 클릭해봅시다.
이렇게 콘솔창이 뜨게 되는데 아까 우리가 쓴 "Debug.Log"로 인해서 결과가 나오게 되는 것이죠.
C#) 사칙연산 해보기 |
이제 사칙연산을 해봅시다.
그 전에!!
컴퓨터 에서 "=" 이 부등호는 다음과 같이 인식을 합니다.
A = B A는 B이다. C = 5 C는 5다. |
즉, 서로를 같다고 보는 것이 아닌!! 오른쪽의 값을 왼쪽에 대입하는 것으로 받아들이는 것이죠.
그럼 현실세계의 부등호와 같은 뜻을 가진 연산자는 없을까요?
A == B A와 B같다. C == 5 C의 값은 5와 같다. |
바로 "==" 부등호 2개를 이어주는게 현실세계의 부등호입니다.
이제 아까의 스크립트로 돌아가서 다음과 같이 작성해봅시다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestScript : MonoBehaviour { int num1, num2, result; void Start () { num1 = 5; num2 = 7; result = num1 + num2; Debug.Log("더하기 : " + result); result = num1 - num2; Debug.Log("빼기 : " + result); result = num1 * num2; Debug.Log("곱하기 : " + result); result = num1 / num2; Debug.Log("나누기 : " + result); } }
6번 줄에서 int형 변수 3개를 선언해줬습니다.
그리고 10~11번줄에서 num1과 num2에 각각 5와 7로 초기화를 시켜주고
각각의 연산을 보여주기 전에 result에 연산을 한 값을 넣어주었습니다.
(즉, 한 번 선언된 변수에 값을 원할때마다 변경할 수 있다는 점!!)
스크립트를 저장하고 유니티로 돌아와서 실행시키고 콘솔창을 보면
이렇게 출력되는 것을 볼 수 있습니다.
C#) 복합 대입 연산자와 증감연산 |
복합 대입 연산자는 다음과 같은 것을 말합니다.
복합 대입 연산자 | 복합 대입 연산자의 뜻 | 예제 |
a += b | a = a + b | a = 1, b = 2; a = a(1) + b(2) |
a -= b | a = a - b | a = 1, b = 2; a = a(1) - b(2) |
a *= b | a = a * b | a = 1, b = 2; a = a(1) * b(2) |
a /= b | a = a / b | a = 1, b = 2; a = a(1) / b(2) |
a %= b | a = a % b | a = 1, b = 2; a = a(1) % b(2) |
처음 보기에는 "복잡연산자"라고 느끼실 수 있겠지만 정말 편한 연산자 입니다.
a = 5, b = 6; 이라고 선언을 했다고 하면 a += b; 는 a = a + b; 로 인식되고 a = 5 + 6; 으로 인식되어 a는 11이 됩니다. |
복합 대입 연산자 주의점!! |
이제 증감 연산을 봅시다.
연산자 | 연산자의 기능 | 결합 방향 |
++num | 값을 1 증가 후, 속한 문장의 나머지를 진행(선 증가, 후 연산 → 전위증가) val = ++num; | ← |
num++ | 속한 문장을 먼저 진행 후, 값을 1 증가(선 연산, 후 증가 → 후위증가) val = num++; | ← |
--num | 값을 1 감소 후, 속한 문장의 나머지를 진행(선 감소, 후 연산 → 전위감소) val = --num; | ← |
num-- | 속한 문장을 먼저 진행 후, 값을 1 감소(선 연산, 후 감소 → 후위감소) val = num--; | ← |
이건 예제를 봐야 이해가 갈겁니다.
이제 예제를 보면서 익혀봅시다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestScript : MonoBehaviour { int a, b; int num1, num2; void Start () { a = 5; b = 7; a += b; Debug.Log("a+=b : " + a); a -= b; Debug.Log("a-=b : " + a); b *= a; Debug.Log("b*=a : " + b); b /= a; Debug.Log("b/=a : " + b); num1 = 4; num2 = 8; Debug.Log("num1 : " + num1); Debug.Log("num1++ : " + num1++); Debug.Log("num1 : " + num1); Debug.Log("++num1 : " + ++num1); Debug.Log("num1 : " + num1); Debug.Log("num2 : " + num2); Debug.Log("num2-- : " + num2--); Debug.Log("num2 : " + num2); Debug.Log("--num2 : " + --num2); Debug.Log("num2 : " + num2); } }
이렇게 작성을 하고 실행시키면
이렇게 결과가 나오게 됩니다.
이 결과값을 보면서 위의 설명을 보면 이해가 가실겁니다.
2편에서 봐요 |
기초인데 왜이렇게 많나 싶을겁니다.
C#을 정식으로 배우면 짧으면 4~6개월 정도 배워야 기본이 잡힙니다.
다른 언어도 다 마찬가지 입니다.
엄청 많은 것중에서 자주쓰이고 중요한 것들만 추려도 이렇게 많죠.
하지만 이 기초를 모르시면 나중에 따라오기가 굉장히 힘들겁니다.
꼭 기초를 탄탄히 하시길!!
2편에서 뵙죠.