본문 바로가기
  • 식초 한잔 할래..?
공부/게임 공부

C# 기초 문법 [변수와 타입]

by 돼지피그푸곰 2025. 10. 1.

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)는 변수명으로 사용할 수 없음