2023-08-18 TIL (C# 기초문법 + 개인과제 1일차)
오늘은 개인 프로젝트 발제 및 다른 수강생 분들의 문제풀이 방법을 공유하는 시간을 가졌다.
개인프로젝트를 진행하기 전에 그동안 미뤄왔던 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, ...)
- 실수는 float 와 double 타입을 사용
※ 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가지 방법이 존재.
- Convert 클래스
- Parse() 함수
- 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;
}
}
}