소개
이 랩에서는 Java 에서 정수 값이 short 데이터 타입의 범위 내에 속하는지 확인하는 방법을 배우게 됩니다. 먼저 short의 정의된 범위 (-32768 ~ 32767) 를 이해하고, 이 한계에 대해 정수 값을 검증하는 방법을 살펴보겠습니다. 마지막으로, 경계 값을 효과적으로 처리하는 방법을 탐구할 것입니다.
이 랩에서는 Java 에서 정수 값이 short 데이터 타입의 범위 내에 속하는지 확인하는 방법을 배우게 됩니다. 먼저 short의 정의된 범위 (-32768 ~ 32767) 를 이해하고, 이 한계에 대해 정수 값을 검증하는 방법을 살펴보겠습니다. 마지막으로, 경계 값을 효과적으로 처리하는 방법을 탐구할 것입니다.
이 단계에서는 Java 의 short 데이터 타입을 살펴보고 그 범위를 이해합니다. 프로그래밍에서 데이터 타입은 변수가 가질 수 있는 다양한 유형의 데이터를 분류하는 데 사용됩니다. short 데이터 타입은 16 비트 부호 있는 2 의 보수 정수입니다. 즉, 특정 범위 내에서 양수와 음수 모두 정수를 저장할 수 있습니다.
Java 에서 short의 범위는 -32,768 에서 32,767 까지입니다. 이러한 한계를 이해하는 것은 데이터 타입의 범위를 벗어난 값을 저장하려고 할 때 발생하는 오버플로우 (overflow) 또는 언더플로우 (underflow) 와 같은 오류를 방지하는 데 중요합니다.
short 데이터 타입을 실제로 확인하고 그 한계를 관찰하기 위해 간단한 Java 프로그램을 만들어 보겠습니다.
WebIDE 편집기에서 HelloJava.java 파일을 엽니다 (아직 열려 있지 않은 경우).
파일의 전체 내용을 다음 코드로 바꿉니다.
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 을 할당합니다.maxShort와 minShort를 선언하고 short가 가질 수 있는 최대값과 최소값을 할당합니다.System.out.println()을 사용하여 이러한 변수의 값을 콘솔에 출력합니다.파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
이제 프로그램을 컴파일해 보겠습니다. WebIDE 하단의 터미널을 열고 ~/project 디렉토리에 있는지 확인합니다. 그렇지 않은 경우 cd ~/project 명령을 사용합니다. 그런 다음 javac 명령을 사용하여 코드를 컴파일합니다.
javac HelloJava.java
오류가 없으면 컴파일이 성공적으로 완료되고 HelloJava.class 파일이 ~/project 디렉토리에 생성됩니다.
마지막으로, java 명령을 사용하여 컴파일된 프로그램을 실행합니다.
java HelloJava
터미널에 다음 출력이 표시됩니다.
My short variable: 10000
Maximum short value: 32767
Minimum short value: -32768
이 출력은 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 프로그램을 수정하여 이를 시연해 보겠습니다.
WebIDE 편집기에서 HelloJava.java 파일을 엽니다.
기존 코드를 다음으로 바꿉니다.
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) 보다 작습니다.파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
이제 터미널에서 수정된 프로그램을 컴파일합니다.
javac HelloJava.java
이번에는 타입 캐스팅을 사용했으므로 컴파일이 성공해야 합니다.
컴파일된 프로그램을 실행합니다.
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 프로그램을 마지막으로 수정해 보겠습니다.
WebIDE 편집기에서 HelloJava.java 파일을 엽니다.
기존 코드를 다음으로 바꿉니다.
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 + 1은 int를 생성합니다. 이를 overflowInt에 저장합니다.overflowInt를 다시 short로 캐스팅하고 overflowShort에 저장합니다. 여기서 오버플로우가 발생하고 값이 감싸집니다.short 값 (minShort) 에 대해 유사한 연산을 수행하여 1 을 빼서 언더플로우를 시연합니다.파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
터미널에서 프로그램을 컴파일합니다.
javac HelloJava.java
컴파일된 프로그램을 실행합니다.
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 프로그램을 통해 저장할 수 있는 최대값과 최소값을 시연했습니다. 이 기본적인 단계는 이 범위 내에서 정수 값으로 작업할 때 잠재적인 오버플로우 또는 언더플로우 오류를 방지하는 데 중요합니다.