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

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 정수 값이 short 데이터 타입의 범위 내에 속하는지 확인하는 방법을 배우게 됩니다. 먼저 short의 정의된 범위 (-32768 ~ 32767) 를 이해하고, 이 한계에 대해 정수 값을 검증하는 방법을 살펴보겠습니다. 마지막으로, 경계 값을 효과적으로 처리하는 방법을 탐구할 것입니다.

Short 범위 설정 (-32768 ~ 32767)

이 단계에서는 Java 의 short 데이터 타입을 살펴보고 그 범위를 이해합니다. 프로그래밍에서 데이터 타입은 변수가 가질 수 있는 다양한 유형의 데이터를 분류하는 데 사용됩니다. short 데이터 타입은 16 비트 부호 있는 2 의 보수 정수입니다. 즉, 특정 범위 내에서 양수와 음수 모두 정수를 저장할 수 있습니다.

Java 에서 short의 범위는 -32,768 에서 32,767 까지입니다. 이러한 한계를 이해하는 것은 데이터 타입의 범위를 벗어난 값을 저장하려고 할 때 발생하는 오버플로우 (overflow) 또는 언더플로우 (underflow) 와 같은 오류를 방지하는 데 중요합니다.

short 데이터 타입을 실제로 확인하고 그 한계를 관찰하기 위해 간단한 Java 프로그램을 만들어 보겠습니다.

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

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

    public class HelloJava {
        public static void main(String[] args) {
            // Declare and initialize a short variable
            short myShort = 10000;
            System.out.println("My short variable: " + myShort);
    
            // Demonstrate the maximum value of short
            short maxShort = 32767;
            System.out.println("Maximum short value: " + maxShort);
    
            // Demonstrate the minimum value of short
            short minShort = -32768;
            System.out.println("Minimum short value: " + minShort);
        }
    }

    이 코드에서:

    • short 타입의 변수 myShort를 선언하고 값 10000 을 할당합니다.
    • 그런 다음 maxShortminShort를 선언하고 short가 가질 수 있는 최대값과 최소값을 할당합니다.
    • System.out.println()을 사용하여 이러한 변수의 값을 콘솔에 출력합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 이제 프로그램을 컴파일해 보겠습니다. WebIDE 하단의 터미널을 열고 ~/project 디렉토리에 있는지 확인합니다. 그렇지 않은 경우 cd ~/project 명령을 사용합니다. 그런 다음 javac 명령을 사용하여 코드를 컴파일합니다.

    javac HelloJava.java

    오류가 없으면 컴파일이 성공적으로 완료되고 HelloJava.class 파일이 ~/project 디렉토리에 생성됩니다.

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

    java HelloJava

    터미널에 다음 출력이 표시됩니다.

    My short variable: 10000
    Maximum short value: 32767
    Minimum short value: -32768

이 출력은 short 변수가 정의된 범위 내에서 예상 값을 보유하고 있음을 확인합니다. 다음 단계에서는 이 범위를 벗어난 값을 할당하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

정수를 short 제한과 비교하여 검증

이전 단계에서는 유효 범위 내에서 short 변수를 선언하고 사용하는 방법을 살펴보았습니다. 이제 short 범위를 벗어난 값을 short 변수에 할당하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

Java 에는 byte, short, int, long을 포함한 다양한 정수 데이터 타입이 있으며, 각 타입은 서로 다른 범위를 가지고 있습니다. int (정수) 는 32 비트 부호 있는 2 의 보수 정수이며, 범위는 -2,147,483,648 에서 2,147,483,647 까지입니다. 이 범위는 short의 범위보다 훨씬 큽니다.

더 큰 데이터 타입 (예: int) 의 값을 더 작은 데이터 타입 (예: short) 에 할당하려고 하면 Java 는 정보 손실의 가능성을 인지하고 있음을 명시적으로 알려야 합니다. 이를 **타입 캐스팅 (type casting)**이라고 합니다. 캐스팅하지 않으면 Java 는 실수로 데이터가 손실되는 것을 방지하기 위해 컴파일 오류를 발생시킵니다.

HelloJava.java 프로그램을 수정하여 이를 시연해 보겠습니다.

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

  2. 기존 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            int largeInt = 40000; // This value is outside the short range
    
            // Attempt to assign largeInt to a short variable without casting
            // short myShort = largeInt; // This line will cause a compilation error
    
            // To assign a value from a larger type, we need to cast it
            short myShort = (short) largeInt;
            System.out.println("Value of largeInt cast to short: " + myShort);
    
            int anotherLargeInt = -40000; // Another value outside the short range
            short anotherShort = (short) anotherLargeInt;
            System.out.println("Value of anotherLargeInt cast to short: " + anotherShort);
        }
    }

    이 업데이트된 코드에서:

    • short가 가질 수 있는 최대값 (32767) 보다 큰 값 40000 을 사용하여 int 변수 largeInt를 선언합니다.
    • 주석 처리된 줄 short myShort = largeInt;는 캐스팅 없이 어떤 일이 발생하는지 보여줍니다. – 컴파일 오류.
    • short myShort = (short) largeInt;int 값을 short로 캐스팅하는 방법을 보여줍니다. largeInt 앞의 (short)는 캐스트 연산자입니다.
    • 음수 값 anotherLargeInt(-40000) 에 대해서도 동일하게 수행합니다. 이는 short가 가질 수 있는 최소값 (-32768) 보다 작습니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

    javac HelloJava.java

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

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

    java HelloJava

    다음과 유사한 출력이 표시됩니다.

    Value of largeInt cast to short: -25536
    Value of anotherLargeInt cast to short: 25536

