개임 게발
[C#] 데이터 다루기 - 변수, 자료형, 형변환 본문
변수
데이터를 보관하자
- "Hello"와 "2025"를 스크립트에 입력해 보자.(이후 이 문자와 숫자를 데이터라고 표현) 그러면 빨간줄이 뜬다.
- 형식에 맞지 않게 작성해 생긴 문제. 이 "Hello"와 "2025"는 코딩 영역에서 살아남을 수 없다. 코딩 영역에 데이터를 추가하면 지금과 같은 에러가 발생하게 됨
- 하지만 Console.Write("Hello"); 안에서는 에러가 발생하지 않음. 이 부분이 데이터가 안전하게 있을 수 있는 공간이다.
- 그런데 데이터가 필요할 때마다 이걸 사용할 수는 없음. 그래서 필요한 게 변수.
- 변수에 필요한 건 '데이터 형식', '변수 이름', '세미콜론(변수라서 필요한 건 아니지만 항상 세미콜론으로 마무리)'
- 데이터 형식(집)
- 문자인지 숫자인지
- 문자라면 string, 숫자라면 int
- 변수 이름(집의 이름)
- 변수를 구분할 수 있는 이름
- 원하는 이름으로 만들 수 있다. 기본적으로는 어떤 이름이든 상관없음(aaa, bbb, asaasda 이런 거 다 가능)
- 다만 구분하는 역할을 하는 만큼 의미있는 이름으로 지어야 파악하기 좋다.
- 쓸 수 없는 문자들은 존재함. 특수문자 및 띄워쓰기
- 일단은 영어와 숫자, 언더바만으로 만드는 걸 권장
- 예시
int age; <- 숫자 형식을 보관할 수 있는 변수
string name; <- 문자 형식을 보관할 수 있는 변수
변수의 생성과 저장
변수의 생성
- 데이터 형식과 이름을 정하고 세미콜론으로 마무리하면 변수가 만들어진다.
string x;
int y;
- "Hello" 문자가 들어갈 변수를 x, "2025" 숫자가 들어갈 변수를 y로 만들었다.
변수의 저장
- 이제 집을 만들었으니 데이터를 이사시키자.
string x = "hello";
int y = 2025;
- 변수에 데이터를 저장할 때는 = 을 이용한다.
- "hello"가 들어있는 x, 2025가 들어있는 y 변수가 생겼다.
- 그런데 위의 설명이 없었다면 x, y에 어떤 데이터가 있는지 알기 어려웠을 거다.
- 그러니 변수의 이름을 좀 더 의미있게 바꿔보자.
string hi = "hello";
int year = 2025;
- hi라는 이름이 x보다 어떤 데이터가 들어 있는 변수인지 좀 더 알기 쉬움
- 이렇게 유추하기 쉬운 이름을 사용하면 나중에 변수가 많아져도 덜 혼동된다.
변수의 활용
- 변수를 생성하고 값을 저장하면 이후에 데이터를 입력하는 대신 변수를 활용할 수 있다.
string hi = "hello";
int year = 2025;
Console.WriteLine(hi);
Console.WriteLine(year);
- "hello"를 입력하고 싶은 부분에는 변수(hi), 2025를 입력하고 싶은 부분에는 변수(year) 입력
변수의 수정
- 변수는 계속해서 변하는 수
- 한번 만들고 끝이 아니라 이후 다른 값을 저장할 수 있다.
string hi = "hello";
hi = "helloooo";
Console.WriteLine(hi);
- 첫 번째 줄에서 hi라는 변수를 만들고 "hello"라는 값을 저장했다.
- 두 번째 줄에서 이미 만들어진 hi 변수에 "helloooo"라는 값으로 다시 저장했다.
- 마지막 줄에서는 이중 가장 마지막 데이터를 가지고 활용한다. (helloooo 활용)
- 이처럼 변수는 사용하는 순간에 따라 계속해서 변하게 된다.
string hi = "hello";
Console.WriteLine(hi);
hi = "helloooo";
Console.WriteLine(hi);
- 이렇게 하면 하나의 변수를 사용했지만 저장된 값에 따라 다른 값이 나타나게 된다.
자료형
숫자 자료형(int, float, double)
int num = 10;
- 지금까지는 숫자 변수를 만들 때 int를 사용했다.
- 하지만 모든 숫자가 int에 저장될 수 있는 건 아님. 숫자에는 정수와 실수가 있기 때문
int age = 15;
int amount = 4;
int level = 100;
- 정수(int)로는 나이, 갯수, 레벨 등을 표현할 수 있다.
float exp = 56.5f;
float speed = 3.2f;
double lenght = 10.245d;
- 실수(float, double)로는 경험치, 공격 속도, 길이 등을 표현할 수 있다.
- float: 소수점 7자리까지 표시 가능
- double: 소수점 15~16자리까지 표시 가능
- 그럼 걍 double로 통일하죠?
- double은 float보다 더 정확하게 데이터를 저장할 수 있지만, 그만큼 저장하는 데 많은 비용을 소모하게 됨
- PC에는 메모리라는 저장 공간이 있다. 메모리가 지갑이고 만 원이 있는데 double과 float을 이 메모리에 저장하려면 double은 800원, float은 400원이 필요하게 된다. 한정된 돈을 가지고 많은 일을 하려면 비용을 알맞게 계획해야 함
- 요약: float이 가성비가 좋다
실수의 표현
float exp = 56.5f;
float speed = 3.2f;
double lenght = 10.245d;
- 데이터의 끝에 f 혹은 d가 붙어있다.
1 <- 숫자
"1" <- 문자
- 같은 1이더라도 숫자 1을 표현할 때와 문자 1을 표현할 때의 작성법이 다르다.
- 컴퓨터 입장에서는 이 1을 어떻게 사용하라는 건지 알 수 없기 때문
- 그래서 문자의 경우엔 ""를 붙여서 사용한다.
- 마찬가지로 소수점 1.1을 사용하려고 할 때 컴퓨터는 이게 float인지 double인지 알 수 없다. 그래서 숫자 뒤에 f나 d를 붙여서 표시해 줌
- 단 아무런 표시가 없다면 double로 인식한다.
float exp = 56.5f; 정상 - float 변수에 float 데이터를 저장
float speed = 56.5; 에러 - float 변수에 double 데이터를 저장
double exp = 56.5d; 정상 - double 변수에 double 데이터를 저장
double speed = 56.5; 정상 - double 변수에 double 데이터를 저장
문자열과 문자 자료형(string, char)
string hi = "hello";
- 지금까지 위와 같은 "hello" 데이터를 문자라고 설명했다.
- 하지만 엄밀히 말하면 이건 틀린 말
- "hello"는 "h", "e", "l", "o"라는 4가지 문자가 합쳐진 데이터다.
- 이렇게 여러 글자가 합쳐진 것을 문자열(string)이라고 한다.
string codingClub = "팀스파르타";
char team_1 = 'h';
char team_2 = 'e';
char team_3 = 'l';
char team_4 = 'o';
- 그리고 h, e, l, o 라는 각각의 글자들을 문자라고 한다.
- 문자를 표현하는 자료형은 char (character)
자료형 정리표
- C#에는 숫자와 문자만이 아닌 많은 데이터 형식이 있다.
- 우선은 string, int, float, bool 이 4가지만 기억해 줘도 문제 없음
⭐ - 무조건 알아야 함
✅ - 이후에 활용될 수 있는 자료형
기타 - 많이는 안 쓰임
자료형 | 값 | 특징 | 기본값 | 크기 |
⭐ 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)
- 변수를 사용할 때 사용하고 있는 자료의 형태를 변환해야 할 일이 있다.
- 예시) string을 int로, string을 bool로
- 여러 가지의 자료형이 있는 만큼 다양한 상황에서의 현 변환이 있지만, 그중 가장 많이 사용하고 기본적인 3가지
- 숫자를 다른 형태의 숫자로 변환
- 다른 자료형을 문자로 변환
- 문자를 다른 자료형으로 변환
1. 숫자 -> 숫자(int, float)
- 숫자를 다른 숫자의 형태로 바꾸는 방법
int x = 10;
float y = 10.0f;
int z = x + (int)y; // 사용하고 싶은 변수 앞에 변경하고 싶은 괄호하고 자료형 명시
- float -> int
int x = 10;
float y = 10.0f;
float z = (float)x + y; // 사용하고 싶은 변수 앞에 변경하고 싶은 괄호하고 자료형 명시
- int -> float
- 데이터의 손실이 없는 경우라면 앞에 괄호로 형태를 명시하지 않더라도 캐스팅이 가능
- float 1.5f를 int 1로 바꾸려면 0.5의 값이 사라지기 때문에 명시해야 함
- int 1을 float 1.0f로 바꾸려면 누락될 값이 없어 그냥 사용해도 됨
2. 다른 자료형 -> 문자
- 숫자나 bool을 문자로 바꾸는 방법
- 간단하게 뒤에 .ToString을 붙이면 변환할 수 있다.
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"
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
- Convert를 사용해 각각의 자료형으로 변환하는 방법
- 형변환 리스트
- Parse() 함수 이용
string iStr = "10";
int x;
x = int.Parse(iStr); // x : 10
string bStr = "true";
bool b;
b = bool.Parse(bStr); // b : true
- Convert와 parse() 함수를 이용하면 변환한 값을 받아올 수 있다.
- 문제는 변환할 수 없는 값일 때 생김
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 x;
int.TryParse(iStr, out x); // x : 10
string bStr = "true";
bool b;
bool.TryParse(bStr, out b); // b : true
- out 개념은 어려우므로 이후 메모리 부분을 참고하자. 일단은 모양만 보자
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 = bool.TryParse(bStr, out b); // isSuccess : false
- 기존 방법과 다른 점은 반환값으로 캐스팅한 값을 받지 않는다.
- 반환값은 bool만 받으며 캐스팅이 성공했는지 알려준다.
변수 - 용어 정리
- 개발에 익숙해지기 위해 몇 가지 용어를 더 알아보자.
선언
int x;
- 변수를 처음에 만드는 것을 '선언'한다고 함
- 생성한다, 선언한다 둘 다 많이 사용됨
할당
int x = 10;
- 변수에 데이터를 넣어주는 것을 '할당'한다고 함
초기화
int x = 10; <- 처음 데이터가 들어갔을 때 초기화했다고 한다.
x = 21;
x = 31;
- 맨 처음 데이터를 항당하는 것을 '초기화'한다고 함
데이터
- 변수에 문자나 숫자가 들어갔을 때 '데이터'라고 함
- 더 다양한 말로는 '데이터', '값', '리터럴' 등이 있다.
변수의 규칙 - 생성과 사용
- 변수에 값을 저장하려면 먼저 생성을 해야 함
- 변수를 생성하는 것과 값을 저장하는 부분을 구분하려면, 변수 앞에 데이터 형식을 붙였는지로 확인하면 된다.
- 위 예시를 보면 1번에는 데이터 형식 string이 붙어있다.
- 이 순간 변수를 만들고 데이터를 저장하는 것
- 하지만 2번에는 데이터 형식이 없다.
- 여기서는 단순히 이미 만들어진 변수에 데이터만 저장하게 됨
- 데이터를 저장하기 전에 만들어진 변수가 없아면 에러가 발생함
- 변수를 만들기 전에 Console을 사용하면 에러가 발생함
- 변수를 만들고 데이터를 저장 안하고 사용하면 에러가 발생함
- 결론은 단순하다.
- 변수를 만든다.
- 데이터를 저장한 이후 활용한다.
변수의 규칙 - 이름 만들기
- 변수는 원하는 이름으로 만들어도 되지만 몇 가지 규칙이 있다.
변수 만들기의 재료
- 변수를 만드려면 타입과 변수 이름을 모두 입력해야 한다.
- 둘 중 하나라도 없으면 에러 발생
- 한 공간에서 같은 이름의 변수는 만들 수 없다.
- codingClub이라는 변수 2개를 만들었지만 에러가 발생한 걸 볼 수 있다.
- 같은 이름의 변수는 1개만 만들 수 있음
- '한 공간'이라는 것은 이후에 다시 자세하게 언급된다.
- 대소문자를 구분한다.
- 대소문자가 달라도 변수를 만들수는 있다.
- 다만 이렇게 만들면 각 변수가 어떤 의미를 가지는지 혼란스러울 수 있다.
- 대소문자 구분은 변수를 여러 개 만들 때가 아닌, 코딩 스탠다드에 의해서 사용하는 게 좋다.
- 사용할 수 있는 문자는 정해져 있다.
- 영어 대/소문자
- 숫자 (맨 앞에 오면 에러)
- 언더바 (_)
- 한글은 코딩 스탠다드 적용이 힘들고 협업에서도 비효율적이라 사용하지 않는 걸 추천
'개념 정리' 카테고리의 다른 글
[C#] 조건문 - if, else, else if, switch case, &&, || (0) | 2025.02.05 |
---|---|
[C#] 연산자 - 산술 연산, 논리 연산, bool, 비트 연산 (0) | 2025.02.05 |
[Git] GitHub의 구조와 기능 (1) | 2025.02.03 |