TIL (since 2023.08.07 ~ )

2023-08-18 TIL (C# 기초문법 + 개인과제 1일차)

Bastian바스티언 2023. 8. 18. 21:00

오늘은 개인 프로젝트 발제 및 다른 수강생 분들의 문제풀이 방법을 공유하는 시간을 가졌다.

개인프로젝트를 진행하기 전에 그동안 미뤄왔던 C# 문법의 기초부터 다시 다진 후에 개인프로젝트를 구현해보기로 했다.

 

 


C# 기초 문법

● 기초 용어 정리

선언 : 변수를 처음에 만드는 것을 "선언" 이라고 함

int x;

 

할당 : 변수에 데이터를 넣어주는 것을 "할당" 이라고 함

int x = 10;

 

초기화 : 맨 처음 데이터를 할당하는 것을 "초기화" 라고 함

int x = 10; // 처음 데이터가 들어 갔을 때 초기화했다고 합니다.
x = 21;
x = 31;

 

 

● 변수의 생성과 저장

- 생성 : '데이터의 형식'과 '이름'을 정하고 세미콜론(;)으로 마무리하면 변수가 생성됨

- 저장 : ' = '를 사용하여 변수에 값을 저장하지만, 형식에 맞춰서 저장해야 함

string x = "팀스파르타";
int y = 2023;

// 형식에 맞지 않으면 에러가 발생
string x = 2023;	// 에러발생
int y = "팀스파르타";	//에러발생

※ 변수는 "계속해서 변하는 수" 이기 때문에 한번 만들고 끝이 아닌, 이후에 다른 값으로 저장이 가능

string codingClub = "팀스파르타";
codingClub = "스파르타코딩클럽";
Console.WriteLine(codingClub);

// 출력결과
스파르타코딩클럽

이처럼 마지막에 저장된 '스파르타코딩클럽'이 출력된다.

 

● 자료형 - 숫자 (int, float, double)

- 숫자에는 '정수''실수'가 존재

- '정수'소수점이 없는 숫자를 의미. (음수도 똑같이 정수이다. ex. -1, -2, -3,...) 

  • 정수는 int 타입을 사용 (integer)
int age = 26;
int level = 100;
int degree = -5;

- '실수'소수점이 있는 숫자를 의미. (음수지만 소수점이 존재하면 실수. ex. -1.5, -20.3, ...)

  • 실수는 floatdouble 타입을 사용 

float 과 double의 차이점은 소수점을 최대로 표현할수있는 범위가 다름.

(float은 소수점 7자리, double은 소수점 16자리) 

하지만 double이 float보다 더 많은 메모리를 소모하기 때문에 특별한 경우가 아니라면 float 위주로 사용

float exp = 78.5f;
float speed = 1.5f;
double pi = 3.1415d;

위에서 보이는 것과 같이 숫자 뒤에 'f' , 'd'를 입력하는 이유는,

컴퓨터의 입장에서 숫자만 적혀있을 경우 이 숫자를 어떻게 사용하려는지 알 수가 없기 때문에 숫자뒤에 알파벳을 붙여줌.

단, 아무런 표시가 없다면 double로 인식!

float exp = 56.5f;	// 정상. float 변수타입에 float 데이터를 저장
float speed = 1.5; // 에러. float 변수타입에 double 데이터를 저장

double exp = 56.5d // 정상. double 변수타입에 double 데이터를 저장
double speed = 56.5; // 정상. double 변수타입에 double 데이터를 저장

 

● 자료형 - 문자열과 문자 (string, char)

string codingClub = "팀스파르타";

위의 데이터 codingClub이라는 변수에 "팀스파르타"라는 값을 할당한 것처럼

"팀스파르타"라는 값은 "팀" + "스" + "파" + "르" + "타" 라는 5개의 문자가 합쳐진 데이터이다.

이렇게 여러 글자가 합쳐진 것이 문자열 (string) 이며,

각각의 글자들이 문자 (char) 이다.

string codingClub = "팀스파르타";

char team_1 = "팀";
char team_2 = "스";
char team_3 = "파";
char team_4 = "르";
char team_5 = "타";

 

● 형변환 (Casting)

변수를 사용할때 자료의 형태를 변환해야 하는 일이 존재하며, 그 중 가장 많이 사용하고 기본적인 3가지는 아래와 같다.

  • 숫자를 다른 형태의 숫자로 변환
  • 다른 자료형문자로 변환
  • 문자다른 자료형으로 변환

1. 숫자 ↔ 숫자 (int, float)

int x = 10;
float y = 1.5f;

// 사용하고 싶은 변수 앞에 변경하고 싶은 괄호하고 자료형 명시
int z = x + (int)y
float z =(float)x + y

 

2. 다른 자료형 → 문자

숫자나 bool 을 문자로 바꾸는 방법.

// Tostring() 을 붙이면 변환
int x = 10;
string xStr = x.ToString(); // "10"

float y = 1.5;
string yStr = y.ToString(); // "1.5"

bool myBool = true;
string boolStr = mybool.ToString(); // "true"

 

3. 문자 → 다른 자료형

이 방법은 조금 복잡하고 다양하며, 대표적으로 3가지 방법이 존재.

  1. Convert 클래스
  2. Parse() 함수
  3. TryParse() 함수
  • Convert 클래스
string iStr = "10";
int x;
x = Convert.ToInt32(iStr); // x : 10

string bStr = "true";
bool b;
b = Convert.Toboolean(bStr); // b : true

 

  • Parse() 함수
string iStr = "10";
int x;
x = int.Parse(iStr); // x : 10

string bStr = "true";
bool b;
b = bool.Parse(bStr); // b : true

 

  • TryParse() 함수
string iStr = "10";
int x;
int.TryParse(iStr, out x); // x : 10

string bStr = "true";
bool b;
bool.TryParse(bStr, out b); // b : true

기존 방법과 다른 점은 반환값으로 캐스팅한 값을 받지 않는다.

반환값은 bool 만 받으면 캐스팅이 성공했는지 알려준다.

string iStr = "10"; // int 로 변환 할 수 있으니 성공
int x;
bool isSuccess;
isSuccess = int.TryParse(iStr, out x); // isSuccess : true

string bStr = "testtest"; // bool 로 변환 할 수 없으니 실패
bool b;
bool isSuccess;
isSuccess = int.TryParse(bStr, out b); // isSuccess : false

 

 

● 산술 연산

- 더하기 (+)

int x = 10;
int result;

result = x + 3;
// result : 13

 

- 빼기 (-)

int x = 10;
int result;

result = x - 5;
// result : 5

 

- 곱하기 (*)

int x = 10;
int result;

result = x * 2;
// result : 20

 

- 나누기, 나머지 연산( / , % )

int x = 17;
int result_1;
int result_2;

result_1 = x / 5; 
result_2 = x % 5;

// result_1 : 3
// result_2 : 2

 

- 증감 연산(++,--)

// 1씩 연산

int x = 10;
x++;
// x : 11

int y = 10;
y--;
// y = 9

 

- 변수에 바로 계산

일반적으로 변수는 연산을 한 값을 다시 할당하지 않으면 저장되지 않음

int x = 10;

Console.WriteLine(x + 10); // 20 출력
Console.WriteLine(x); // 10 출력

변수에 10을 더했지만 저장이 되지 않으므로 10이 그대로 출력이 됨.

더한 값을 저장하려면 변수에 다시 할당을 해야함

int x = 10;
x = x + 10;

Console.WriteLine(x);
// 20 출력

 

 

 


 

 

개인과제 진척도

오늘부터 시작된 개인과제에 대해서 조금씩 진척도를 올리자면,

먼저 필수 구현 목록인 '게임시작화면', '상태보기', '인벤토리' 중

'게임시작화면'과 '상태보기' 까지는 구현을 어느정도 마친 상태이다.

 

주말동안 인벤토리를 구현하기 위해 배열과 리스트 부분을 다시 복습하면서 직접 구현할 수 있게 노력해 봐야겠다 ㅠㅠ

 

internal class Program
    {
        private static Character player;
        static void Main(string[] args)
        {
            GameDataSetting();
            DisplayGameIntro();
        }

        static void GameDataSetting()
        {
            // 캐릭터 정보 세팅
            player = new Character("bastian", "전사", 1, 10, 5, 100, 1500);

            //아이템 정보 세팅
        }
        static void DisplayGameIntro()
        {
            Console.Clear();
            // 1. 게임 시작 화면
            Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다.");
            Console.WriteLine("이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("1. 상태보기");
            Console.WriteLine("2. 인벤토리");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");

            // 숫자를 입력시 실행되는 창 설정.
            // 1은 상태보기이므로 DisplayMyInfo
            // 2는 인벤토리이므로 DisplayInventory

            int input = CheckValidInput(1, 2);
            switch (input)
            {
                case 1:
                    DisplayMyInfo();
                    break;

                case 2:
                    DisplayInventory();
                    break;

                default:
                    Console.WriteLine("잘못된 입력입니다.");
                    break;
            }
        }

        static void DisplayMyInfo()
        {
            Console.Clear();
            // 2. 상태보기
            Console.WriteLine("상태보기");
            Console.WriteLine("캐릭터의 정보가 표시됩니다.");
            Console.WriteLine();
            Console.WriteLine($"LV.{player.Level}");
            Console.WriteLine($"{player.Name}({player.Job})");
            Console.WriteLine($"공격력 : {player.Atk}");
            Console.WriteLine($"방어력 : {player.Def}");
            Console.WriteLine($"체력 : {player.Hp}");
            Console.WriteLine($"Gold : {player.Gold}");
            Console.WriteLine();
            Console.WriteLine("0 : 나가기");

            int input = CheckValidInput(0, 0);
            switch (input)
            {
                case 0:
                    DisplayGameIntro();
                    break;
            }
        }

        static void DisplayInventory()
        {
            Console.Clear();
            // 3. 인벤토리
            Console.WriteLine("인벤토리");
            Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("[아이템 목록]");

        }

        static int CheckValidInput(int min, int max)   
        // 입력받을때 input 값이 맞는 값인지 판단하는 부분, 맞으면 출력하고 틀리면 다시 while문으로 돌리기 위해서 필요한 부분!
        {
            while (true)
            {
                bool parseSuccess = int.TryParse(Console.ReadLine(), out var ret);   // var키워드 , 형변환 TryParse 함수 사용
                if (parseSuccess)
                {
                    if (ret >= min && ret <= max)
                        return ret;
                }

                Console.WriteLine("잘못된 입력입니다.");

            }
        }
    }
        public class Character
        {
            public string Name { get; }
            public string Job { get; }
            public int Level { get; }
            public int Atk { get; }
            public int Def { get; }
            public int Hp { get; }
            public int Gold { get; }

            public Character(string name, string job, int level, int atk, int def, int hp, int gold)
            {
                Name = name;
                Job = job;
                Level = level;
                Atk = atk;
                Def = def;
                Hp = hp;
                Gold = gold;
            }

        }
    }