본문 바로가기
개발/Unity 내일배움캠프 TIL

[내일배움단] 사전캠프 C# TIL 2. 데이터 다루기

by 석시 2023. 7. 18.



변수의 생성과 저장

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#에서도 비슷한 경험이 기다리고 있지 않을까.

참고) 문자열에 데이터 넣기

문자열에 내가 원하는 데이터를 넣고 싶을 때, 여러 가지 방법들이 있겠다.

  1. 더하기 (+)
int birthYear = 1997;
int age = 26;

string msg = "나는 " + birthYear.ToString() + "년생" +
    ", 나이는 " + age.ToString() + "살 입니다.";
Console.WriteLine(msg);

제일 간단한데, 뭔가 맘에 들지 않는다. (멋있지가 않아)

  1. Format()
int birthYear = 1997;
int age = 26;

string msg = string.Format("나는 {0}년생, 나이는 {1}살 입니다.", birthYear, age);
Console.WriteLine(msg);

프로그래밍을 배울 때 C와 파이썬을 가장 먼저 배워서 그런지, 나에게는 가장 익숙해보이는 방식.

  1. $”” 사용
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에 마우스를 올려보면 어떤 것으로 치환이 되는지 알 수 있다.

하지만 이를 남발하는 것은 좋지 않으니 참고로만 알아두자.

자료형 정리표

자료형특징기본값크기
booltrue , falsefalse1 byte
string문자열" " 로 감싸야 함null계속 변함
char문자' ' 로 감싸야 함'\0'2 byte
sbyte8bit 정수 (부호 없음)-128 ~ 12701 byte
byte8bit 정수0 ~ 25501 byte
short16bit 정수–32,768 ~ 32,76702 byte
ushort16bit 정수 (부호 없음)0 ~ 65,53502 byte
int정수–2,147,483,648 ~ 2,147,483,64704 byte
uint정수 (부호 없음)0 ~ 4,294,967,29504 byte
long64bit 정수–9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,80708 byte
ulong64bit 정수 (부호 없음)0 ~ 18,446,744,073,709,551,61508 byte
float실수1.5E-45 ~ 3.4E+38 (7자리 유효) 0.0000001f 뒤에 f를 붙여야함04 byte
double실수5.0E-324 ~ 1.7E+308 (15자리 유효) 0.000000000000001d 뒤에 d를 붙여야 하지만 붙이지 않더라도 double로 인식08 byte
Decimal실수±1.0 x 10-28 ~ ±7.9228 x 1028 28-29개의 자릿수016 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과 같은 자료형과 달리 클래스이기 때문에 조금 다르게 처리해줘야 한다.

  1. 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유니코드 형태로 변환합니다.
ToDecimalDecimal 숫자 형태로 변환합니다.
ToDouble실수 형태로 변환합니다.
ToInt1616비트 부호 있는 정수로 변환합니다.
ToInt3232비트 부호 있는 정수로 변환합니다.
ToInt6464비트 부호 있는 정수로 변환합니다.
ToSbyte8비트 부호 있는 정수로 변환합니다.
ToSingle단정 밀도 부동 소숫점으로 변환합니다.
ToString문자열로 변환합니다.
ToUInt1616비트 부호 없는 정수로 변환합니다.
ToUInt3232비트 부호 없는 정수로 변환합니다.
ToUInt6464비트 부호 없는 정수로 변환합니다.

  1. 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()가 있다.

  1. 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→intint→short 변환 같은 경우의 이야기이다.

이 때에 명시적으로 캐스팅을 하게 되면 데이터 손실이 있어도 형변환이 가능하다.

상당히 위험한 작업이기 때문에 확인을 한 번 받는거라고 생각하면 될듯.

int a = 100;
short b = (short)a;

사실 이런 식의 캐스팅이 있을 경우 항상 명시를 해주는 것이 코드의 유지 보수를 위해서도 좋다.

형변환이 일어났는지 안일어났는지, 어떻게 일어났는지 등의 정보는 코드를 처음 보는 사람이 읽게 되면 한 번에 파악하기가 매우 어렵다.

내가 코드를 작성할 때에도 의도치 않은 방식의 형변환이 일어날 수 있게 된다.

C++의 경우 static_cast와 같은 다양한 형변환을 제공해주지만, C#은 검색해보니 성공하는 경우에만 조건부로 형변환을 수행하게 해주는 패턴 일치문이라는 것이 있다.

패턴 일치와 is 및 as 연산자를 사용하여 안전하게 캐스트하는 방법
패턴 일치 기법을 사용하여 변수를 다른 형식으로 안전하게 캐스팅하는 방법을 알아봅니다. 패턴 일치뿐만 아니라 is 및 as 연산자를 사용하여 형식을 안전하게 변환할 수 있습니다.
https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/tutorials/safely-cast-using-pattern-matching-is-and-as-operators

연습 문제

  1. 변수 만들기

정수형 변수 - 레벨, 갯수 실수형 변수 - 확률, 속도 문자형 변수 - 별명, 설명

  • 정답
    // Practice 1-1
    // 변수 만들기
    {
        int level, number;
        float percentage, speed;
        string nickname, explanantion;
    }

  1. 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";
    }

  1. 형변환 - 숫자를 숫자로
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;
    }

  1. 형변환 - 숫자를 문자로
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();
    }

  1. 형변환 - 문자를 숫자로
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