전체 페이지뷰

2016년 12월 12일 월요일

C# 형식변환(Type Conversion)

서로 다른 형식의 데이터 간의 변환에 대해 알아보겠습니다.
이 때 늘 염두에 두어야 할 것은 최대값, 최소값을 넘어가는 범위의 변환을 할 떄 생기는 오버플로우, 언더플로우입니다.


정수 사이의 변환

using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            sbyte a = 127;
            int b = (int)a;
            int x = 128;
            sbyte y = (sbyte)x;
            Console.WriteLine("{0} {1} {2} {3}", a, b, x, y);
        }
    }
}
cs

결과)
127 127 128 -128

sbyte형 변수 a에 127이라는 수를 대입했습니다. 127은 sbyte의 MaxValue입니다.
이것을 int형 변수 b에 대입하기 위해서는 (int)a라는 형변환 과정을 거칩니다.
int는 sbyte보다 범위가 큰 정수이므로 아무 문제 없이 이 과정이 처리되나, 
sbyte의 범위를 넘는 128이라는 정수를 sbyte로 형변환하면 오버플로우가 발생하여 -128이 되는 참사가 벌어집니다.

부동 소수점 간의 변환

float, double 간의 변환에서는 오버플로우 대신 정밀성의 차이로 인해 수가 바뀌는 경우가 있습니다.

using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            float a = 12.2545f;
            double b = (double)a;
            Console.WriteLine(a);
            Console.WriteLine(b);
        }
    }
}
cs

결과
12.2545
12.2545003890991

전혀 다른 수가 되어 버리는 경우가 있으므로 주의하여야 합니다.

uint와 int 사이의 변환

주의할 부분은 음의 정수 입니다.
int a = -100;
uint b = (uint)a;
Console.WriteLine(a);
Console.WriteLine(b);
cs

이 부분이 실행되면 
-100
4294967196

이렇게 언더플로우가 나타나버립니다.

부동소수점과 정수 간의 변환

부동 소수점을 정수로 변환하면 소수점 아래의 수는 버립니다.
float a = 0.9f;
int b = (int)a;
double c = 1.8;
int d = (int)c;
cs

결과)
0.9 0 1.8 1

문자열과 숫자 간의 변환

지금까지의 ( )를 이용한 형식변환은 문자열과 숫자 사이에는 통하지 않습니다.
이 때 ToString(), Parse() 메소드를 사용합니다.

문자열을 숫자로 바꿀 때,
int a = int.Parse("123");
float b = float.Parse("1.23");
cs

숫자를 문자열로 바꿀 때,
int c = 123;
string d = c.ToString();
float e = 1.23f;
string f = e.ToString();
cs
처럼 사용합니다.

사실 문자열을 숫자로 바꾸는 방법에는 Parse()말고도 두 가지가 더 있습니다.
Convert 클래스를 이용하는 방법과 TryParse()를 이용하는 방법인데 약간씩 차이가 있습니다.
string s = "123";
int result;
bool success;
result = Convert.ToInt32(s);
success = Int32.TryParse(s, out result);
cs

Convert는 int말고도 모든형식에 대한 메소드가 존재합니다. 필요한것을 골라서 사용하면 됩니다. Parse()와 다른 것은 입력받은 문자열이 null일 때에 예외를 발생시키지 않고 0으로 반환한다는 점입니다.

TryParse는 false, true를 반환하면서 동시에 인자를 변환해서 내보냅니다.
변환 가능하면 true를 반환하고, 들어온 인자를 직접 변환해줍니다(인자를 직접 변환시키므로 out 키워드와 함께 쓰입니다).

댓글 없음:

댓글 쓰기