C#에서는 데이터 타입을 다른 타입으로 바꾸는 형식 변환(Type Conversion)이 자주 사용됩니다. 형식 변환은 크게 두 가지 방식으로 나뉩니다.
- 컴파일러가 자동으로 수행하는 암시적 형식 변환(Implicit Type Conversion)
- 개발자가 직접 지정하는 명시적 형식 변환(Explicit Type Conversion)
두 방식의 차이점을 예제 코드와 함께 자세히 살펴보겠습니다.
1. 암시적 형식 변환 (Implicit Type Conversion)
암시적 형식 변환은 C# 컴파일러가 타입 안전성(type-safe)을 보장하는 범위 내에서 자동으로 수행하는 변환입니다. 작은 범위의 데이터 타입에서 더 큰 범위의 데이터 타입으로 변환할 때 주로 발생하며, 데이터 손실의 위험이 없기 때문에 별도의 코드 작성 없이도 변환이 이루어집니다.
대표적인 예로 int를 long으로 변환하는 경우를 들 수 있습니다.
int val1 = 11000; int val2 = 35600; long sum; sum = val1 + val2;
위 코드에서 두 개의 int 변수를 더한 결과를 long 변수에 저장하고 있습니다. int보다 long이 표현할 수 있는 값의 범위가 넓기 때문에, 컴파일러가 오류 없이 자동으로 형식을 변환해 줍니다.
예제 코드
using System;
using System.IO;
namespace Demo {
class Program {
static void Main(string[] args) {
int val1 = 34567;
int val2 = 56743;
long sum;
// int끼리의 합을 long에 저장 → 암시적 변환 발생
sum = val1 + val2;
Console.WriteLine("Sum= " + sum);
Console.ReadLine();
}
}
}실행 결과:
Sum= 91310
별도의 변환 연산자나 함수를 사용하지 않았음에도 프로그램이 정상적으로 동작합니다. 이것이 바로 컴파일러가 처리해 주는 암시적 형식 변환입니다.
2. 명시적 형식 변환 (Explicit Type Conversion)
명시적 형식 변환은 개발자가 캐스트(cast) 연산자나 미리 정의된 변환 함수를 사용하여 직접 변환을 지정하는 방식입니다. 큰 범위의 타입에서 작은 범위의 타입으로 변환할 때처럼 데이터 손실 가능성이 있는 경우에는 컴파일러가 자동으로 변환해 주지 않으므로, 반드시 명시적으로 변환해야 합니다.
대표적인 예로 double을 int로 변환하는 경우를 살펴보겠습니다.
예제 코드
using System;
namespace Program {
class Demo {
static void Main(string[] args) {
double d = 1234.89;
int i;
// double을 int로 명시적 캐스팅
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}실행 결과:
1234
(int)d와 같이 캐스트 연산자를 사용하면 double 값이 int로 변환됩니다. 이때 소수점 이하 값(.89)은 잘려나가고 정수 부분만 남게 되므로, 결과값은 1234가 됩니다. 이처럼 명시적 변환은 데이터 손실이 발생할 수 있기 때문에 개발자가 그 책임을 직접 짊어지는 방식입니다.
정리: 암시적 vs 명시적 형식 변환 비교
| 구분 | 암시적 형식 변환 | 명시적 형식 변환 |
|---|---|---|
| 변환 주체 | 컴파일러가 자동 수행 | 개발자가 캐스트 연산자 등으로 직접 지정 |
| 변환 방향 | 작은 타입 → 큰 타입 (예: int → long) | 큰 타입 → 작은 타입 (예: double → int) |
| 데이터 손실 | 없음 (타입 안전성 보장) | 발생 가능 (소수점 버림 등) |
| 사용 문법 | 별도 문법 불필요 | (int)d 처럼 캐스트 연산자 사용 |
두 변환 방식의 특성을 이해하고 상황에 맞게 활용하면, 안전하면서도 효율적인 C# 코드를 작성할 수 있습니다.