출력 값 (-25536 및 25536) 이 원래 값 (40000 및 -40000) 이 아님을 확인하십시오. 이는 대상 데이터 타입의 범위를 벗어난 값을 캐스팅하면 값이 "감싸지기 (wraps around)" 때문입니다. 이는 오버플로우 (overflow) (최대값을 초과하는 양수 값의 경우) 및 언더플로우 (underflow) (최소값을 초과하는 음수 값의 경우) 의 예입니다. 정확한 결과 값은 숫자가 이진수로 표현되는 방식에 따라 달라집니다. 이는 데이터 타입 범위를 이해하고 캐스팅을 신중하게 사용하는 것이 예상치 못한 결과를 피하는 데 중요한 이유를 보여줍니다.

경계값 처리

이전 단계에서 short 데이터 타입의 범위에 대해 배우고, 이 범위를 벗어나는 더 큰 정수 값을 캐스팅할 때 어떤 일이 발생하는지 살펴보았습니다. 또한 Java 가 short 범위의 경계 값 (-32768 및 32767) 을 정확히 어떻게 처리하는지 이해하는 것도 중요합니다.

경계 값으로 작업할 때는 특히 산술 연산을 수행할 때 주의해야 합니다. 최대값에 1 을 더하거나 최소값에서 1 을 빼면 오버플로우 (overflow) 또는 언더플로우 (underflow) 가 발생하여 값이 범위의 다른 쪽 끝으로 감싸질 수 있습니다.

이 경계 동작을 시연하기 위해 HelloJava.java 프로그램을 마지막으로 수정해 보겠습니다.

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

  2. 기존 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            short maxShort = 32767;
            System.out.println("Maximum short value: " + maxShort);
    
            // Adding 1 to the maximum short value
            // Note: The result of maxShort + 1 is an int by default
            int overflowInt = maxShort + 1;
            System.out.println("Maximum short + 1 (as int): " + overflowInt);
    
            // Casting the overflowed int back to short
            short overflowShort = (short) overflowInt;
            System.out.println("Maximum short + 1 (cast to short): " + overflowShort);
    
            short minShort = -32768;
            System.out.println("Minimum short value: " + minShort);
    
            // Subtracting 1 from the minimum short value
            // Note: The result of minShort - 1 is an int by default
            int underflowInt = minShort - 1;
            System.out.println("Minimum short - 1 (as int): " + underflowInt);
    
            // Casting the underflowed int back to short
            short underflowShort = (short) underflowInt;
            System.out.println("Minimum short - 1 (cast to short): " + underflowShort);
        }
    }

    이 코드에서:

    • 최대 short 값 (maxShort) 으로 시작합니다.
    • maxShort에 1 을 더합니다. 기본적으로 short (및 byte) 와 관련된 산술 연산은 int로 승격됩니다. 따라서 maxShort + 1int를 생성합니다. 이를 overflowInt에 저장합니다.
    • 그런 다음 overflowInt를 다시 short로 캐스팅하고 overflowShort에 저장합니다. 여기서 오버플로우가 발생하고 값이 감싸집니다.
    • 최소 short 값 (minShort) 에 대해 유사한 연산을 수행하여 1 을 빼서 언더플로우를 시연합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

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

    java HelloJava

    다음과 유사한 출력이 표시됩니다.

    Maximum short value: 32767
    Maximum short + 1 (as int): 32768
    Maximum short + 1 (cast to short): -32768
    Minimum short value: -32768
    Minimum short - 1 (as int): -32769
    Minimum short - 1 (cast to short): 32767

보시다시피, 최대 short 값 (32767) 에 1 을 더하고 다시 short로 캐스팅하면 최소값 (-32768) 으로 감싸집니다. 마찬가지로, 최소 short 값 (-32768) 에서 1 을 빼고 다시 short로 캐스팅하면 최대값 (32767) 으로 감싸집니다.

이 동작은 short와 같은 고정 크기 정수 유형으로 작업할 때 기억하는 것이 중요합니다. 오버플로우 또는 언더플로우로 인해 예기치 않은 결과가 발생하지 않도록 항상 데이터 타입의 범위를 염두에 두십시오.

요약

이 Lab 에서는 Java 의 short 데이터 타입에 대해 배우고, 16 비트 부호 있는 2 의 보수 특성과 -32,768 에서 32,767 까지의 특정 범위를 이해했습니다. short 변수를 선언하고 초기화하는 방법을 살펴보고 간단한 Java 프로그램을 통해 저장할 수 있는 최대값과 최소값을 시연했습니다. 이 기본적인 단계는 이 범위 내에서 정수 값으로 작업할 때 잠재적인 오버플로우 또는 언더플로우 오류를 방지하는 데 중요합니다.