[중요] 리플렉션 강좌 #1-1 (확장 변환과 손실 변환)

번외 강좌를 먼저 올립니다. 알아두면 유익한 내용이니 꼭 기억해 두시기 바랍니다.


손실 변환과 확장 변환은 제가 나름대로 이름을 붙인 현상이지만 분명히 기초 데이터 형식에서는 충분히 일어나는 일입니다. 쉬운 예로 부동소수에 대해서 이야기를 해봅시다.


System.Single 클래스는 일반적인 정밀도의 소수를 다룹니다. (C#에서는 float 라는 키워드를 가지고 있습니다.) 그리고 System.Double 클래스는 고밀도의 소수를 다룹니다. (C#에서는 double 키워드를 가지고 있습니다.) 이 둘 사이를 형변환한다고 생각해 봅시다.


System.Single에서 System.Double로 변환하는 일은 너무나도 쉽게 이루어집니다. 이유인 즉슨, Single 보다는 Double이 수용할 수 있는 정밀도가 훨씬 높기 때문입니다. 하지만 Double로 바뀌면서부터는 Single 때 다루었던 값을 다 처리하면서도 사용하지 않을 메모리를 더 소비합니다. 이것이 확장 변환입니다.


System.Double에서 System.Single로 변환하는 것은 그냥 변환할 경우 컴파일러가 정확한 캐스팅 연산자를 써달라고 이야기를 합니다. 그래서 흔히 생각없이 붙여줍니다. 그러면 잘 넘어갑니다. 여기까지는 문제가 없겠습니다. 하지만, Double이 다룰 수 있던 자릿수들이 Single로 넘어가면서 날아가 버리고 맙니다. 정밀한 수를 요구로 하는 프로그램에게 있어서는 치명타입니다. 이것이 손실 변환입니다.


또 다른 예로는 양수와 정수 사이의 변환입니다. 양수의 값을 정수로 옮기게 되면 양수 때 다룰 수 없었던 음수는 다룰 수 있게되지만 그만큼 양수로 다룰 수 있는 최대값을 잃어버립니다. 반대로 정수의 값을 양수로 옮기게 되면 음수를 다룰 수 없게 되지만 양수 범위로는 더 큰 수를 다룰 수 있습니다.


(주: 양수 계열은 CLS 표준이 아닙니다.)

댓글 남기기