타입 변환
변수를 다른 데이터 형식의 변수에 옮겨 담는 것을 타입 변환(Type Conversion)이라고 한다. 주요 타입 변환 5가지는 다음과 같다.
-
크기(표현 범위)가 서로 다른 정수 타입 사이의 변환
-
크기(표현 범위)가 서로 다른 부동 소수점 타입 사이의 변환
-
부호 있는 정수 타입과 부호 없는 정수 타입의 변환
-
부동 소수점 타입과 정수 타입 사이의 변환
-
문자열과 숫자 사이의 변환
타입 변환의 간단한 예제 코드 2가지는 다음과 같다.
using System;
namespace ch3n4
{
public class IntegralConversion
{
public static void Main(string[] args)
{
sbyte a = 127;
Console.WriteLine(a);
int b = (int)a;
Console.WriteLine(b);
int x = 128; // sbyte 타입의 최대값 127보다 큰 수
Console.WriteLine(x);
sbyte y = (sbyte)x;
Console.WriteLine(y); // 오버플로 발생
}
}
}
using System;
namespace ch3n8
{
public class StringNumberConversion
{
public static void Main(string[] args)
{
int a = 123;
string b = a.ToString();
Console.WriteLine(b);
float c = 3.14f;
string d = c.ToString(); // 문자열 클래스에 구현된 내장 메소드 변환
Console.WriteLine(d);
string e = "1.2345";
float h = float.Parse(g); // 부동 소수 클래스에 구현된 내장 메소드 변환
Console.WriteLine(h);
}
}
}
암시적 변환
암시적 변환(Implicit Conversion)은 데이터의 손실이나 예외 발생의 위험이 전혀 없을 때 컴파일러가 자동으로 수행하는 변환으로 개발자가 별도로 코드를 작성할 필요가 없으며, 특징은 다음과 같다.
-
안정성: 항상 안전하며, 데이터 손실이 일어나지 않는다.
-
컴파일러 자동 처리: 별도의 캐스트 연산자가 필요 없다.
명시적 변환
명시적 변환(Explicit Conversion)은 데이터 손실이나 예외 발생의 위험이 있을 때 사용자가 캐스트 연산자를 사용하여 변환을 강제하는 방법이며, 특징은 다음과 같다.
-
위험성: 데이터 손실이나 런타임 예외(InvaildCastException)가 발생할 수 있다.
-
캐스트 연산자: 변환할 타입을 괄호 안에 넣어 명시한다.
주요 변환 관계는 다음과 같다.
-
숫자 타입: double -> int, long -> int, float-> byte 등 범위가 축소되는 경우
-
참조 타입: 부모 클래스 인스턴스를 자식 클래스 타입으로 변환하는 경우(안전하지 않을 수 있다.)
as 및 is 연산자
참조 타입(클래스, 인터페이스 등) 변환 시 사용하며, 명시적 케스팅의 위험을 줄인다.
-
is 연산자: 객체가 특정 타입인지 확인한다.
-
as 연산자: 안전하게 캐스팅을 시도한다. 변환에 실패하면 예외를 던지는 대신 null 반환한다. 값 타입에는 사용할 수 없다.
클래스나 구조체 정의 시 implicit 또는 explicit 키워드를 사용하여 해당 타입 간의 변환을 정의할 수 있다.
-
implicit operator: 안전한 변환을 정의한다.
-
explicit operator: 잠재적으로 안전하지 않은 변환을 정의하며, 명시적 캐스팅이 필요하다.