C언어에는 변수라는 것이 있다.
이 변수를 저장, 지정해 주려면 타입이 필요하다.
타입을 지정해 주는 이유는, 카테고리를 나눔으로서 효율적으로 프로그램을 만들 수 있기 때문이다.
컴퓨터는 자동이 아니다. 인간에게 말하듯이 "이런 느낌으로 해줘"라고 하면 아예 실행을 못한다.
인간에게는 사회생활을 한 경험과, 부모, 친구, 지인으로 부터 얻은 사회 전반적인 기본 틀이란 것을 무의식적으로 학습하고 뇌에 저장하며, 그것을 그때 그때 필요한 만큼 꺼내지만, 컴퓨터는 그러지 못하다.
때문에 우리가 어떠한 변수를 저장한다고 하면, 그 변수의 크기도 지정을 해줘야 한다.
예를 들어서. 인간의 몸무게에 대한 이야기를 하고 싶다.
그렇다면 인간의 몸무게에는 음수가 없다.
정말 특이한 케이스가 아니라면 200KG이상도 없을 것이다.
그러니 대충 1~200KG의 범위를 가진 숫자를 몸무게(변수) 라고 이름지어주자.
그렇다면 변수의 크기, 공간, 메모리도 그 정도 크기만 준비해주면 된다.
byte라는 타입이 0~255를 다루는 타입이다. 몸무게의 수치에 대한 이야기를 할 때는 byte를 쓰는게 좋을 것 같다.
만약 그런거 없이 그냥 큰걸 쓰고싶다 라고 하면 int를 써보자.
int의 범위는 32비트 정수 (-2,147,483,648 ~ 2,147,483,647)이다
몸무게 하나 변수로 지정하는데 (-2,147,483,648 ~ 2,147,483,647)나 쓰는건 정말 낭비이다.
물론 이 정도 한다고 프로그램 자체가 느려지진 않지만, 프로그램을 만들다 보면 이런걸 수십 수백 수천개를 써야 한다.
그런게 쌓이다 보면 흔히 말하는 최적화가 안된 게임처럼 되는거다.
그러니 각 타입을 전부 외워두자.
📌 C# 기본 데이터 타입 정리
| 분류 | 키워드 | 크기 | 범위 | 비고 |
| 정수형 | byte | 8비트 (1바이트) | 0 ~ 255 | 부호 없음 |
| 정수형 | sbyte | 8비트 | -128 ~ 127 | 부호 있음 |
| 정수형 | short | 16비트 (2바이트) | -32,768 ~ 32,767 | |
| 정수형 | ushort | 16비트 | 0 ~ 65,535 | 부호 없음 |
| 정수형 | int | 32비트 (4바이트) | -2,147,483,648 ~ 2,147,483,647 | 가장 많이 사용 |
| 정수형 | uint | 32비트 | 0 ~ 4,294,967,295 | 부호 없음 |
| 정수형 | long | 64비트 (8바이트) | 약 -9경 ~ 9경 | |
| 정수형 | ulong | 64비트 | 0 ~ 약 18경 | 부호 없음 |
| 실수형 | float | 32비트 | ±1.5e−45 ~ ±3.4e38 | 약 7자리 정밀도 |
| 실수형 | double | 64비트 | ±5.0e−324 ~ ±1.7e308 | 약 15~16자리 정밀도, 기본 실수 |
| 실수형 | decimal | 128비트 (16바이트) | ±1.0e−28 ~ ±7.9e28 | 28~29자리 정밀도, 금융/화폐 계산용 |
| 논리형 | bool | 1바이트 | true / false | |
| 문자형 | char | 16비트 (2바이트) | U+0000 ~ U+FFFF | 유니코드 문자 |
| 문자열 | string | 가변 | 문자 개수에 따라 달라짐 | 참조형, 불변 |
| 객체형 | object | 4바이트 (참조) | 모든 타입의 최상위 | 참조형 |
이건 영어로 따지면 알파벳, 일본어로 따지면 히라가나, 카타카나, 한국어로 따지면 자음과 모음이다.
그냥 외우자.
예제를 풀어보면서 그 느낌을 알도록 하겠다.
정수 타입의(int) 변수(변수명 : playerHp )를 선언하고 100을 할당하세요.
int playerHp = 100;
int라는 타입의 playerHp라는 변수에 100을 집어 넣었다.
참고로 C언어가 영어권에서 만들어져서 그런지 어순이 한국어와 반대이다.
100을 playerHp에 넣을게 가 아니라
playerHp에 100을 넣을게 이다.
이 외에도
// 1. int 변수 선언 및 할당
int playerHp = 100;
// 2. string 변수 선언 및 할당
string playerName = "내 이름";
// 3. bool 변수 선언 및 할당
bool isPlayerAlive = true;
// 4. float 변수 선언 및 할당
float moveSpeed = 3.5f;
// 5. long 변수 선언 및 할당
long worldPopulation = 7000000000L;
// 6. byte 변수 선언 및 할당
byte potionCount = 20;
// 7. double 변수 선언 및 할당
double pi = 3.1415926535;
// 8. string monsterName 변수 선언 및 출력
string monsterName = "슬라임";
Console.WriteLine(monsterName);
// 9. 변수 선언 및 500 출력
int score = 500;
Console.WriteLine(score);
// 10. camelCase 규칙으로 아이템 이름 변수 선언
string itemName = "낡은 검";
// 1. byte → int (암시적 형변환)
byte level = 50;
int levelInt = level;
Console.WriteLine(levelInt);
// 이유: 작은 범위(byte) → 큰 범위(int) 자동 변환 가능 (암시적 형변환)
// 2. int → long (암시적 형변환)
int gold = 200000;
long goldLong = gold;
Console.WriteLine(goldLong);
// 이유: int(32비트) → long(64비트)로 확장 가능, 데이터 손실 없음
// 3. int → float (암시적 형변환)
int hp = 10;
float hpFloat = hp;
Console.WriteLine(hpFloat);
// 이유: int 값은 소수점 없는 정수, float로 변환 시 소수점 표현 가능
// 4. float → double (암시적 형변환)
float speed = 5.25f;
double speedDouble = speed;
Console.WriteLine(speedDouble);
// 이유: double이 float보다 큰 정밀도와 범위를 가지므로 자동 변환 가능
// 5. float → int (명시적 형변환)
float averageDamage = 20.7f;
int damageInt = (int)averageDamage;
Console.WriteLine(damageInt);
// 결과: 20 (소수점 이하 버려짐)
// 6. double → int (명시적 형변환)
double preciseExp = 123.456;
int expInt = (int)preciseExp;
Console.WriteLine(expInt);
// 결과: 123 (소수점 이하 버려짐)
// 7. int → byte (명시적 형변환, 값 범위 안에 있음)
int itemCount = 150;
byte countByte = (byte)itemCount;
Console.WriteLine(countByte);
// 결과: 150 (0~255 범위 내이므로 정상 변환)
// 8. var 키워드 (컴파일 시 int 추론)
var myLevel = 10;
// 9. var 키워드 (컴파일 시 string 추론)
var myJob = "전사";
// 10. var 키워드 (컴파일 시 bool 추론)
var isPlayerTurn = true;
이렇게 타입을 변경해 줄 수도 있지만, 작은 거에서 큰 거로 가는건 괜찮지만, 큰 거에서 작은거로 가면 문제가 생길 수 있죠. 그때는 명시적 형변환을 씁니다.
int overflowValue = 300;
byte byteValue = (byte)overflowValue;
Console.WriteLine(byteValue);
int가 byte보다 큰 범위를 가지고 있으며, byte는 0~255인데 overflowValue의 값이 300이죠.
이때는 초과한 값이 남아서 출력 결과 44가 나올겁니다.
아래는 잘못된 예시입니다.
int PlayerHP = 100; // ❌ 로컬 변수는 camelCase 권장. PascalCase는 클래스/속성명에 사용
int 2ndValue = 20; // ❌ 숫자로 시작 불가
int _score = 50; // ⭕ 가능하지만 관례상 private 필드에 사용, 로컬 변수는 권장 X
int $money = 1000; // ❌ C#은 식별자 시작에 $ 사용 불가
int playerLevel = 10; // ⭕ camelCase 규칙 지킴
int player Name = 5; // ❌ 공백 포함 불가
int int = 7; // ❌ 예약어(int)는 변수명으로 사용할 수 없음
'공부 > 게임 공부' 카테고리의 다른 글
| C# 기초 문법 [ 메서드 ] (0) | 2025.10.01 |
|---|---|
| C# 기초 문법 [연산자와 조건문] (0) | 2025.10.01 |
| C# 기본 문법 (0) | 2025.09.29 |
| TIL을 왜 써야 하는가? <그걸 ㄹㅇ 모르냐?>라는 강의 (1) | 2025.09.26 |
| 팀원들이 만든 기능들 리팩토링 및 구조 확장 (0) | 2025.09.25 |