Machineboy空
C# 데이터 형식 변환(Type Convension) & Type Casting 본문
형식 변환(Type Convension)과 캐스팅(Casting)
- Casting and type convension are different ways of changing an expression from one data type to another.
Cast Operator(<type>)
// (int), (Random) 같은 형식의 것들
long l = 1000L;
int i = (int)l;
object o = (int)l;
Random r = (Random)o; // 이건 안되거든 is를 사용한 casting이 필요
- if types are not compatible, an instance of InvalidCastException is thrown
형식이 호환되지 않으면 예외가 발생한다.
- 숫자의 경우: 변환된 값을 받는 타입이 해당 값을 표현할 수 없음을 의미
- 구조체, 클래스의 경우: 반환하려는 타입이 다른 하나로부터 상속되어있어야 한다.
is Operator
- this is typically applied to reference and nullable types.
object o = new Rnadom();
if(o is Random rand)
{
int ii = rand.Next();
}
- if you need to detect the precise type of an object, is는 포괄적이다.
- 왜냐하면 클래스가 직간접적으로 상속받은 클래스나 인터페이스에 대해서도 true를 반환하기 때문!
typeof, GetType()
detect the precise type of an object
objcet o = new List<int>();
o is ICollection<int>; // true
o.GetType() == typeof(ICollection<int>); // false
o is List<int>; // true
o.GetType() == typeof(List<int>) // true
형식 변환(Type Convension)
변수를 다른 데이터 형식의 변수에 옮겨 담는 것을 형식 변환이라고 한다.
대표적인 다섯 경우를 살펴보자.
- 크가가 서로 다른 정수 형식 사이의 변환
- 크기가 서로 다른 부동 소수점 형식 사이의 변환
- 부호 있는 정수 형식과 부호 없는 정수 형식 사이의 변환
- 부동 소수점 형식과 정수 형식 사이의 변환
- 문자열과 숫자 사이의 변환
크가가 서로 다른 정수 형식 사이의 변환
- 작은 정수 형식의 변수에 있는 데이터 ➡ 큰 정수 형식의 변수에 있는 데이터 : 문제 없음
- 큰 정수 형식의 변수에 있는 데이터 ➡ 작은 정수 형식의 변수에 있는 데이터 : 문제 발생할 우려가 있음
// sbyte = 1byte(8bit) 최대값이 127
// int = 4byte(32bit)
sbyte a = 127;
int b = (int)a; // 작은 데이터를 큰 데이터에 대입하는 것은 문제가 없다
int x = 128;
sbyte y = (sbyte)x; // 큰 데이터를 작은 데이터에 대입하려고 할 때 문제 발생 (오버플로)
크기가 서로 다른 부동 소수점 형식 사이의 변환
- 정밀성에 손상을 입는다.
- float과 double은 소수를 2진수로 보관한다.
- float ↔ double 변환시, 10진수로 복원한 다음 다시 2진수로 변환해서 기록하게 된다.
// CASE 1
float a = 69.6875f;
double b = (double)a;
// 2진수로 저장된 a의 값을 10진수로 복원한 다음 다시 2진수로 바꾸어 double에 저장
// b = 69.6875
// CASE 2
float x = 0.1f;
double y = (double)y;
// y = 0.1000000149...
double로 변환시킨 float값이 서로 같지 않아질 수 있음.
부동 소수점 형식과 정수 형식 사이의 변환
- 부동소수점 형식 ➡ 정수 형식 : 소수점 아래는 버린다.
- 0.9 ➡ 0
- 0.1 ➡ 0
- 반올림이 이루어지지 않는다.
float a = 0.9f;
int b = (int)a; // 0
float c = 1.1;
int d = (int)c; // 1
문자열을 숫자로, 숫자를 문자열로
- 문자열 ➡ 숫자 : Parse()
- 숫자 ➡ 문자열 : ToString()
float c = 3.14f;
string d = c.ToString(); // 3.14
string g = "1.2345";
float h = float.Parse(g); // 1.2345f
예제

https://exercism.org/tracks/csharp/exercises/secure-munchester-united/edit
Exercism
Learn, practice and get world-class mentoring in over 50 languages. 100% free.
exercism.org
'언어 > C#' 카테고리의 다른 글
C# 메소드 오버로딩(Overloading) (0) | 2025.02.28 |
---|---|
C# 자원 해제(Resource Clean up) try~catch, finally, using Dipose() (0) | 2025.02.26 |
C# - 부동소수점형식 float, double (0) | 2025.02.25 |
C# - Overflow, Underflow, 오버플로, 언더플로, StackOverflow, checked (0) | 2025.02.25 |
C# Property 프로퍼티 get, set (0) | 2025.02.20 |