FourthWay 2023. 2. 7. 20:44
728x90
반응형

■형 변환

계산 중에 발생하는 형 변환

정수끼리 계산하면 그 결과는 정수가 된다고 결정되어 있다.

이 때문에 사람이 보기에 이상하게 계산되는 일들이 발생한다.

ex)

3➗2의 결과를 구한다(틀림) >>>>>> 3(정수) / 2(정수) = 1(정수)

→ 소수점을 제외하고 정수값만이 몫으로 나와있음. (정수가 되도록 자동으로 소수점 이하가 잘림)

 

정확한 답을 구하기 위해서는 실수로 표기하며 계산해야 한다.

3➗2=의 결과를 구한다(맞음) >>>>> 3.0(실수) / 2.0(실수) = 1.5(실수)

→정확한 답 1.5를 구하기 위해서는 실수로 표기하며 계산해야 한다.

 

코딩 ex)

using System;

class Type
{
  static void main()
  {
   Console.WriteLine("3÷2=" + 3 / 2);
   Console.WriteLine("3.0÷2.0=" + 3.0 / 2.0);
   Console.WriteLine("3.0÷2=" + 3.0 / 2);
   Console.WriteLine("3÷2.0=" + 3 / 2.0);
  }
}

정수끼리의 계산에서 범위가 가장 큰 범위의 형으로 변환된다.

 

short s = 536;

byte b = 12; <-- byte의 범위는 -128~127

int a = s + b; <-- short 형으로 변환된 548이 int형 인수 a에 대입됩니다.

 

정밀도나 범위가 서로 다른 형끼리의 대입

정수형을 실수형에 대입(ture)

int i = 9;

float f= i;

 

실수형을 정수형, decimal형에 대입(false)

double d = 2.8;

long 1 = d;

 

decimal형을 실수에 대입(false)

decimal d = 29;

float 1 = i;

 

범위가 더 큰 형에 대입(true)

byte i = 10;

int f = i;

 

범위가 더 작은 형에 대입(false)

long d = 35;

short 1 = d;

 

수치형을 문자형에 대입(false)

int d = 41;

char 1 = d;

 

범위가 감당할 수 없는 형에 대입(false)

byte d = 74;

sbyte 1 = d;

 

**false 일 때는 컴파일 오류가 됩니다.

 

 

캐스트연산자

'(int)'와 같이 형명을 () 괄호로 묶은 것을 캐스트연산자(형 변환 연산자)라고 한다.

수치 등 호환성이 있는 형인 경우 이것을 값이나 변수의 앞에 쓰면 지정한 형으로 변환할 수 있다.

이 조작을형환이라고 한다.

 

코딩 ex)

using

class Cast
{
  static void Main()
  {
   Console.WriteLine("3÷2=" + (float) 3/2); //float형으로 변환
   Console.WirteLine("3÷2=" + 3 /(float)2); //float형으로 변환
  }
}

//출력
3÷2 = 1.5
3÷2 = 1.5

 

checked, unchecked 문

변수에 선언된 데이터형의 범위보다 큰 값이 대입되어 자리가 넘치는 것을 오버플로 라고한다.

오버플로를 일으키면 이상한 값이 결과로 반환된다. 다양한 처리 과정에서 반환된 값이 이상해도 알아차리기 힘들다.

 

그래서 오버플로 했을 때 예외를 발생시키는 checked문이라는 것이 있다. 반대로 오버플로해도 무시하고,

아무것도 알리지 않은 채 결과를 반환하는 unchecked문도 있다.

기본 값에는 unchecked 상태로 설정되어 있다.

 

코딩 ex)

using System;

class CheckedSample
{
 static void Main()
 {
  int a, b;
  try
  {
    checked
    {
      a = int.MaxValue;     //int.MaxValue는 int의 최댓값이다. 1을 더함으로써 오버플로를발생시킨다
      b = a + 1;		//int.MaxValue는 int의 최댓값이다. 1을 더함으로써 오버플로를발생시킨다
      Console.WriteLine(b);
     }
    }
    catch(OverflowException oe) // 오버플로우시 예외처리
    {
     Console.WriteLine(oe.Message);
    }
  }
 }
}

//출력
산술 계산 결과, 오버플로우가 발생 했습니다.

checked를 지정 한 경우 오버플로 한 경우에 수행하는 예외 처리도 작성해 둬야 한다.

unchecked문은 오버플로 해도 예외가 발생하지 않으므로 예외처리가 필요하지 않다.

728x90
반응형