Java 에서 정수가 Byte 범위 내에 있는지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 정수 값이 byte 데이터 타입의 범위 내에 속하는지 확인하는 방법을 배우게 됩니다. 먼저, -128 에서 127 까지의 바이트 (byte) 의 정의된 범위를 이해하는 것으로 시작합니다.

그 다음, 정수를 이러한 바이트 (byte) 제한과 비교하여 유효한 범위 내에 있는지 확인하는 방법을 배우게 됩니다. 마지막으로, 정확성을 보장하기 위해 엣지 케이스 (edge case) 로 로직을 테스트할 것입니다.

Byte 범위 정의 (-128 ~ 127)

이 단계에서는 Java 의 byte 데이터 타입을 살펴보고 그 범위를 이해합니다. byte 데이터 타입은 Java 의 기본 데이터 타입 중 하나로, 작은 정수 값을 저장하는 데 사용됩니다.

byte 변수는 -128 부터 127 까지의 정수 값을 포함하여 저장할 수 있습니다. 이는 바이트 (byte) 가 8 비트의 메모리를 사용하고, 8 비트로 2^8 = 256 개의 서로 다른 값을 나타낼 수 있기 때문입니다. 이러한 값은 0 을 포함하여 음수와 양수로 나뉩니다.

byte 데이터 타입을 보여주는 간단한 Java 프로그램을 만들어 보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다 (아직 열려 있지 않은 경우).

  2. 파일의 전체 내용을 다음 코드로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            byte minByteValue = -128;
            byte maxByteValue = 127;
    
            System.out.println("Minimum byte value: " + minByteValue);
            System.out.println("Maximum byte value: " + maxByteValue);
        }
    }

    이 코드에서:

    • byte 변수 minByteValue를 선언하고 바이트 (byte) 의 최소 가능한 값인 -128 을 할당합니다.
    • 다른 byte 변수 maxByteValue를 선언하고 바이트 (byte) 의 최대 가능한 값인 127 을 할당합니다.
    • 그런 다음 System.out.println을 사용하여 이러한 값을 콘솔에 출력합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 이제 프로그램을 컴파일해 보겠습니다. WebIDE 하단의 터미널을 열고 ~/project 디렉토리에 있는지 확인합니다. 그런 다음 다음 명령을 실행합니다.

    javac HelloJava.java

    컴파일이 성공하면 아무런 출력도 표시되지 않습니다.

  5. 마지막으로, java 명령을 사용하여 컴파일된 프로그램을 실행합니다.

    java HelloJava

    byte가 가질 수 있는 최소 및 최대 값을 보여주는 다음 출력을 볼 수 있습니다.

    Minimum byte value: -128
    Maximum byte value: 127

이 프로그램은 Java 에서 byte 데이터 타입의 정의된 범위를 보여줍니다. 오버플로우 (overflow) 와 같은 잠재적인 문제를 방지하기 위해 변수에 적절한 데이터 타입을 선택할 때 이러한 제한을 이해하는 것이 중요합니다.

정수를 Byte 제한과 비교

이전 단계에서 byte 데이터 타입의 범위 (-128 ~ 127) 에 대해 배웠습니다. 이제 이 범위를 벗어나는 정수 값을 byte 변수에 할당하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

Java 에는 훨씬 더 큰 값을 저장할 수 있는 int와 같은 다른 정수 데이터 타입이 있습니다. 더 큰 값을 더 작은 컨테이너에 넣으려고 할 때 (예: int 값을 byte에 넣는 경우) 문제가 발생할 수 있습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다.

  2. main 메서드를 수정하여 바이트 (byte) 범위를 벗어나는 정수 값을 포함합니다. main 메서드 내부의 기존 코드를 다음으로 바꿉니다.

    public static void main(String[] args) {
        int largeIntValue = 200; // This value is outside the byte range
    
        // Trying to assign a large int value to a byte variable
        // byte myByte = largeIntValue; // This line will cause a compilation error
    
        System.out.println("Integer value: " + largeIntValue);
    
        // To assign a larger integer to a byte, you need a cast
        byte castedByte = (byte) largeIntValue;
        System.out.println("Casted byte value: " + castedByte);
    }

    변경 사항을 살펴보겠습니다.

    • int 변수 largeIntValue를 선언하고 byte가 가질 수 있는 최대 값 (127) 보다 큰 값인 200 을 할당합니다.
    • 주석 처리된 줄 byte myByte = largeIntValue;largeIntValuebyte에 직접 할당하려고 하면 어떻게 되는지 보여줍니다. 이는 Java 가 명시적으로 그렇게 하도록 지시하지 않고 잠재적으로 데이터를 잃는 것을 방지하기 때문에 컴파일 오류가 발생합니다.
    • byte castedByte = (byte) largeIntValue; 줄은 **타입 캐스팅 (type cast)**을 사용하여 할당을 강제하는 방법을 보여줍니다. largeIntValue 앞의 (byte)는 Java 에 int 값을 byte로 변환하도록 지시합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 이제 터미널에서 수정된 프로그램을 컴파일해 봅니다.

    javac HelloJava.java

    이번에는 타입 캐스트를 사용했으므로 컴파일이 성공해야 합니다.

  5. 컴파일된 프로그램을 실행합니다.

    java HelloJava

    다음 출력을 볼 수 있습니다.

    Integer value: 200
    Casted byte value: -56

