자료형
int varint = 10
float varfloat = 5.5f
string varstring = "문자열"
bool varbool = false
유니티에서 큰 수나 정밀한 소수 계산이 보통은 그렇게 중요하지 않아서 double이나 long은 잘 쓰지않는다.
문자열 연결과 문자열 보간이라는게 존재한다.
Debug.Log("--- 문자열 연결 ---");
Debug.Log("이건 문자열 연결이고 " + varint + " '+'를 사용해 " + nameof(varint) + "연결합니다.");
Debug.Log("--- 문자열 보간 ---");
Debug.Log($"이건 문자열 보간이고 {varint} <- 이건 보간 식을 사용한 변수 {nameof(varint)}입니다.");
nameof(varint)은 varint의 변수명 자체를 반환한다.

문자열 보간이 더 최신 방식이기도 하고 가독성이나 편리성에서 더 좋아 문자열 보간이 선호된다.
정적 배열
string[] monster = {"Alpha", "Beta", "Gamma"}
monster[0] ~ monster[monster.Length-1]
int[] monsterLevel = new int[3]
monsterLevel[0] ~ monsterLevel[monsterLevel.Length-1]
.Length
동적 배열
List<string> items = new List<string>();
items.Add("체력포션Tier3");
items.Add("마나포션Tier3");
Debug.Log($"가지고 있는 아이템");
Debug.Log(items[0]);
Debug.Log(items[1]);
Debug.Log(items.Count);
items.RemoveAt(0);
Debug.Log($"가지고 있는 아이템");
Debug.Log(items[0]);
Debug.Log(items.Count);

RemoveAt(index)는 items[index]를 제거하며 index의 뒤쪽은 모두 한칸씩 당겨진다.
예시 코드에선 items[0]이던 체력포션Tier3이 삭제되어서 items[1]이던 마나포션Tier3이 items[0]이 되었고 items[1]은 배열의 인덱스를 초과해버려 에러를 뿜는다.
속성 Count는 배열의 현재 요소 개수를 가져온다.

items[0] ~ items[items.Count-1]
.Count
산술 연산자 (Arithmetic Operators)
+ 덧셈
- 뺄셈
* 곱셈
/ 나눗셈
% 모듈로
증감 연산자
전위 증감 연산자
++A A에 1을 전위 증가 한다.
--A A에 1을 전위 감소 한다.
후위 증감 연산자
A++ A에 1을 후위 증가 한다.
A-- A에 1을 후위 감소 한다.
전위와 후위는 그 라인을 실행할 때 먼저 계산하고 라인을 실행하느냐, 라인을 실행하고 계산을 하느냐 차이이다.
int A = 0;
Debug.Log(++A);
Debug.Log(A++);
Debug.Log(A);
여기선 1 1 2가 출력된다. 첫번째 Log는 ++A가 실행되고 출력이 되서 1. 두번째 Log는 A가 출력되고 A++이 된다. 그래서 마지막에만 2가 된다.
int A = 0;
Debug.Log(A++);
Debug.Log(++A);
Debug.Log(A);
여기선 0 2 2가 출력된다.
대입 연산자 (Assignment Operators)
A = B A에 B를 대입한다.
A += B 는 A = A + B 와 같다. 간단하게 A에 B를 더한다는 뜻.
A -= B 는 A = A - B 와 같다. 간단하게 A에 B를 뺀다는 뜻.
A *= B 는 A = A * B 와 같다. 간단하게 A에 B를 곱한다는 뜻.
A /= B 는 A = A / B 와 같다. 간단하게 A에 B를 나눈다는 뜻.
A %= B 는 A = A % B 와 같다. 간단하게 A를 B로 나눈 나머지라는 뜻.
비교 연산자 (Comparison Operators)
비교 연산자는 참이면 true, 거짓이면 false를 반환한다.
A > B A는 B보다 크다.
A >= B A는 B보다 크거나 같다.
A < B A는 B보다 작다.
A <= B A는 B보다 작거나 같다.
A == B A와 B는 같다.
A != B A와 B는 같지 않다.

Log에선 대문자로 나오지만 코드에서는 소문자로 써야한다.
C나 C++에선 true와 false를 각각 1과 0으로 반환하지만 C#에선 제대로 true false를 구분한다.
C++에선 대놓고 이렇게 bool형과 int형을 비교해도 같다고 한다.
if(isGround == (int)1) cout << "ㅇㅇ";
하지만 C#에선

