티스토리 뷰

tmp

c#마스터 - #5형변환

박스여우 2015. 9. 14. 09:56

 


안녕하세요 박스여우입니다.

c#마스터 5번째! 데이터의 형변환에 대해 알아보겠습니다.

 

우선, 형변환이란 무엇일까요?

형변환은 데이터를 다른 데이터 형식에 옮겨담는 것을 형식 변환(Type Conversion)이라고 합니다. 4번째 강의에서 살펴본 박싱,언박싱도 값 형식과 참조형식간의 형변환이라고 할수있습니다.

 

이번에 살펴볼 형식 변환은 5가지입니다.

1
2
3
4
5
6
- 크기가 서로 다른 정수 형식 사이의 변환
- 크기가 서로 다른 부동 소수점 형식 사이의 변환
- 부호 있는 정수 형식과 부호 없는 정수 형식사이의 변환
- 부동 소수점 형식과 정수 형식 사이의 변환
- 문자열과 숫자 사이의 변환
 
cs

 

 

 





크기가 서로 다른 정수 형식 사이의 변환

만약에 100ml짜리 물병에 10ml짜리에 담겨있는 물을 옮겨담으면 넘치는것 없이 정상적으로 담겨지게 되지만 그 반대의 경우 어떻게 될까요?

 

이때는 분명 10ml만큼의 양만 들어가고 나머지 90ml만큼의 물은 흘러 넘칠것입니다. 크기가 서로 다른 정수 형식 사이의 변환에서도 이런 담을수있는 크기때문에 데이터에 손상을 입을수 있습니다.

 

예를들어 작은 변수 int에서 long으로 옮겨담을땐 정상적으로 담겨지겠지만, long에서 int형으로 옮겨담을땐 오버플로우가 발생하여 데이터의 손상이 발생합니다. 같이 체크를 한뒤 Apply를 누르시면 됩니다. 그후 안드로이드 스튜디오를 재실행하면 끝!

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication57
{
    class Program
    {
        static void Main(string[] args)
        {
            int a;
            long b = long.MaxValue;
            a = (int)b;
            Console.WriteLine(a);
            Console.WriteLine(b);
        }
    }
}
 
cs


위의 경우, 꽉찬 상태의 long형의 변수b를 int 형의 변수 a에 옮겨담으려 하자, 데이터의 손상이 일어나 -1이 됩니다.

 

 

 

크기가 서로 다른 부동 소수점 형식 사이의 변환

float와 double형식의 부동소수점 형식의 특성상 오버플로우가 존재하지 않아서 정수의 형변환과같은 일은 일어나지 않습니다. 대신 정밀도에 손상을 입습니다.

 

float과 double형은 소수를 이진수로 메모리에 보관하기 때문에 표현하는 소수가 완전하지 못합니다. 예를들어 1/3은 0.333...의 무한 소수가 됩니다. 그래서 정밀한 수를 다뤄야 하는 프로그램에서 float와 double사이의 형변환은 조심해야합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication57
{
    class Program
    {
        static void Main(string[] args)
        {
            float a = 68.6875f;
            Console.WriteLine("a : {0}", a);
 
            double b = (double)a;
            Console.WriteLine("b : {0}", b);
 
            Console.WriteLine("69.6875 == b : {0}"69.6875 == b);
 
            float x = 0.1f;
            Console.WriteLine("x : {0}", x);
 
            double y = (double)x;
            Console.WriteLine("y : {0}", y);
 
            Console.WriteLine("0.1 == y : {0}"0.1 == y);
        }
    }
}
 
 

cs

 


위의 경우 float형에 담겨있던 69.6875는 손상없이 형변환에 성공했지만, 0.1은 0.100000001490116으로 변환되버렸습니다.

 

부호 있는 정수형과 부호 없는 정수형사이의 변환

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = -70;
            Console.WriteLine(a);
            uint b = (uint)a;
            Console.WriteLine(b);
        }
    }
}
 
 
cs


위의 출력결과는 -70과 4294967226이 출력됩니다. 부호없는 정수는 음수부를 정수부로 대신 사용하기에 형변환 과정중에 데이터가 뒤틀리게 됩니다.

 

부동 소수점 형식과 정수 형식 사이의 변환

부동 소수점 형식과 정수 형식 사이의 변환은 매우 편합니다! 소수점 아래부를 모두 자르고 위의부분만 정수형의 데이터에 담기게되어 다른 형변환보다는 비교적 간단합니다. 부동 소수점 형식과 정수 형식사이의 형변환에서 소수아래부분의 반올림따위! 없습니다!

 

 

마지막으로!

문자열을 숫자로, 숫자를 문자열로변환

문자열과 숫자사이의 변환은 기존의 형변환과는 다른과정이 필요합니다.c#에서는 문자열과 숫자사이의 형변환에 필요한 메소드들이 준비되어있어서 그 메소드들을 사용해야지만 형변환이 가능합니다.

1
2
3
4
5
int a = int.Parse( "789456" );
float b = float.Parse( "12.33" );
 
string c = a.ToString();
string d = b.ToString();
cs






문자열 데이터가 그대로 숫자를다루는 형식의 데이터에 들어가게 됩니다.

a=789456, b=12.33, c와 d는 a와 b의값을 그대로 문자열로 바뀝니다.

 

 

형변환은 여러분이 프로그래밍을 하는중에 많이 사용하지만, 데이터가 손상이 될수도 있는 작업이라 주의해서 사용해야합니다.

 

 

이상! 박스여우의 c#마스터 4번째! 형변환에 대해 알아보았습니다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함