castedByte 값이 200 이 아닌 -56 인 것을 확인하십시오. 이는 대상 타입의 범위를 벗어나는 값을 캐스팅하면 값이 "감싸지기 (wraps around)" 때문입니다. 이것을 오버플로우 (overflow)(또는 음수의 경우 언더플로우 (underflow)) 라고 합니다. 값 200 은 이진수로 표현되며, 8 비트 (바이트) 에 맞게 잘리면 -56 의 값이 됩니다.

이 단계는 데이터 타입 범위를 이해하고 오버플로우 또는 언더플로우로 인해 예기치 않은 결과를 피하기 위해 서로 다른 타입 간에 변환할 때 타입 캐스팅을 신중하게 사용하는 것의 중요성을 강조합니다.

경계값 테스트

이전 단계에서 byte 데이터 타입의 범위를 확인하고, 캐스팅을 사용하여 이 범위를 벗어나는 값을 할당하려고 할 때 어떤 일이 발생하는지 살펴보았습니다. 이제 byte 범위의 최소 및 최대 값 (-128 및 127) 과 이 범위를 살짝 벗어나는 값인 경계값 (edge case) 을 구체적으로 테스트해 보겠습니다.

경계값 테스트는 예상 값의 경계에서 코드가 올바르게 동작하는지 확인하기 위해 프로그래밍에서 흔히 사용되는 방법입니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다.

  2. main 메서드를 수정하여 바이트 (byte) 제한 주변의 값을 테스트합니다. main 메서드 내부의 기존 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            // Values within the byte range
            byte valueWithinRange1 = 0;
            byte valueWithinRange2 = 100;
            byte valueWithinRange3 = -50;
    
            System.out.println("Value within range 1: " + valueWithinRange1);
            System.out.println("Value within range 2: " + valueWithinRange2);
            System.out.println("Value within range 3: " + valueWithinRange3);
    
            // Edge cases
            byte minByte = -128;
            byte maxByte = 127;
    
            System.out.println("Minimum byte value: " + minByte);
            System.out.println("Maximum byte value: " + maxByte);
    
            // Values just outside the byte range (require casting)
            int valueJustBelowMin = -129;
            int valueJustAboveMax = 128;
    
            byte castedBelowMin = (byte) valueJustBelowMin;
            byte castedAboveMax = (byte) valueJustAboveMax;
    
            System.out.println("Value just below min (-129) casted to byte: " + castedBelowMin);
            System.out.println("Value just above max (128) casted to byte: " + castedAboveMax);
        }
    }

    이 코드에서는 다음을 테스트합니다.

    • 바이트 (byte) 범위 내의 값.
    • 바이트 (byte) 범위의 정확한 최소 및 최대 값.
    • 오버플로우/언더플로우의 영향을 확인하기 위해 캐스팅을 사용하여 최소 및 최대 범위를 살짝 벗어나는 값.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 터미널에서 프로그램을 컴파일합니다.

    javac HelloJava.java

    컴파일이 성공해야 합니다.

  5. 컴파일된 프로그램을 실행합니다.

    java HelloJava

    다음과 유사한 출력을 볼 수 있습니다.

    Value within range 1: 0
    Value within range 2: 100
    Value within range 3: -50
    Minimum byte value: -128
    Maximum byte value: 127
    Value just below min (-129) casted to byte: 127
    Value just above max (128) casted to byte: -128

범위를 살짝 벗어나는 값에 대한 출력을 관찰합니다.

  • -129 를 바이트 (byte) 로 캐스팅하면 127 이 됩니다. 이는 -129 가 최소 값 (-128) 보다 1 작고, 래핑 (wrap-around) 효과로 인해 최대 값 (127) 이 되기 때문입니다.
  • 128 을 바이트 (byte) 로 캐스팅하면 -128 이 됩니다. 이는 128 이 최대 값 (127) 보다 1 크고, 최소 값 (-128) 으로 래핑되기 때문입니다.

이는 byte와 같은 고정 크기 데이터 타입의 범위를 벗어나는 값을 캐스팅할 때 정수 오버플로우/언더플로우의 순환적 특성을 보여줍니다.

요약

이 Lab 에서는 Java 의 byte 데이터 타입의 기본 개념, 특히 -128 에서 127 까지의 정의된 범위를 이해하는 것으로 시작했습니다. 우리는 이 범위가 바이트를 나타내는 데 사용되는 8 비트에 의해 결정되며, 256 개의 고유한 값을 허용한다는 것을 배웠습니다. 실용적인 Java 프로그램을 통해 byte 변수가 가질 수 있는 최소 및 최대 값을 선언하고 출력하는 방법을 시연하여 정의된 범위를 확인했습니다. 이 초기 단계는 정수를 이러한 바이트 제한과 비교하고 경계값 (edge case) 으로 테스트하는 후속 단계를 위한 견고한 기반을 제공했습니다.