프로그래밍 언어/자바

자바 4. 자료형-2

닉네임못짓는사람 2020. 8. 6. 14:05
반응형

저번 글에서 논리형과, 문자형, 정수형 자료형에 대해 알아봤습니다.

그럼 이번엔 이어서 실수형을 알아봐야 할 텐데,

그전에 오버플로와 언더플로에 대해서 먼저 알아보도록 하겠습니다.

오버플로와 언더플로


저번 글에서 우리는 각 자료형들이 표현할 수 있는 값의 범위를 알아보았습니다.

그런데 만약 이 값의 범위를 넘어가게 되면 어떻게 될까요?

public class example{
    public static void main(String[] args){
        int in = Integer.MAX_VALUE;
        System.out.print(in + 1);
    }
}

Integer.MAX_VALUE는 int자료형의 최댓값을 저장해놓은 상수입니다.

같은 원리로 최솟값, 그리고 다른 자료형들도 동일하게 최대, 최솟값을 구할 수 있습니다.

그럼 이제 코드로 다시 돌아가서, 위 코드를 다시 실행하면 어떻게 될 것 같나요?

음.. 아마 범위를 넘어갔으니 오류가 발생할 수도 있을 것 같네요.

그런데 제 예상과는 다르게 어떠한 값이 출력되긴 하는 걸 볼 수 있습니다.

여기서 암기력이 좋으신 분들이라면 이 값이 어떤 값인지 알아볼 수도 있을 것 같은데,

이 값은 바로 int자료형의 최솟값입니다.

우리는 int의 최댓값에서 1을 더했는데 어째서 최솟값이 나오게 된 걸까요?

 

우리가 사용하는 자료형들은 byte단위로 크기를 가지며, 1byte는 8bit와 같습니다.

이때 최상위비트(MSB)는 부호비트 이기 때문에 1byte는 -(2^7) ~ 2^8 - 1까지의 값만

표현할 수 있다고 전에 이야기했었습니다.

그런데 만약 여러분이 1byte의 최댓값을 입력했다고 생각해봅시다.

그러면 위와 같이 MSB를 제외한 모든 비트가 1로 채워지게 됩니다.

그런데 이때, 여기에 1을 더해보도록 합시다.

가장 오른쪽 비트에 1이 더해지면 올림수가 발생해서 값이 다음과 같이 변합니다.

그러면 이제 이 값을 컴퓨터는 어떻게 인식할까요?

컴퓨터 입장에선 최상위비트가 1이기 때문에 이 값을 음수라고 인식합니다.

따라서 위의 값을 10진수로 바꾸면 1byte의 최솟값인 -128이 됩니다.

이처럼 자신이 본래 사용해야 하는 bit, 즉 메모리 범위를 넘어가서

다른 곳을 침범하는 것을 바로 오버플로라고 이야기합니다.

 

그러면 이제 반대로 위에서 표현한 -128의 2진수에서 1을 빼보도록 합시다.

2진수의 뺄셈은 빼는 수, 즉 여기선 1의 2의 보수를 취한 뒤 두 값을 더해주면 됩니다.

이렇게 해주시면 결과값이 01111111, 즉 127이 되어 1byte의 최댓값이 되는데,

이러한 현상을 바로 언더플로라고 이야기하는 것입니다.

 

이런 식으로 정수형 자료형들은 원형으로 계속해서 값이 순환되는 형태로 만들어져 있습니다.

때문에 자신이 표현하고 싶은 값이 어떤 자료형의 범위에 속해있는지 주의해서 사용해야 합니다.

실수형 float, double


이번엔 자바의 실수형 자료형에 대해 알아보겠습니다.

실수형에는 float과 double두 가지가 있으며 각각 4byte, 8byte의 크기를 가집니다.

하지만 컴퓨터에서 정수와 실수는 저장 방식이 전혀 다르기때문에

실제 표현할 수 있는 값은 실수형 쪽이 더 큰 것을 저번 글의 표를 보고도 알 수 있을 것입니다.

실수의 경우는 부동소수점 방식으로 저장된다는 것을 기억해두시고, 기회가 되면 설명해보겠습니다.

 

이 둘의 큰 차이점은 표현 범위도 있겠지만, 중요한 것은 바로 정밀도입니다.

여기서 말하는 정밀도란 소수점 이하의 숫자의 개수를 몇 개까지 표현할 수 있느냐인데,

public class example{
    public static void main(String[] args){
        float f1 = 0.123456789123456789f;
        double db1 = 0.123456789123456789;
        System.out.print(f1 + "   " + db1);
    }
}

위 코드의 결과에서 볼 수 있듯이 float의 경우 소수점 이하 8자리까지 표현이 되는데,

반면 double의 경우 그 두배 정도의 자릿수를 표현할 수 있습니다.

따라서 정밀도가 더 높은 값을 구하고 싶다면 float보단 double을 사용해야 할 것입니다.

 

double의 경우 정수형의 int처럼 실수형의 기본 자료형입니다.

때문에 float변수에 값을 저장하기 위해선 long처럼 리터럴 끝에 f를 꼭 붙여주셔야 합니다.

 

이상으로 자료형에 대한 설명은 마치도록 하고, 다음엔 형 변환에 대해 알아봅시다.

감사합니다.

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 6. 연산자-1  (0) 2020.08.10
자바 5. 형변환  (0) 2020.08.07
자바 3. 자료형-1  (0) 2020.08.05
자바 2. 변수와 상수  (0) 2020.08.03
자바 1. 개발 툴 설치  (0) 2020.07.30