타입이 다르면 비교 자체가 불가능하다. bool == bool은 가능하다.
논리 연산자 (Logical Operators)
A && B AND 논리곱 연산자. A와 B가 참일 때만 true를 반환한다.
A || B OR 논리합 연산자. A와 B 둘 중 하나라도 참일 때만 true를 반환한다.
!A NOT 부정 연산자. A가 참이면 false, A가 거짓이면 true를 반환한다.
비트 연산자 (Bitwise Operators)
이진법에 대한 이해가 필요함.
비트 연산은 unsigned에서만 하는걸 권장됨
A << B 왼쪽 시프트 연산자.
비트를 왼쪽으로 B만큼 이동시키며 빈 비트에 부호 비트를 채워 넣는다.
최종적으로 를 반환한다.
A >> B 오른쪽 시프트 연산자.
비트를 오른쪽으로 B만큼 이동시키며 빈 비트에 부호 비트를 채워 넣는다.
최종적으로 를 반환한다.
A & B 비트 논리곱 연산자.
A와 B의 비트를 비교해 두 비트 모두 1이면 1, 아니면 0을 채워 넣어 결과를 출력한다.
ex) 9 & 10의 경우, 9 = 1001(2), 10 = 1010(2) => 1000(2) = 8
A | B 비트 논리합 연산자.
A와 B의 비트를 비교해 두 비트 중 하나라도 1이면 1, 아니면 0을 채워 넣어 결과를 출력한다.
ex) 9 & 10의 경우, 9 = 1001(2), 10 = 1010(2) => 1011(2) = 11
A ^ B 비트 배타적 논리합 연산자.
A와 B의 비트를 비교해 두 비트가 서로 다르면 1, 서로 같으면 0을 채워 넣어 결과를 출력한다.
ex1) 9 & 10의 경우, 9 = 1001(2), 10 = 1010(2) => 0011(2) = 3
ex2) 3 & 3의 경우, 3 = 0011(2), 3 = 0011(2) => 0000(2) = 0
ex3) 9 & 6의 경우, 9 = 1001(2), 6 = 0110(2) => 1111(2) = 15
~A 비트 보수 연산자.
A의 1의 보수를 반환한다. 모든 비트를 반전시킨다.
여기서 문제는 signed 자료형과 unsigned 자료형의 차이를 잘 알아야 한다는 것이다.
signed 자료형은 부호를 구현하기 위해 부호 비트를 사용한다.
비트 보수 연산자는 부호 비트까지 뒤집어 버린다. 단, 정수 미만(32비트 미만)은 내부적으로 정수 승격을 통해 강제적으로 signed int로 바뀐다.
ex1) signed char A = 57일 때, 0011 1001(2) => 1100 0110(2) = -58
ex2) unsigned char A = 57일 때, 0011 1001(2) => 1100 0110(2) = -58
ex4) signed int A = 1000000007일 때, -1000000008
ex4) unsigned int A = 1000000007일 때, 3294967288
추가로 비트 연산자는 자료형이 맞지 않아 비트 수가 다르면 암시적 형변환해준다.
키워드(예약어)란?
예약어(Reserved Word)라고도 하며, 컴파일러가 특별한 의미와 기능을 가지도록 정해놓은 단어들이며 변수명이나 함수명으로 사용 불가능하다.
if
if (A > B) // bool값을 반환하는 식이 있어야함.
{
Debug.Log("A가 B보다 큽니다.");
}
else if (A < B)
{
Debug.Log("A가 B보다 작습니다.");
}
else
{
Debug.Log("A가 B보다 크지도 않고 작지도 않습니다(A와 B가 같습니다).");
}
switch
switch (switchTest[0]) // bool값을 반환하는 식 보다는 변수 자체가 있어야함.
{
case "Alpha": // if (switchTest[0] == "Alpha")
Debug.Log("First");
break;
case "Beta":
Debug.Log("Second");
break;
case "Gamma":
case "Delta":
Debug.Log("Third");
break;
default:
Debug.Log("Others");
break;
}
case:, default: 와 break;는 반드시 세트
while
int condition = 10;
while(condition) // 조건식이 거짓이 될 때까지 실행
{
Debug.Log(condition);
condition--;
}
10부터 1까지 출력한다. condition = 1일때 while문에 진입하면 나올때 condition--로 condition이 0이 되므로 더이상 반복하지 않는다.
while문은 조건식이 거짓이 될 때까지 실행하므로 반복문 내부에서 언젠가 조건식이 false가 되어야한다. 그렇지 않으면 무한루프에 빠진다.
for
for문은 보는게 빠르다.
for(int i=0;i<10;i++)
{
Debug.Log(i);
}
0부터 9까지 출력한다.
for문에서 직접 변수를 선언해서 지역변수로 사용할 수도 있고, 다른 변수를 가져와도 된다. 단, 무한루프에 빠지지 않도록 조건과 증감 연산자를 잘 써야하겠다.
foreach
순회형 for문
배열과 같은 그룹형 변수의 모든 원소를 순회할 때 사용된다.
foreach(자료형 var in 배열) // var은 아무거나
{
Debug.Log(var);
}
var(아무거나 써도 되는 임시로 쓰는 지역변수명)에 (자료형 배열(ex string namePlayer))을 index 0부터 끝까지 넣어서 반복한다.
지역변수와 멤버변수
지역변수 : 함수 내부에서 선언된 변수로 함수를 나오면 사라짐
멤버변수 : 클래스 내부에서 선언된 변수로 다른 클래스에서도 쓸 수 있음.
매개변수
매개변수를 받아와서 함수에서 처리한다.
매개변수는 기본값을 설정 가능하며, 매개변수를 넣지 않으면 기본값으로 작동한다.
반환타입
void : 반환값이 없음. return;으로 종료.
void Heal()
{
health += 10;
Debug.Log("포션을 마셨습니다!");
return;
}
string, int 등등의 반환값이 있는 함수
string Battle(int monsterLevel = 10)
{
string result;
if(level >= monsterLevel)
result = "이겼습니다.";
else
result = "졌습니다.";
return result;
}
Debug.Log($"전투결과 : {Battle(10)}");
하나의 객체와 대응하는 것
A 클래스에서 B 클래스의 멤버 변수들을 사용 가능하다.
B.var 과 같이 불러올 수 있음.
인스턴스화
B b = new B();
접근제한자
public과 private
접근제한자를 걸지 않으면 기본적으로 private
클래스는 내용 보충 필요