| 자료형 | 크기 | 값 범위 |
|---|---|---|
sbyte | 1 byte | -128 ~ +127 |
byte | 1 byte | 0 ~ 255 |
short | 2 bytes | -32,768 ~ +32,767 |
ushort | 2 bytes | 0 ~ 65,535 |
int | 4 bytes | -2,147,483,648 ~ +2,147,483,647 |
uint | 4 bytes | 0 ~ 4,294,967,295 |
long | 8 bytes | -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 |
ulong | 8 bytes | 0 ~ 18,446,744,073,709,551,615 |
float | 4 bytes | ±1.5 × 10^-45 ~ ±3.4 × 10^38 |
double | 8 bytes | ±5.0 × 10^-324 ~ ±1.7 × 10^308 |
decimal | 16 bytes | ±1.0 × 10^-28 ~ ±7.9 × 10^28 (28~29 자릿수) |
char | 2 bytes | Unicode 0 ~ 65,535 |
bool | 1 byte(*) | true / false |
특정한 자료형이 표현할 수 있는 최댓값의 범위를 넘어서 연산을 수행하는 과정
오버플로우는 부호 없는 자료형에서도 똑같이 발생
✅ C#에서는 발생x
ex)
- sbyte 자료형은 1byte = 8 bit
- 범위는 -128 ~ +127
- 만약에 [01111111] = 127에서 1을 더하게 된다면?
- -> 넘어서서 -128이 됨 (부호비트가 음수가 된다)
ex)
- sbyte 자료형은 1byte = 8 bit
- 범위는 -128 ~ +127
- 만약에 [10000000] = -128에서 1을 뺀다면?
- -> 넘어서서 127이 됨 (부호비트가 양수가 된다)
원래의 short 범위 : -32768 ~ + 32767
ushort 범위 : 65535 ~ 0
ushort money = 65535;
Console.WriteLine(money);
결과값 : 65535;
최대값: 32,768 + 32,767 = 65535
최솟값: 0
sbyte : 부호 있는 자료형 (-128 ~ +127)
byte : 부호 없는 자료형 (0 ~ 255)
➡ byte의 경우도 부호가 없기 때문에 sbyte의 - 범위를 모두 합친 범위가 된다.
서로 다른 자료형을 가지고 있는 변수끼리 연산이 이루어 질 때 기존에 지정했던 자료형을 다른 자료형으로 변환하는 과정
➡ 크기가 더 큰 자료형이 작은 자료형을 담을 수 있다.
- 서로 다른 자료형으로 연산이 이루어질 때, 자료형의 크기가 큰 자료형으로 변환되는 과정
- int형과 long형이 연산하게 되면 암묵적 형 변환에 의해 크기가 더 큰 long타입으로 변수에만 담을 수 있게된다.
int a = 100; // 4바이트 long b = 100; // 8바이트 long sum = a + b;출력값 : 200
- 연산이 이루어지기 전에 사용자가 직접 자료형을 변환하는 과정
int attack = 10; int defense = 3; float damage = (float)attack / defense; Console.WriteLine("damage 변수의 값 : " + damage);출력값 : 3.333333
다양한 타입을 인자로 받을 수 있고, 다양한 타입으로 변환이 가능하다.
Convert.ToInt32(...); Convert.ToSingle(...); Convert.ToBoolean(...); Convert.ToString(...);string s = "123"; int n = Convert.ToInt32(s); // 결과: 123 bool isDead = true; int val = Convert.ToInt32(isDead); // 결과: 1 (false면 0) int n = 999; string s = Convert.ToString(n); // 결과: "999"
➡ 유니티의 UI에 숫자를 출력하기 위해 많이 사용해본 것이다.
➡ 실제 형변환은 아니고, 문자열로 표현할 수 있게 하는 함수이다.
❗ 형변환(캐스트)와는 다른 것!! ❗
int a = 100; string b = a.ToString(); print(b); // "100" 출력
➡ 입력받은 문자열을 원하는 자료형으로 변환할 수 있다. (문자숫자만 가능)
ex) 원하는 자료형.Parse(문자열);
int a; string b = "100"; a = int.Parse(b); // int a = 100 string b = "ddsfsdf"; // 일 경우 오류 발생
변환 실패해도 예외를 던지지 않고 false를 반환한다.
string s = "abc"; if (int.TryParse(s, out int result)) { Console.WriteLine(result); } else { Console.WriteLine("변환 실패"); }
실패 시 null을 반환한다. 참조형에서만 사용가능하다.
➡ class, interface
object obj = "hello"; string s = obj as string; // 성공 시 "hello", 실패 시 null유니티에서 사용할 때 아래와 같이 사용할 수 있다.
➡comp변수가SpriteRender타입이 맞다면sr에 할당한다. 즉, null이 아니게 된다.void Start() { Component comp = GetComponent<SpriteRenderer>(); // 안전한 캐스팅 SpriteRenderer sr = comp as SpriteRenderer; if (sr != null) { sr.color = Color.red; } }
변환은 하지않고, 타입 체크용으로 사용한다.
object obj = "hello"; if (obj is string s) { Console.WriteLine(s); // 형 확인 + 변환된 값 사용 }유니티에서 사용할 때 아래와 같이 사용할 수 있다.
void Start() { Component comp = GetComponent<SpriteRenderer>(); if (comp is SpriteRenderer) { Debug.Log("이 컴포넌트는 SpriteRenderer입니다."); } }