C#

[C#]타입 변환 및 타입 캐스팅(Type Conversion and Type Casting)

DevStory 2022. 6. 21.

타입 변환 및 타입 캐스팅

타입 변환 또는 타입 캐스팅은 데이터 타입을 다른 데이터 타입으로 변경하는 작업이라고 말할 수 있습니다. 타입 변환은 두 데이터 타입이 서로 호환될 경우에만 가능하며, 호환되지 않은 경우 InvalidCastException 예외가 발생합니다.

변수는 선언 후 다른 데이터 타입으로 다시 선언할 수 없습니다. 따라서 변수의 타입과 다른 타입의 값을 변수에 할당할 수 없습니다.

예를 들어 다음 예제를 살펴봅시다. C#에서 int 타입으로 선언된 변수는 정수형 값만 가질 수 있습니다. 문자열 값은 int 타입에 호환되는 값이 아니므로 다음과 같이 오류가 발생합니다.

class Program
{
  static void Main(string[] args)
  {
    int num = 10;
    num = "Hello";
  }
}

오류 내용

[C#]타입 변환 및 타입 캐스팅(Type Conversion and Type Casting) - undefined - 타입 변환 및 타입 캐스팅

그러나 프로그램을 개발하다 보면 변수의 값을 다른 타입으로 선언된 변수에 할당해야 하는 상황이 발생합니다. 예를 들어, int 타입으로 선언된 변수의 값을 string 타입으로 선언된 변수에 할당해야 합니다. 이러한 경우 int 타입으로 선언된 변수의 값을 string 타입으로 변환하는 작업이 필요합니다.

int 타입의 값을 string 타입으로 변환하는 작업을 타입 변환 또는 타입 캐스팅이라고 합니다.


타입 캐스팅 종류

타입 변환은 컴파일러에 의해 자동으로 수행되거나 개발자가 명시적으로 수행할 수 있습니다. 컴파일러에 의해 자동으로 수행되는 타입 변환을 암시적 타입 변환(Implicit Type Conversion)이라고 하며, 개발자가 명시적으로 수행하는 경우 명시적 타입 변환(Explicit Type Conversion)이라고 합니다.


암시적 타입 변환

암시적 타입 변환은 컴파일러에 의해 자동으로 수행되므로 데이터 손실은 없으며, 안전하게 처리됩니다. 여기서 타입 변환은 작은 데이터 타입에서 더 큰 데이터 타입으로, 파생 클래스에서 기본 클래스로 변환됩니다.

암시적 타입 변환은 다음과 같은 경우 발생합니다.
1. 두 데이터 타입은 호환됩니다.
2. 더 작은 데이터 타입의 값을 더 큰 데이터 타입에 할당하는 경우입니다.

데이터 타입 크기
byte < short < int < long < float < double

암시적 타입 변환 예제

다음 예제를 통해 암시적 타입 변환을 이해해봅시다. 다음 예제는 intNum이라는 int 타입의 변수를 선언하였습니다. double 타입의 doubleNum 변수에 intNum을 할당합니다. 즉, int 타입 변수의 값을 double 타입 변수의 값에 할당합니다. 이러한 경우 컴파일러에 의해 자동으로 타입 변환이 발생합니다.

class Program
{
  static void Main(string[] args)
  {
    int intNum = 10;
    double doubleNum = intNum;

    Console.WriteLine("intNum의 값: " + intNum);
    Console.WriteLine("intNum의 데이터 타입: " + intNum.GetType());

    Console.WriteLine("doubleNum의 값: " + doubleNum);
    Console.WriteLine("doubleNum의 데이터 타입: " + doubleNum.GetType());
  }
}

실행 결과

intNum의 값: 10
intNum의 데이터 타입: System.Int32
doubleNum의 값: 10
doubleNum의 데이터 타입: System.Double

위에서 설명했듯이 암시적 타입 변환은 더 작은 데이터 타입의 값을 더 큰 데이터 타입에 할당하는 경우 발생합니다. 다음 예제처럼 int 타입 변수의 값을 int 타입보다 더 작은 타입인 short 타입 변수의 값에 할당하는 경우 오류가 발생합니다.

class Program
{
  static void Main(string[] args)
  {
    int intNum = 10;
    short shortNum = intNum;
  }
}

오류 내용

[C#]타입 변환 및 타입 캐스팅(Type Conversion and Type Casting) - undefined - 암시적 타입 변환 - 암시적 타입 변환 예제


명시적 타입 변환

명시적 타입 변환은 개발자가 작성한 소스코드에 의해 수행되므로 더 큰 데이터 타입을 더 작은 데이터 타입으로 변환할 수 있으며 기본 클래스를 파생 클래스로 변환할 수 있습니다. 명시적 타입 변환은 안전하지 않으므로 타입 변환 과정에서 데이터가 손실되거나 오류가 발생할 수 있습니다.


명시적 타입 변환 예제

암시적 타입 변환에서 int 타입 변수의 값을 short 타입 변수에 할당하면 컴파일 오류가 발생하였습니다. 하지만, 다음 예제처럼 명시적 타입 변환을 수행하면 int 타입 변수의 값을 short 타입 변수에 할당할 수 있습니다.

class Program
{
  static void Main(string[] args)
  {
    int intNum = 10;
    short shortNum = (short)intNum; // 명시적 타입 변환

    Console.WriteLine("intNum의 값: " + intNum);
    Console.WriteLine("intNum의 데이터 타입: " + intNum.GetType());

    Console.WriteLine("shortNum의 값: " + shortNum);
    Console.WriteLine("shortNum의 데이터 타입: " + shortNum.GetType());
  }
}

실행 결과

intNum의 값: 10
intNum의 데이터 타입: System.Int32
shortNum의 값: 10
shortNum의 데이터 타입: System.Int16

다음 예제는 명시적 타입 변환으로 데이터가 손실되는 경우를 보여줍니다. double 타입 변수의 값을 int 타입에 할당하는 경우 int 타입은 정수형이므로 소수 데이터가 손실됩니다.

class Program
{
  static void Main(string[] args)
  {
    double doubleNum = 123.45;
    int intNum = (int)doubleNum;

    Console.WriteLine("doubleNum의 값: " + doubleNum);
    Console.WriteLine("doubleNum의 데이터 타입: " + doubleNum.GetType());

    Console.WriteLine("intNum의 값: " + intNum);
    Console.WriteLine("intNum의 데이터 타입: " + intNum.GetType());
  }
}

실행 결과

doubleNum의 값: 123.45
doubleNum의 데이터 타입: System.Double
intNum의 값: 123
intNum의 데이터 타입: System.Int32

Parse() 메서드

C#에서는 데이터 타입에 내장된 Parse() 메서드를 사용하여 타입 변환을 수행할 수 있습니다. 따라서, double 타입과 string 타입처럼 호환되지 않은 값을 변환해야 하는 경우 Parse() 메서드를 사용합니다.

class Program
{
  static void Main(string[] args)
  {
    string str = "123.456";
    double doubleNum = double.Parse(str);

    Console.WriteLine("str의 값: " + str);
    Console.WriteLine("doubleNum의 값: " + doubleNum);
  }
}

실행 결과

str의 값: 123.456
doubleNum의 값: 123.456

하지만, 다음과 같이 double 타입과 호환되지 않은 값을 Parse() 메서드로 변환하는 경우 런타임 오류가 발생합니다.

class Program
{
  static void Main(string[] args)
  {
    string str = "Hello";
    double doubleNum = double.Parse(str);

    Console.WriteLine("str의 값: " + str);
    Console.WriteLine("doubleNum의 값: " + doubleNum);
  }
}

오류 내용

[C#]타입 변환 및 타입 캐스팅(Type Conversion and Type Casting) - undefined - Parse() 메서드


정리

  • 값의 데이터 타입을 변환하는 과정을 타입 변환 또는 타입 캐스팅이라고 말합니다.
  • 타입 변환은 암시적 타입 변환과 명시적 타입 변환으로 분류됩니다.
  • 암시적 타입 변환은 컴파일러에 의해 처리되므로 안전합니다.
  • 명시적 타입 변환은 개발자에 의해 처리되므로 안전하지 않습니다.
반응형

'C#' 카테고리의 다른 글

[C#]다중 catch문, 다중 예외 처리  (0) 2022.06.26
[C#]예외 처리(Exception Handling)  (0) 2022.06.26
[C#]스레드 Join 메서드(Join Method of Thread)  (0) 2022.06.15
[C#]스레드 상태 확인  (0) 2022.06.06
[C#]파일 존재 여부 확인  (0) 2022.06.06

댓글