변수는 값을 저장하기 위해 메모리에 만든 공간입니다.
흔히 "상자" 에 비유하는데, 상자에 이름을 붙이고 물건(데이터)을 넣는 것과 같습니다.
int speed; // 정수를 저장할 공간(상자) 생성
speed = 1; // 그 공간에 1을 저장
Console.WriteLine(speed); // 출력: 1
변수는 언제든지 값을 바꿀 수 있습니다.
int speed = 1;
speed = 4;
Console.WriteLine(speed); // 출력: 4
아래 코드를 보면 변수가 왜 필요한지 바로 느껴집니다.
int hp = 100;
hp = hp - 10;
// 1. hp가 100이라는 값을 기억하고
// 2. hp - 10 을 계산하고
// 3. 결과를 다시 hp에 저장
// → 이 모든 과정에서 "값을 보관할 공간"이 필요합니다
즉, 변수는 값을 잠시 보관해두는 상자 역할을 합니다.
상수는 한 번 값을 정하면 변경할 수 없는 변수입니다.
const int MAX_PLAYER_COUNT = 4;
MAX_PLAYER_COUNT = 8; // ❌ 컴파일 오류 발생!
변하면 안 되는 값(중력, 최대 레벨, 화면 크기 등)에 사용합니다.
변수를 만들 때는 어떤 종류의 데이터를 담을지 먼저 지정해야 합니다.
int playerScore = 100; // 정수
float moveSpeed = 3.5f; // 실수 (소수점)
string playerName = "홍길동"; // 문자열
bool isAlive = true; // 참/거짓
char grade = 'A'; // 문자 하나
| 타입 | 크기 | 범위 | 용도 |
|---|---|---|---|
byte | 1바이트 | 0 ~ 255 | 작은 양수 |
short | 2바이트 | -32,768 ~ 32,767 | 작은 정수 |
int | 4바이트 | 약 ±21억 | 가장 많이 사용 |
long | 8바이트 | 약 ±920경 | 매우 큰 정수 |
| 타입 | 크기 | 특징 |
|---|---|---|
float | 4바이트 | Unity에서 주로 사용. 뒤에 f 붙임 |
double | 8바이트 | C# 실수 기본값. 더 정밀 |
decimal | 16바이트 | 금융 계산용. 오차 최소화 |
💡 Unity 개발에서는
float을 기본으로 씁니다.
double보다 정밀도는 낮지만 성능이 좋고, Unity API 자체가float기준으로 설계돼 있습니다.
| 타입 | 크기 | 예시 |
|---|---|---|
char | 2바이트 | 'A', '가' |
string | 가변 | "Hello", "길동" |
bool | 1바이트 | true, false |
char는 작은따옴표('),string은 큰따옴표(")를 씁니다. 헷갈리기 쉬우니 주의!
// 실제로 메모리 크기를 출력해볼 수 있습니다
Console.WriteLine($"int: {sizeof(int)} 바이트"); // 4
Console.WriteLine($"float: {sizeof(float)} 바이트"); // 4
Console.WriteLine($"double: {sizeof(double)} 바이트"); // 8
Console.WriteLine($"char: {sizeof(char)} 바이트"); // 2
Console.WriteLine($"bool: {sizeof(bool)} 바이트"); // 1
코드는 혼자 짜는 게 아닙니다. 팀원이 봤을 때 바로 이해할 수 있는 이름을 짓는 것이 중요합니다.
| 방식 | 형태 | 사용처 |
|---|---|---|
| camelCase | playerScore | 지역 변수, private 필드 |
| PascalCase | PlayerScore | 클래스명, 메서드명, public 멤버 |
| snake_case | player_score | Python 문화권 (C#에선 잘 안 씀) |
| UPPER_SNAKE_CASE | MAX_HEALTH | 상수(const) |
public class PlayerController : MonoBehaviour
{
// public 변수 → PascalCase
public int MaxHealth = 100;
// private 필드 → camelCase (또는 _언더스코어 접두사)
private int currentHealth;
private float _moveSpeed;
// 상수 → UPPER_SNAKE_CASE
private const int MAX_LEVEL = 99;
// 메서드 → PascalCase, 매개변수 → camelCase
public void TakeDamage(int damage)
{
// 지역 변수 → camelCase
int actualDamage = damage - 5;
currentHealth -= actualDamage;
}
}
| ❌ 나쁜 예 | ✅ 좋은 예 | 이유 |
|---|---|---|
a | playerScore | 의미가 있어야 함 |
theCurrentPlayerHealthPoint | currentHealth | 너무 길면 오히려 불편 |
hp | health | 약어보다 명확한 단어가 낫다 |
data123 | itemList | 숫자 붙이기보단 역할을 표현 |
int 1carSpeed; // ❌ 숫자로 시작 불가
int car speed; // ❌ 공백 포함 불가
int int; // ❌ 예약어 사용 불가
int 속도; // ⚠️ 가능은 하지만 권장하지 않음 (한글 비권장)
int carSpeed; // ✅ 올바른 선언
_로 시작int, class, void 등) 사용 불가예약어 전체 목록: Microsoft 공식 문서
int hp;
Console.WriteLine(hp); // ❌ 컴파일 오류: 할당되지 않은 변수 사용
C#은 사용 전에 반드시 값을 초기화해야 합니다.
초기화하지 않으면 메모리에 이전에 남아있던 쓰레기 값이 그대로 있을 수 있어 위험하기 때문입니다.
int hp = 100; // ✅ 선언과 동시에 초기화
int hp;
hp = 100; // ✅ 이렇게 나눠도 가능 (사용 전에만 초기화되면 됨)
int number1, number2, number3;
number1 = 1;
number2 = 2;
number3 = 3;
Console.WriteLine("{0}, {1}, {2}", number1, number2, number3);
// 출력: 1, 2, 3
static void Main(string[] args)
{
int playerScore = 100;
float moveSpeed = 3.5f;
string playerName = "길동";
bool isAlive = true;
char grade = 'A';
Console.WriteLine($"이름: {playerName}");
Console.WriteLine($"점수: {playerScore}");
Console.WriteLine($"이동속도: {moveSpeed}");
Console.WriteLine($"등급: {grade}");
Console.WriteLine($"생존 여부: {isAlive}");
// 데미지 계산 예시
int hp = 100;
int damage = 25;
hp = hp - damage;
Console.WriteLine($"피격 후 HP: {hp}"); // 75
}