Machineboy空

C# 데이터 형식 변환(Type Convension) & Type Casting 본문

언어/C#

C# 데이터 형식 변환(Type Convension) & Type Casting

안녕도라 2025. 2. 25. 21:15

형식 변환(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