3. Java 강좌, 변수(Variable) 2

2015. 1. 29. 20:00
저자 : 알 수 없는 사용자

변수 2


저번 포스팅에서 변수타입과 변수에대해서 알아보았는데요,

변수 타입의 종류 중에서 정수와 실수 타입은 최대값과 최소값이 있었습니다.

그렇다면 변수타입의 최대값을 넘기게 되면 어떻게 될까요?


가장 작은 변수타입인 byte를 사용하여 변수타입의 최대값을 넘었을 때 어떻게 되는지 확인해보겠습니다.



class Noname1
{
    public static void main(String[] args) 
    {
            byte number = 0;

for (int i = 0;i <= 300 ;i++ )

{

System.out.println(number++ + "\t" + i);

}

}

}

 

for 문의 사용법에 대해서는 다음에 포스팅하기로 하고 지금은 변수에 대해서만 배워보도록 하겠습니다.

위의 내용을 컴파일하게되면 byte의 변수타입을 가지고있는 number라는 변수와,

int 변수타입을 가지고있는 i라는 변수가 서로 동일하게 0부터 300까지 증가하는 결과를 확인할 수 있습니다.


byte 변수타입의 최소값은 -128, 최대값은 127입니다.

일단 컴파일과 실행이 되는 것으로 봐서는 변수의 최대값을 넘겨도 에러없이 실행되는것으로 확인됩니다.

그렇다면 변수는 어떻게되었을까요?

 

 

 

결과값을 아래로 내리다보면 -128과 128이 동시에 나타납니다.

byte변수타입이 저장할 수 있는 범위를 초과하여 오버플로우가 발생합니다. 변수타입의 최소값부터 다시 시작하게되죠.

 

연산 도중 변수타입의 범위를 넘길수는 있으나 변수의 최소값부터 다시시작하여 계산하게 됩니다.


이유를 알아보자면 1 byte는 이진수로 11111111(2)라는 값을 갖습니다.

이 값은 우리가 사용하는 10진수로 표현 될 때 255라는 값을 갖게 되는데요.

0부터 255 까지 총 256가지를 표현할 수 있습니다.


그런데 일반적인 byte는 음수 값이 있기 때문에 10000000(2) [-128] ~ 11111111(2) [-1] 까지를 나타내는데,

음수를 나타내기 위한 부호로 2진수 8자리중 맨 앞자리를 이용하므로 나타낼 수 있는 자리수는 -128 ~ 127까지입니다.


만약 01111111(2) [127]에서 1을 더 올린다면 어떻게 될까요?

10000000(2) [-128]이 되겠죠?

위의 과정에서 보이는 것이 바로 이런 이유로 나타나는 현상입니다.


만약 11111111(2) [-1]에서 1을 더 올린다면 100000000(2)가 되어야 한다고 생각하겠지만,

이런 경우 byte의 값이 한정되어 있기 때문에 맨 앞자리의 1은 버려지고 00000000(2) [0]이 됩니다.

이런 경우를 오버플로우라고 합니다.


이런 이유로 변수 타입의 범위를 넘는 값(-128 ~ 127)로는 변수를 초기화할 수 없습니다.

만약 초기화 하려고 하면 컴파일을 할 때 오류가 발생하게됩니다.


형 변환

 

프로그래밍을 하다보면 변수 타입이 다른 수를 연산하는 경우가 종종 생기곤 합니다.

무슨 말인지 모르겠다구요? 아래를 보시죠!


 

class Noname1

{

public static void main(String[] args)

{

int number = 0;

byte number2 = 10;

number = number2;

System.out.print(number);

}

}

 

위와같이 실행하게 되면, 오류없이 컴파일과 실행이 가능합니다.

변수타입이 다른 경우, 작은 변수 타입(byte)이 큰 변수 타입(int)으로 변환되는 것은 컴파일러가 알아서 변경해줍니다.


하지만 큰 변수 타입을 작은 변수타입으로 변환하려고 하게되면 컴파일 도중 오류가 출력됩니다.

 

 

class Noname1

{

public static void main(String[] args)

{

byte number = 0;

int number2 = 10;

number = number2;

System.out.print(number);

}

}

 

위의 코드는 위에서 봤던 코드에서 int와 byte의 위치만 바꾼 것입니다.

컴파일을 하게되면 byte 변수 타입인 number에 더 큰 int 변수 타입 number2가 들어갈 수 없다는 오류를 출력합니다.


그렇다면 int를 가진 number2의 자료형을 byte로 바꿔보겠습니다.

 


class Noname1

{

public static void main(String[] args)

{

byte number = 0;

int number2 = 10;

number = (byte)number2;

System.out.print(number);

}

}

 

위의 코드처럼 큰 변수 타입에서 작은 변수 타입으로의 변환은 직접 해줘야 합니다.

이를 형 변환(자료형 변환)이라고 하는데, 임시로 변수의 타입을 변환시켜 연산이 가능하게 해주게 되죠.


하지만 최대값을 초과하면 동일하게 오버플로우가 발생하니 주의해서 연산을 해야합니다.