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 |
|---|---|
|
|
|
|
|
|
|
|
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 타입이야.
GO TO FULL VERSION