CodeGym /행동 /C# SELF /명시적 및 암시적 타입 변환

명시적 및 암시적 타입 변환

C# SELF
레벨 6, 레슨 5
사용 가능

1. 소개

혹시 수박을 병에 넣으려고 해본 적 있어? C#도 비슷한 상황을 자주 겪어. 한 타입의 변수를 다른 타입에 넣으라고 하면 말이지. 가끔은 쉬워 (작은 숫자를 큰 타입에 넣는 건 사과를 캐리어에 넣는 거랑 비슷), 근데 가끔은 조심해야 해 (수박을 병에 넣는 거처럼 — 그냥은 안 돼).

타입 변환은 한 데이터 타입의 값을 다른 타입으로 바꾸는 작업이야. 서로 다른 타입의 값을 더하거나 비교하거나, 특정 타입만 받는 메서드에 넘길 때 자주 필요하지.

실제로 프로그래머들은 이걸 맨날 겪어. 결제 처리, 할인 계산, 물리 계산, 아니면 키보드로 입력받은 숫자를 파싱할 때 (거긴 다 문자열로 들어오지).

2. 암시적 타입 변환 (Implicit Conversion)

이게 뭐냐고?

암시적 변환은 C#이 알아서 "이건 그냥 옮겨도 문제없겠다" 싶을 때 자동으로 타입을 바꿔주는 거야. 너가 따로 뭘 안 써도 돼, 그냥 값만 쓰면 돼.

  • 컴파일러가 에러 안 내.
  • 특별한 명령어나 cast 필요 없음.
  • 데이터 손실 없음 (거의 항상 그래).

암시적 변환 예시

int a = 42;
double b = a; // 암시적 변환 int -> double

Console.WriteLine(b); // 42 (이제 42.0이야)

여기서 a는 int 타입인데, b에 넣으면서 자동으로 double로 바뀌어. 데이터 손실 없음, 왜냐면 int 값은 다 double에 들어가거든.

여기서 a는 int 타입인데, b에 넣으면서 자동으로 double로 바뀌어. 데이터 손실 없음, 왜냐면 int 값은 다 double에 들어가거든.

언제 이렇게 되냐고?

  • 받는 타입이 더 넓은 범위를 지원할 때 — 더 넓은 데이터 범위를 커버할 때.
  • 데이터 손실이 없을 때.
  • 예시:
    • int → long
    • int → float / double
    • float → double
    • char → int

또 다른 예시:

byte x = 100;
int y = x; // byte -> int (byte 값은 전부 int 범위에 들어감)

숫자 타입의 암시적 변환 표

From To
byte
short, ushort, int, uint, long, ulong, float, double, decimal
int
long, float, double, decimal
float
double
char
ushort, int, uint, long, ulong, float, double, decimal

3. 명시적 타입 변환 (Explicit Conversion, Type Cast)

마법이 부족할 땐?

가끔은 컴파일러가 "이거 위험할 수도 있는데?"라고 생각해서, 네가 직접 책임진다고 알려줘야 해 — 즉, 네가 위험 감수하겠다고 명시적으로 써야 해.

  • 데이터가 손실될 수도 있어.
  • 값의 포맷이 바뀔 수도 있음.
  • 아예 변환이 안 될 수도 있고 — 그땐 에러 나지.

명시적 변환은 어떻게 쓰냐고?

괄호(cast) 문법을 써:

double pi = 3.1415;
int wholePi = (int)pi; // 명시적 변환 double -> int

Console.WriteLine(wholePi); // 3 (소수점 아래는 날아감!)

언제 쓰냐고?

  • 받는 타입이 더 좁은 범위일 때 — 받는 쪽의 값 범위가 더 좁음.
  • 소수점, 데이터 손실, 오버플로우 가능.
  • 예시:
    • double → int
    • long → int
    • int → byte
    • 거의 모든 호환 안 되는 타입 간 변환.

4. 예제로 알아보기

1) 데이터 손실? 직접 확인해보자!

암시적 변환 — 문제 없음!

int small = 25;
long big = small; // 암시적 변환 (int -> long)
Console.WriteLine(big); // 25

명시적 변환 — 위험 구역!

int big = 1000;
byte small = (byte)big; // 명시적 변환 (int -> byte)

Console.WriteLine(small); // 232 (!), 1000은 byte(0..255)에 안 들어감

참고::

여기서 결과가 "마법의" 232인 이유는 1000 % 256 == 232이기 때문이야.

2) 실수 타입 (double, float) 변환

double number = 9.99;
int approximate = (int)number; // 소수점 아래 그냥 버림

Console.WriteLine(approximate); // 9

3) 정수와 실수 변환 (double ↔ int)

int apples = 5;
double exactApples = apples; // int -> double (암시적)
Console.WriteLine(exactApples); // 5.0

double bananaWeight = 2.77;
int weightForReport = (int)bananaWeight; // double -> int (명시적)
Console.WriteLine(weightForReport); // 2

5. 문자열 변환은 어떻게? Parse 와 Convert

타입 변환은 숫자랑 문자열 사이에선 안 돼! 이럴 땐 특별한 메서드가 필요해, 예를 들면:

string strNumber = "123";
int num = int.Parse(strNumber); // 또는 Convert.ToInt32(strNumber);

반대로 (int → string)는 문자열 합칠 때 자동으로 돼:

int number = 42;
string message = "답: " + number; // 암시적 변환 int → string

6. 타입 변환 실수들

썰 하나: 누가 명시적 타입 변환을 깜빡해서, 최종 결제 금액이 250배나 적게 나왔던 적이 있었어... 학생들아, 조심하자!

자주 나오는 실수: 데이터 손실 가능성이 있는 타입을 암시적으로 바꾸려고 할 때.

int big = 500;
byte small = big; // 컴파일러: "안 돼! 데이터 손실 가능!"

여기선 명시적 변환이 필요해:

byte small = (byte)big; // 근데 데이터 날아갈 수도 있음!

또 다른 흔한 버그 — 소수점 아래를 깜빡함:

double x = 2.9;
int y = (int)x; // y == 2, 소수점 아래 사라짐

수학적으로 반올림하려면 Math.Round를 써:

int y = (int)Math.Round(x); // y == 3

7. 타입 변환 함정들

  • 데이터 손실. 값이 타입의 허용 범위를 넘지 않는지 꼭 확인해. 예를 들어, int는 -2 147 483 648부터 2 147 483 647까지, byte는 0–255만 가능해.
  • 반올림. 그냥 변환((int)x)은 소수점 아래를 버려. 제대로 반올림하려면 Math.Round, Math.Floor, Math.Ceiling을 써.
  • 숫자 리터럴. 3 / 2는 1 (정수 나눗셈), 3.0 / 2는 1.5 (double)가 돼!
  • 혼합 타입 연산. 예를 들어 int랑 double을 같이 쓰면, 결과는 double 타입이야.
2
과제
C# SELF, 레벨 6, 레슨 5
잠금
실수형 숫자를 정수로 반올림하기
실수형 숫자를 정수로 반올림하기
2
과제
C# SELF, 레벨 6, 레슨 5
잠금
데이터 손실이 있는 숫자 변환
데이터 손실이 있는 숫자 변환
1
설문조사/퀴즈
실수형 숫자, 레벨 6, 레슨 5
사용 불가능
실수형 숫자
정밀도 문제랑 특수 값들
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION