namespace CSharpGrammar
{
class Program
{
static void Main(string[] args)
{
// 큰 숫자를 작은 공간에 담을 수 없음
//int -> short로 변환불가
int a = 100;
short b = (short)a; // 불가 -> 따라서 캐스팅 문법 사용해야함
// 데이터가 손실될 가능성이 있음
float c = a;
int d = (int)c; // 불평을 함
// 실수에서 정수로 바뀌면 소수점이 날아가기 때문에
// 컴퓨터는 미리 에러를 뱉어줌
// 위험한 작업일 경우 확인 받기 위해 에러 반환
// 큰 -> 작은 데이터는 일부 숫자가 잘려서 들어감
// 작은 -> 큰으로 데이터를 옮기면 바꿔짐
a = b; //
}
}
}
캐스팅(Casting)이란 특정 타입의 값을 다른 타입으로 변환하는 과정을 의미합니다.
C#에서는 암시적 캐스팅(Implicit Casting)과 명시적 캐스팅(Explicit Casting) 두 가지 방식이 존재합니다.
| 캐스팅 방식 | 설명 | 예제 | 데이터 손실 가능성 |
|---|---|---|---|
| 암시적 캐스팅 (Implicit) | 작은 크기의 타입 → 큰 크기의 타입 | int → long / int → float | ❌ 없음 |
| 명시적 캐스팅 (Explicit) | 큰 크기의 타입 → 작은 크기의 타입 | double → int / int → short | ✅ 가능 |
컴파일러가 자동으로 변환해 주는 안전한 캐스팅입니다.
작은 크기의 타입을 큰 크기의 타입에 넣을 때 가능합니다.
int a = 1000; // 4 byte
long l = a; // 8 byte (가능)
float f = a; // 4 byte → 4 byte (가능)
double d = f; // 4 byte → 8 byte (가능)
int → long: int(4 byte)보다 long(8 byte)이 더 크므로 가능.int → float: 정수형(int)을 실수형(float)으로 변환할 때 자동 변환 가능.float → double: double이 float보다 크므로 변환 가능.📌 데이터 손실 없음
큰 크기의 타입을 작은 크기의 타입으로 변환할 때 반드시 명시적 캐스팅을 사용해야 합니다.
이 과정에서 데이터 손실이 발생할 가능성이 있음.
int a = 1000;
short s1 = a; // ❌ 에러 발생
short s2 = (short)a; // ✅ 강제 변환 (가능하지만 데이터 손실 위험)
int(4 byte)를 short(2 byte)로 변환하려고 하면 크기가 맞지 않아 컴파일 에러 발생.(short)a처럼 명시적 캐스팅을 사용하면 강제 변환 가능하지만, 데이터 손실 가능성이 있음.int a = 0x00FFFFFF; // 4 byte (0x00FFFFFF = 16777215)
short b = (short)a; // ✅ 강제 변환
Console.WriteLine(b); // -1 (0xFFFF)
int(4 byte)의 값 0x00FFFFFF를 short(2 byte)로 변환하면 하위 16비트(0xFFFF)만 남음.0xFFFF는 2의 보수법에 의해 -1로 해석됨.📌 데이터 손실 가능
0x00FFFFFF = 16777215 → 0xFFFF = -1로 변환됨.컴퓨터는 무한한 소수를 정확히 표현할 수 없으므로, 가장 근접한 근사값을 저장합니다.
이 때문에 실수끼리의 비교에 == 연산자를 사용하면 안 됨.
float → double 변환float f = 3.1414f; // 4 byte
double d = f; // ✅ 암시적 캐스팅 (정확한 값이 아님)
Console.WriteLine(d); // 3.1414000980652
📌 정확한 3.1414가 아님!
float(4 byte)로 표현 가능한 3.1414의 근사값이 double(8 byte)로 변환되면서 정밀도 차이가 발생.float과 double은 크기가 다르므로 비교할 때 == 연산자를 사용하면 안 됨.float → int 변환 (소수점 손실)float f = 3.99f;
int i = (int)f; // ✅ 강제 캐스팅
Console.WriteLine(i); // 3 (소수점 이하 절삭)
📌 데이터 손실 발생
float → int 변환 시 소수점 이하가 삭제됨.3.99 → 3으로 변환됨 (반올림이 아님!).Math.Round()를 사용한 반올림 변환float f = 3.99f;
int i = (int)Math.Round(f); // 반올림 후 변환
Console.WriteLine(i); // 4
📌 소수점 손실을 방지하려면 Math.Round() 사용!
Math.Round(3.99) → 4로 변환됨.