Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 JShell에서 정수 타입 변환(캐스팅)을 구현하는 방법

JShell은 Java 9에서 새롭게 도입된 명령줄 기반 대화형 도구입니다. main() 메서드를 선언하지 않고도 간단한 문장, 표현식, 변수, 메서드, 클래스, 인터페이스 등을 즉시 실행해 볼 수 있어 학습과 테스트에 매우 유용합니다.

JShell에서 컴파일러는 타입 캐스팅(typecasting) 문제가 발생할 가능성이 있으면 오류를 통해 개발자에게 경고합니다. 그럼에도 불구하고 개발자가 의도적으로 변환하려는 경우에는 명시적 캐스팅(explicit casting)이 필요합니다. 반대로 작은 데이터 값을 더 큰 타입에 저장하는 경우에는 별도의 지정 없이 암시적 캐스팅(implicit casting)이 자동으로 적용됩니다.

정수 타입 캐스팅의 두 가지 종류

  • 리터럴 → 변수 할당: 예를 들어 short s1 = 123456처럼 데이터가 해당 타입의 범위를 벗어나는 경우입니다. 이 문제는 컴파일 시점에 이미 알 수 있으며, 컴파일러가 오류를 표시합니다.
  • 변수 → 변수 할당: 예를 들어 s1 = i1과 같은 경우입니다. int 변수에 저장된 값 4567은 short 타입의 범위 안에 있으므로 컴파일러는 오류를 발생시키지 않습니다. 다만 잠재적인 데이터 손실을 방지하려면 s1 = (short) i1처럼 명시적 캐스팅으로 미리 처리하는 것이 안전합니다.

아래 코드 예제에서는 암시적 변환과 명시적 변환이 실제로 어떻게 동작하는지 확인할 수 있습니다.

C:\Users\User>jshell
|   Welcome to JShell -- Version 9.0.4
|   For an introduction type: /help intro

jshell> byte b = 128;
|   Error:
|   incompatible types: possible lossy conversion from int to byte
|   byte b = 128;
|           ^-^

jshell> short s = 123456;
|   Error:
|   incompatible types: possible lossy conversion from int to short
|   short s = 123456;
|            ^----^

jshell> short s1 = 3456
s1 ==> 3456

jshell> int i1 = 4567;
i1 ==> 4567

jshell> s1 = i1;
|   Error:
|   incompatible types: possible lossy conversion from int to short
|   s1 = i1;
|       ^^

jshell> s1 = (short) i1;
s1 ==> 4567

jshell> int num = s1;
num ==> 4567

위 실행 결과를 보면 범위를 초과하는 리터럴 할당(byte b = 128;, short s = 123456;)은 컴파일 오류가 발생하고, 변수 간 할당 시에도 손실 가능성이 있는 변환은 오류로 차단됩니다. 하지만 (short) i1과 같이 명시적으로 캐스팅하면 정상적으로 값이 저장되며, 큰 타입(int)에 작은 타입(short)의 값을 담는 int num = s1;은 암시적 변환으로 아무 문제없이 수행되는 것을 확인할 수 있습니다.