변수의 생성과 저장
string codingClub = "팀스파르타";
int year = 2023;
다음과 같이 변수를 생성하고 저장할 수 있다.
물론 출력을 해놓은 상황이 아니기 때문에 프로그램 실행해도 아무것도 보이지 않는다.
변수의 활용
string codingClub = "팀스파르타";
int year = 2023;
Console.WriteLine(codingClub);
Console.WriteLine(year);
다음과 같이 출력을 위한 함수를 작성해 그 안에 변수를 넣어주게 되면 프로그램을 실행시켜 변수 안의 내용을 볼 수 있게 된다.
참고로 cw - Tab 을 하게 되면 Console.WriteLine();을 아주 빠르게 쓸 수 있다.
변수의 수정
string codingClub = "팀스파르타";
Console.WriteLine(codingClub);
codingClub = "스파르타코딩클럽";
Console.WriteLine(codingClub);
수정할 때는 다시 해당 변수를 불러와 새로운 데이터를 넣어줄 수 있다.
변수 생성 시에는 자료형을 앞에 붙여주고, 수정할 때에는 그렇지 않은 것이 눈에 보이는 가장 큰 차이점이 아닐까 싶다.
자료형
정수
int age = 15;
int amount = 4;
int level = 100;
정수를 저장할 때는 int를 사용한다.
게임을 만들 때는 양수만 필요한 상황이 많으니 unsigned int가 필요할 때도 있지 않을까.
찾아보니 C#에서 unsigned int는 uint를 사용한다.
실수
float exp = 56.5f;
float speed = 3.2f;
double length = 10.245d;
실수를 저장할 때는 float 또는 double을 사용한다.
둘은 저장용량의 차이이다. float은 32비트, double은 그 두 배인 64비트. 네이밍이 굉장히 정직하다. 무려 두배
유니티에서는 주로 float을 많이 쓰는 것으로 알려져 있다.
실수를 더 정확하게 표현해서 얻어지는 이득보다 메모리가 더 중요해서 그런 것 아닐까.
학교 수업 때는 당연히 메모리 걱정이 없으니 double 사용이 더 익숙한데, float 사용을 미리 습관화해놓도록 하자.
float speed = 56.5; // error
교안처럼 double의 경우 매번마다 끝에 d를 붙여 표기하는 것은 매우 좋아보인다.
float을 사용할 때마다 끝에 f를 붙이는 것을 매번 까먹는데, double부터 d를 붙이는 습관을 들이면 괜찮을 것 아닌가.
문자열과 문자
string codingClub = "팀스파르타";
char team_1 = "팀";
char team_2 = "스";
char team_3 = "파";
char team_4 = "르";
char team_5 = "타";
문자는 char 에 저장한다.
여러 가지의 문자로 이루어진 문자열은 string.
하나 특이한 점은 C언어에서 char의 크기는 1byte였는데, C#에서는 2byte라는 점이다.
기본적으로 유니코드라 그런 것일까.
항상 새로운 언어를 공부할 때 곤란한 점은 string을 다루는 방식이 너무나도 가지각색이라는 점이다.
특히 C++에서 string과 char 배열은 엄밀하게 봤을 때 차이가 있기 때문에 공부하면서 머리가 으깨지는 경험을 했었는데.
C#에서도 비슷한 경험이 기다리고 있지 않을까.
참고) 문자열에 데이터 넣기
문자열에 내가 원하는 데이터를 넣고 싶을 때, 여러 가지 방법들이 있겠다.
- 더하기 (+)
int birthYear = 1997;
int age = 26;
string msg = "나는 " + birthYear.ToString() + "년생" +
", 나이는 " + age.ToString() + "살 입니다.";
Console.WriteLine(msg);
제일 간단한데, 뭔가 맘에 들지 않는다. (멋있지가 않아)
- Format()
int birthYear = 1997;
int age = 26;
string msg = string.Format("나는 {0}년생, 나이는 {1}살 입니다.", birthYear, age);
Console.WriteLine(msg);
프로그래밍을 배울 때 C와 파이썬을 가장 먼저 배워서 그런지, 나에게는 가장 익숙해보이는 방식.
- $”” 사용
int birthYear = 1997;
int age = 26;
string msg = $"나는 {birthYear}년생, 나이는 {age}살 입니다.";
Console.WriteLine(msg);
사실상 이것 때문에 이 파트를 썼다고 봐도 무방.
너무너무 멋있고 직관적이지 않은가?
참고) var
var이라는 것이 있다.
var a = 12;
var b = 3.22f;
var c = "seoksii";
var d = true;
자료형에 상관 없이 데이터를 넣을 수 있는 것인데, C++의 auto와 매우 비슷해보인다.
컴파일 시점에 자료형을 결정하게 된다.
Visual Studio 상에서는 var에 마우스를 올려보면 어떤 것으로 치환이 되는지 알 수 있다.
하지만 이를 남발하는 것은 좋지 않으니 참고로만 알아두자.
자료형 정리표
자료형 | 값 | 특징 | 기본값 | 크기 |
---|---|---|---|---|
⭐bool | true , false | false | 1 byte | |
⭐string | 문자열 | " " 로 감싸야 함 | null | 계속 변함 |
char | 문자 | ' ' 로 감싸야 함 | '\0' | 2 byte |
sbyte | 8bit 정수 (부호 없음) | -128 ~ 127 | 0 | 1 byte |
byte | 8bit 정수 | 0 ~ 255 | 0 | 1 byte |
short | 16bit 정수 | –32,768 ~ 32,767 | 0 | 2 byte |
ushort | 16bit 정수 (부호 없음) | 0 ~ 65,535 | 0 | 2 byte |
⭐int | 정수 | –2,147,483,648 ~ 2,147,483,647 | 0 | 4 byte |
uint | 정수 (부호 없음) | 0 ~ 4,294,967,295 | 0 | 4 byte |
long | 64bit 정수 | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 | 8 byte |
ulong | 64bit 정수 (부호 없음) | 0 ~ 18,446,744,073,709,551,615 | 0 | 8 byte |
⭐float | 실수 | 1.5E-45 ~ 3.4E+38 (7자리 유효) 0.0000001f 뒤에 f를 붙여야함 | 0 | 4 byte |
double | 실수 | 5.0E-324 ~ 1.7E+308 (15자리 유효) 0.000000000000001d 뒤에 d를 붙여야 하지만 붙이지 않더라도 double로 인식 | 0 | 8 byte |
Decimal | 실수 | ±1.0 x 10-28 ~ ±7.9228 x 1028 28-29개의 자릿수 | 0 | 16 byte |
형변환 (Casting)
숫자 → 숫자
// float에서 int로
int x = 10;
float y = 10.0f;
int z = x + (int)y; // 사용하고 싶은 변수 앞에 변경하고 싶은 괄호하고 자료형 명시
// int에서 float으로
int a = 10;
float b = 10.0f;
float c = (float)a + b; // 사용하고 싶은 변수 앞에 변경하고 싶은 괄호하고 자료형 명시
int → float은 데이터 손실이 없기 때문에 자료형의 명시 없이 캐스팅이 가능하다.
float → int의 경우 소수점 아래의 데이터 손실이 있기 때문에 명시가 반드시 필요하다.
다른 자료형 → 문자
int x = 10;
string xStr = x.ToString(); // "10"
float y = 10.5f;
string yStr = y.ToString(); // "10.5"
bool myBool = true;
string boolStr = myBool.ToString(); // "true"
다른 형변환보다는 편한 편.
문자 → 다른 자료형
String은 int와 float과 같은 자료형과 달리 클래스이기 때문에 조금 다르게 처리해줘야 한다.
- Convert 이용
string iStr = "10";
int x;
x = Convert.ToInt32(iStr); // x : 10
string bStr = "true";
bool b;
b = Convert.ToBoolean(bStr); // b : true
메소드 | 설명 |
---|---|
ToBoolean | 부울 형태로 변환합니다. |
ToByte | 유니코드를 정수형태로 변환합니다. |
ToChar | 유니코드 형태로 변환합니다. |
ToDecimal | Decimal 숫자 형태로 변환합니다. |
⭐ToDouble | 실수 형태로 변환합니다. |
ToInt16 | 16비트 부호 있는 정수로 변환합니다. |
⭐ToInt32 | 32비트 부호 있는 정수로 변환합니다. |
ToInt64 | 64비트 부호 있는 정수로 변환합니다. |
ToSbyte | 8비트 부호 있는 정수로 변환합니다. |
ToSingle | 단정 밀도 부동 소숫점으로 변환합니다. |
⭐ToString | 문자열로 변환합니다. |
ToUInt16 | 16비트 부호 없는 정수로 변환합니다. |
ToUInt32 | 32비트 부호 없는 정수로 변환합니다. |
ToUInt64 | 64비트 부호 없는 정수로 변환합니다. |
- Parse() 함수 사용
string iStr = "10";
int x;
x = int.Parse(iStr); // x : 10
string bStr = "true";
bool b;
b = bool.Parse(bStr); // b : true
이러한 형태의 형변환은 무적처럼 보이지만, 문제는 형변환에 실패할 때이다.
string iStr = "10xxxx";
int x;
x = Convert.ToInt32(iStr); // x : ??? 에러 발생
string bStr = "testtest";
bool b;
b = bool.Parse(bStr); // b : ???? 에러 발생
이에 따라 형변환의 실패 여부를 알 수 있는 방법인 TryParse()가 있다.
- TryParse() 함수 사용
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
isSuccess는 단순히 형변환이 성공했는지 여부를 bool 형태로 받을 뿐이다.
실제 값은 두번째 signature인 out ~이 받게 되는데, out은 처음 보는 형태의 방식이다.
원래라면 포인터를 사용해서 x나 b를 수정했을텐데, 대신 out을 사용하나보다.
나중에 배운다고 하니, 공부를 계속해보자.
참고) 명시적 변환
데이터가 손실될 일이 있을 경우 C#에서는 암시적 변환을 허용하지 않는다.
C++은 가능했던 것 같은데.
float→int나 int→short 변환 같은 경우의 이야기이다.
이 때에 명시적으로 캐스팅을 하게 되면 데이터 손실이 있어도 형변환이 가능하다.
상당히 위험한 작업이기 때문에 확인을 한 번 받는거라고 생각하면 될듯.
int a = 100;
short b = (short)a;
사실 이런 식의 캐스팅이 있을 경우 항상 명시를 해주는 것이 코드의 유지 보수를 위해서도 좋다.
형변환이 일어났는지 안일어났는지, 어떻게 일어났는지 등의 정보는 코드를 처음 보는 사람이 읽게 되면 한 번에 파악하기가 매우 어렵다.
내가 코드를 작성할 때에도 의도치 않은 방식의 형변환이 일어날 수 있게 된다.
C++의 경우 static_cast와 같은 다양한 형변환을 제공해주지만, C#은 검색해보니 성공하는 경우에만 조건부로 형변환을 수행하게 해주는 패턴 일치문이라는 것이 있다.
연습 문제
- 변수 만들기
정수형 변수 - 레벨, 갯수 실수형 변수 - 확률, 속도 문자형 변수 - 별명, 설명
정답
// Practice 1-1 // 변수 만들기 { int level, number; float percentage, speed; string nickname, explanantion; }
- 1에서 만든 변수에 데이터를 입력해주세요.
데이터는 자신이 원하는 데이터를 임의로 입력하시면 됩니다.
정답
// Practice 1-2 // 1-1에서 만든 변수에 데이터를 입력해주세요. { int level = 1; int number = 64; float percentage = 0; float speed = 60; string nickname = "seoksii"; string explanantion = "it's my nickname"; }
- 형변환 - 숫자를 숫자로
int iTen = 10;
float fTen; // iTen 을 저장해보세요
float fFive = 5.5f;
int iFive; // fFive 을 저장해보세요
정답
// Practice 1-3 // 숫자 -> 숫자 { int iTen = 10; float fTen = (float)iTen; float fFive = 5.5f; int iFive = (int)fFive; }
- 형변환 - 숫자를 문자로
int n = 10;
float f = 0.5f;
정답
// Practice 1-4 // 숫자 -> 문자 { int n = 10; float f = 0.5f; string n_string = n.ToString(); string f_string = f.ToString(); }
- 형변환 - 문자를 숫자로
string strTen = "10";
string strSix = "6.2";
정답
// Practice 1-5 // 문자 -> 숫자 { string strTen = "10"; string strSix = "6.2"; int iTen; float fSix; bool isSuccess = int.TryParse(strTen, out iTen); isSuccess = float.TryParse(strSix, out fSix); }
Uploaded by N2T
'개발 > Unity 내일배움캠프 TIL' 카테고리의 다른 글
[내일배움단] 사전캠프 C# TIL 6. 함수 (0) | 2023.07.21 |
---|---|
[내일배움단] 사전캠프 C# TIL 5. 배열 (0) | 2023.07.21 |
[내일배움단] 사전캠프 C# TIL 4. 제어문 (1) | 2023.07.20 |
[내일배움단] 사전캠프 C# TIL 3. 연산자 (0) | 2023.07.19 |
[내일배움단] 사전캠프 C# TIL 1. 시작하기 (0) | 2023.07.18 |