전체 코드

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; //

        }
    }
}

1. 캐스팅(Casting) 개요

캐스팅(Casting)이란 특정 타입의 값을 다른 타입으로 변환하는 과정을 의미합니다.
C#에서는 암시적 캐스팅(Implicit Casting)명시적 캐스팅(Explicit Casting) 두 가지 방식이 존재합니다.

캐스팅 방식설명예제데이터 손실 가능성
암시적 캐스팅 (Implicit)작은 크기의 타입 → 큰 크기의 타입int → long / int → float❌ 없음
명시적 캐스팅 (Explicit)큰 크기의 타입 → 작은 크기의 타입double → int / int → short✅ 가능

2. 암시적 캐스팅 (Implicit Casting)

컴파일러가 자동으로 변환해 주는 안전한 캐스팅입니다.
작은 크기의 타입을 큰 크기의 타입에 넣을 때 가능합니다.

✅ 예제 1: 작은 바구니 → 큰 바구니

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: doublefloat보다 크므로 변환 가능.

📌 데이터 손실 없음

  • 큰 공간에 작은 데이터를 넣는 것이므로 안전하게 변환됨.

3. 명시적 캐스팅 (Explicit Casting)

큰 크기의 타입을 작은 크기의 타입으로 변환할 때 반드시 명시적 캐스팅을 사용해야 합니다.
이 과정에서 데이터 손실이 발생할 가능성이 있음.

✅ 예제 2: 큰 바구니 → 작은 바구니 (강제 캐스팅)

int a = 1000;  
short s1 = a;  // ❌ 에러 발생
short s2 = (short)a;  // ✅ 강제 변환 (가능하지만 데이터 손실 위험)
  • int(4 byte)를 short(2 byte)로 변환하려고 하면 크기가 맞지 않아 컴파일 에러 발생.
  • (short)a처럼 명시적 캐스팅을 사용하면 강제 변환 가능하지만, 데이터 손실 가능성이 있음.

✅ 예제 3: 오버플로우(Overflow) 발생

int a = 0x00FFFFFF;  // 4 byte (0x00FFFFFF = 16777215)
short b = (short)a;  // ✅ 강제 변환

Console.WriteLine(b);  // -1 (0xFFFF)
  • int(4 byte)의 값 0x00FFFFFFshort(2 byte)로 변환하면 하위 16비트(0xFFFF)만 남음.
  • 0xFFFF는 2의 보수법에 의해 -1로 해석됨.

📌 데이터 손실 가능

  • 0x00FFFFFF = 167772150xFFFF = -1로 변환됨.

4. 소수 변환 (실수형 캐스팅)

컴퓨터는 무한한 소수를 정확히 표현할 수 없으므로, 가장 근접한 근사값을 저장합니다.
이 때문에 실수끼리의 비교에 == 연산자를 사용하면 안 됨.

✅ 예제 4: 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)로 변환되면서 정밀도 차이가 발생.
  • floatdouble은 크기가 다르므로 비교할 때 == 연산자를 사용하면 안 됨.

✅ 예제 5: float → int 변환 (소수점 손실)

float f = 3.99f;
int i = (int)f;  // ✅ 강제 캐스팅

Console.WriteLine(i);  // 3 (소수점 이하 절삭)

📌 데이터 손실 발생

  • float → int 변환 시 소수점 이하가 삭제됨.
  • 3.993으로 변환됨 (반올림이 아님!).

6. 캐스팅 오류 방지 방법

Math.Round()를 사용한 반올림 변환

float f = 3.99f;
int i = (int)Math.Round(f);  // 반올림 후 변환

Console.WriteLine(i);  // 4

📌 소수점 손실을 방지하려면 Math.Round() 사용!

  • Math.Round(3.99)4로 변환됨.
profile
李家네_공부방

0개의 댓글