컴파일러가 자동으로 수행하는 유형 변환 java. Java 문자열을 다른 유형의 값으로 변환합니다. 예. 표현식에 int 변수 피연산자가 포함된 경우 바이트에서 int로 승격

문자열을 int 또는 boolean과 같은 다른 유형의 값으로 변환하거나 그 반대로 변환해야 하는 경우가 종종 있습니다. 허용된 규칙에 따르면 문자열 변환에 대한 책임은 다음과 같습니다. V다른 유형의 값은 해당 유형의 해당 메소드에 지정됩니다. 예를 들어 문자열을 int 유형의 값으로 변환하는 작업은 Integer 래퍼 클래스의 정적 메서드에 의해 수행됩니다. 다음 표에는 값을 문자열로 또는 그 반대로 변환할 수 있는 모든 유형과 해당 메서드가 나열되어 있습니다.

TYPE 변환 방법 - 문자열에서 변환하는 방법

라인으로

부울 String.valueOf(boolean) new.Boolean(String). 부울값()

바이트 String.valueOf(byte) Byte.parseByte(string, int)

짧은 String.valueOf(short) Short.parseShort(string, int)

int String.valueOf(int) Integer.parseInteger(string, int)

long String.valueOf(long) Long.parseLong(String, int)

float String.valueOf(float) Float.parseFloat(String)

double String.valueOf(double) Double.parseDouble(String)

문자열을 부울 값으로 변환하려면 부울 개체를 만든 다음 해당 값을 쿼리해야 합니다. 다른 모든 래퍼 클래스에는 해당 메서드가 포함되어 있습니다. 분석하다.행동 양식 분석하다정수 유형은 두 가지 오버로드된 형식으로 존재합니다. 첫 번째는 문자열 외에도 숫자 시스템의 기본(2에서 32까지)을 나타내는 int 유형의 추가 인수를 지정해야 합니다. 두 번째는 문자열 매개변수만 취하고 기본적으로 10진수 시스템을 사용한다고 가정합니다. Boolean 이외의 모든 경우에는 다음과 같이 가정됩니다. 문자열이 적절한 유형의 숫자로 올바르게 변환될 수 없는 값을 나타내는 경우 NumberFormatException이 발생합니다. Boolean 클래스는 "true"(대소문자 구분 안 함)가 아닌 문자열 매개 변수가 있으면 값이 false인 부울 객체가 생성된다는 규칙을 따릅니다.

언어에서 지원하는 형식 중 하나로 표현되는 문자(예: \b, \uxxxx등), char 유형의 값이 존재하지 않으며 그 반대의 경우도 마찬가지입니다. 단일 문자가 포함된 String 개체를 얻으려면 String.valueOf 메서드를 호출하고 해당 char 값을 매개 변수로 전달하면 됩니다.

또한 언어에서 지원하는 형식 중 하나로 지정된 숫자의 문자열 표현을 생성하는 방법도 없습니다. 앞에 0(O)을 사용하여 8진수를 나타내고 접두사 Ox(또는 OX)를 사용하여 8진수를 나타냅니다. 16진수 체계. 대조적으로, 정수 래퍼 클래스는 문자열을 적절한 유형의 숫자 ​​값으로 변환하고 선행 O가 8진수이고 접두사 Ox OR Ox 중 하나가 16진수라는 것을 이해할 수 있는 decode 메서드 버전을 지원합니다.

모든 애플리케이션 클래스는 선언이 그에 따라 toString 메서드를 재정의하고 매개 변수로 전달된 문자열을 기반으로 클래스 객체를 생성하는 특수 생성자를 제공하는 경우 자체 객체를 문자열로 변환하고 그 반대로 변환하는 지원을 제공할 수 있습니다. 또한 "null" 문자열 객체(obj가 null인 경우) 또는 obj.toString 메서드의 결과를 반환하는 String.valueOf(Object obj) 메서드도 있습니다. String 클래스에는 간단히 valueOf를 호출하고 원하는 인수를 전달하여 모든 유형의 값을 String 객체로 변환할 수 있는 valueOf 메서드의 오버로드가 충분히 포함되어 있습니다.

때로는 특정 유형의 값이 있고 이를 다른 유형의 변수에 할당해야 하는 상황이 발생합니다. 일부 유형의 경우 이는 유형 캐스팅 없이 수행될 수 있습니다. 이러한 경우 자동 유형 변환에 대해 설명합니다. Java에서는 대상 변수의 숫자 표현이 원래 값을 저장할 만큼 충분히 정확한 경우에만 자동 변환이 가능합니다. 예를 들어 리터럴 상수나 byte 또는 short 유형의 변수 값을 int 유형의 변수에 입력할 때 이러한 변환이 발생합니다. 그것은이라고 확대 (확대) 또는 증가하다 (홍보), 낮은 비트 유형이 더 큰 호환 유형으로 확장(승격)되기 때문입니다. int 유형은 항상 바이트 유형에서 허용하는 범위의 숫자를 저장할 만큼 크기 때문에 이러한 상황에서는 명시적인 유형 캐스트 ​​연산자가 필요하지 않습니다. 대부분의 경우 그 반대는 적용되지 않으므로 바이트 변수에 int 값을 할당하려면 캐스트 연산자를 사용해야 합니다. 이 절차는 때때로 축소 (좁아짐), 원하는 유형의 변수에 맞게 값을 변환해야 함을 변환기에게 명시적으로 알려주기 때문입니다. 값을 특정 유형으로 캐스트하려면 앞에 해당 유형을 괄호로 묶어 지정하십시오. 다음 코드 조각은 소스 유형(int 변수)을 대상 유형(바이트 변수)으로 캐스팅하는 방법을 보여줍니다. 이러한 작업 중에 정수 값이 바이트 유형에 허용된 범위를 벗어난 경우 바이트에 허용된 범위로 모듈로 나누기로 감소합니다(숫자로 모듈로 나누기 결과는 다음으로 나눈 나머지입니다). 그 번호),

정수 a = 100;
바이트비 = (바이트) a;

2.2.1. 표현식의 자동 유형 변환

표현식의 값을 계산할 때 중간 결과를 저장하는 데 필요한 정밀도는 최종 결과를 나타내는 데 필요한 정밀도보다 더 커야 하는 경우가 많습니다.

바이트 = 40;
바이트 b = 50;
바이트 = 100;
int d = a* b / c;

중간 표현식(a*b)의 결과는 바이트 유형에 허용되는 값 범위를 벗어날 수도 있습니다. 이것이 바로 Java가 자동으로 표현식의 각 부분 유형을 int 유형으로 승격시켜 중간 결과(a* b)를 위한 충분한 공간을 확보하는 이유입니다.

자동 유형 변환으로 인해 예상치 못한 변환기 오류 메시지가 발생할 수 있습니다. 예를 들어, 아래 표시된 코드는 꽤 정확해 보이지만 변환 단계에서 오류 메시지가 발생합니다. 여기에서 우리는 바이트 유형에 완벽하게 들어맞는 값 50*2를 바이트 변수에 쓰려고 합니다. 그러나 결과 유형이 int로 자동 변환되기 때문에 변환기로부터 오류 메시지를 받습니다. 결국 int를 바이트로 쓸 때 정밀도가 손실될 수 있습니다.

바이트 b = 50;
b = b* 2:
^ =에 대해 호환되지 않는 유형입니다. int를 바이트로 변환하려면 명시적인 캐스트가 필요합니다.
(=와 호환되지 않는 유형입니다. 명시적 변환이 필요합니다.int in바이트)

수정된 텍스트:
바이트b = 50;
비 = (바이트) (b* 2);

그러면 b가 올바른 값 100으로 설정됩니다.

표현식이 byte, short 및 int 유형의 변수를 사용하는 경우 오버플로를 방지하기 위해 전체 표현식의 유형이 자동으로 int로 승격됩니다. 표현식에서 하나 이상의 변수 유형이 long인 경우 전체 표현식의 유형도 long으로 증가합니다. L(또는 1)로 끝나지 않는 모든 정수 리터럴은 int 유형이라는 점을 기억하세요.

표현식에 float 유형의 피연산자가 포함되어 있으면 전체 표현식의 유형이 자동으로 float로 승격됩니다. 피연산자 중 하나 이상이 double 유형이면 전체 표현식의 유형이 double로 증가합니다. 기본적으로 Java는 모든 부동 소수점 리터럴을 double 유형으로 처리합니다. 다음 프로그램은 식의 각 값 유형이 각 이항 연산자의 두 번째 피연산자와 일치하도록 승격되는 방법을 보여줍니다.

클래스 승격(
공개 정적 무효 메인(문자열 인수)(
바이트 b= 42;
문자로= "아';
반바지 = 1024;
int i = 50000;
부동 f = 5.67f;
두 배 =.1234;
이중 결과 = (f*b) + (i/ c) - (d* s);
시스템, 아웃. println ((f* b)+ "+ "+ (i / c)+ " -" + (d* s));
시스템, 아웃. println("결과 = "+ 결과); )
}

f*b 하위 표현식은 바이트를 곱한 부동 소수점이므로 해당 유형이 자동으로 부동 소수점으로 승격됩니다. 다음 하위 표현식 i/c(int를 char로 나눈 값)의 유형이 int로 승격됩니다. 마찬가지로 하위 표현식 d*s(double times short)의 유형이 double로 승격됩니다. 계산의 다음 단계에서는 float, int 및 double 유형의 세 가지 중간 결과를 처리합니다. 첫째, 처음 두 개를 추가하면 int 유형이 float로 승격되고 결과는 float가 됩니다. double 값을 빼면 결과 유형이 double로 승격됩니다. 전체 표현식의 최종 결과는 double 값입니다.

이제 정수, 실수, 문자, 부울을 포함한 모든 단순 유형을 살펴보았으므로 이를 모두 하나로 모아 보겠습니다. 아래 예제에서는 단순형 각각의 변수를 생성하고 해당 변수의 값을 출력합니다.

클래스 SimpleTypes(
공개 정적 무효 메인(문자열 인수) (
바이트 b = 0x55;
짧은 s = 0x55ff;
int i = 1000000;
긴 l = 0xffffffffL;
문자로= '아';
플로트 f= .25f;
더블 d = .00001234;
부울 부울 = true;
System.out.println("바이트 b = " + b);
System.out.println("short s = " +s);
System.out.println("int i =” + i);
System.out.println("long 1 = " + l);
System.out.println("문자로=” + s);
System.out.println("float f = " + f);
System.out.println("double d = " + d);
System.out.println("부울 부울 =” + bool); )
}

이 프로그램을 실행하면 아래와 같은 출력이 표시됩니다.

바이트 b = 85
반바지 = 22015
정수 i = 1000000
긴 1 = 4294967295
문자로=a
플로트 f = 0.25
더블 d=1.234e-005
부울 부울 = true

정수는 10진수 표기법으로 인쇄되지만 일부 값은 16진수 표기법으로 지정되었습니다.

이 기사:

  • 팀에서 작성했습니다. 이 정보가 귀하에게 도움이 되기를 바랍니다. 즐거운 독서 되세요!
  • 이것은 우리 기사 중 하나입니다.

유형 변환은 Java 프로그래밍을 처음 접하는 사람들에게는 어렵게 보일 수 있는 주제입니다. 그러나 우리는 모든 것이 실제로 간단하다는 것을 확신합니다. 가장 중요한 것은 이해하는 것입니다. 변수 간의 상호 작용을 제어하는 ​​법칙은 무엇이며 프로그램을 작성할 때 이를 기억하십시오.. 그럼 알아 봅시다.

Java에는 두 가지 유형의 변환이 있습니다. 그림이 도움이 될 것입니다.

전체 "Java Universe"는 다음으로 구성됩니다.

  • 기본 유형(byte, short, int, long, char, float, double, boolean)
  • 사물

이 기사에서는 다음을 수행합니다.

  • 기본 변수 유형에 대한 유형 변환을 고려하십시오.
  • 개체에 별도의 "마법"이 발생하므로 개체(문자열, 스캐너 등) 변환은 이 문서에서 고려하지 않습니다. 이는 별도의 문서에 대한 주제입니다.
자동 변환

자, "자동 변환"이 무엇인지 알아 보겠습니다.

(기사에서) 변수 유형을 볼 때 다음과 같이 말한 것을 기억하세요. 변수는 일종의 "컨테이너"입니다. , 나중에 프로그램에서 사용하기 위해 값을 저장할 수 있습니다. 또한 각 유형의 변수에는 고유한 유효한 값 범위와 차지하는 메모리 양이 있다는 사실에 대해서도 이야기했습니다. 모든 것이 기록된 표시는 다음과 같습니다.

그래서 이것이 우리가 실제로 얻고 있는 것입니다. 게다가 허용 가능한 값의 범위와 차지하는 메모리 양만 제공되는 것은 아닙니다. :)

예를 들어 비교해 보겠습니다.

1. 바이트이고 짧습니다. byte는 short보다 유효한 값의 범위가 더 작습니다. 즉, byte는 작은 상자와 같고, short는 큰 상자와 같습니다. 그것이 의미하는 바는 바이트를 짧게 표현할 수 있습니다.

2. 바이트 및 정수. byte는 int보다 유효한 값의 범위가 더 작습니다. 즉, byte는 작은 상자와 같고, int는 큰 상자와 같습니다. 그것이 의미하는 바는 int에 byte를 넣을 수 있습니다.

3. int 및 long. int는 long보다 유효한 값의 범위가 더 작습니다. 즉, int는 작은 상자와 같고, long은 큰 상자와 같습니다. 그것이 의미하는 바는 int를 long으로 넣을 수 있어요.

자동변환 예시입니다. 이는 다음과 같은 그림의 형태로 개략적으로 묘사될 수 있습니다.

이것이 실제로 어떻게 작동하는지 살펴보겠습니다.

예 1

코드 1번 - 이 코드를 컴퓨터에서 실행하면,

클래스 테스트 ( 공개 정적 void main(String args) ( 바이트 a = 15; 바이트 b = a; System.out.println(b); ) )

클래스 테스트(

바이트 a = 15 ;

바이트 b = a ;

코드 2번 - 이 코드를 컴퓨터에서 실행하면, 숫자 15가 콘솔에 표시됩니다

클래스 테스트 ( public static void main(String args) ( byte a = 15; int b = a; System.out.println(b); ) )

클래스 테스트(

공개 정적 무효 메인(문자열 인수)(

바이트 a = 15 ;

int b = a;

체계. 밖으로 . println(b);

이요르? 당신은 그렇게 생각합니까? 동일한 숫자가 콘솔에 출력된 횟수 코드번호 1은 변수 b의 유형만 코드번호 2와 다릅니다. , 그러면 둘 사이에 차이가 없나요?이자형그건 사실이 아니야.

코드 번호 2에는 다음이 포함됩니다. 자동적 인유형 변환 , 그러나 코드 번호 1 - 아니요:

번호는 원칙적으로 동일하지만 현재는 b입니다. 영형더 많은 디스크 공간을 차지하는 더 큰 컨테이너입니다. 이 경우 JVM은 자동 변환을 수행합니다. 그녀는 그걸 알고 있어 정수이상 바이트 .

깁스

더 큰 컨테이너에서 더 작은 컨테이너로 무언가를 옮기려는 경우에는 다른 문제입니다.

더 큰 컨테이너에는 작은 컨테이너에 들어갈 수 있는 것이 포함되어 있다는 것을 알 수 있습니다. 그러나 JVM은 이에 대해 모르고 오류로부터 사용자를 보호하려고 합니다.

따라서 상황이 통제되고 있음을 "분명히 말"해야 합니다.

클래스 테스트 ( public static void main(String args) ( int a=0; long b=15; a = (int) b; ) )

클래스 테스트(

공개 정적 무효 메인(문자열 인수)(

정수 a = 0;

긴 b = 15;

a = (int) b;

여기에 우리가 추가했습니다 (정수)~ 전에 . 변수인 경우 예를 들어 다음과 같았습니다 바이트, 괄호 안에는 (바이트). 일반 공식은 다음과 같습니다.

그녀는 "(더) 의미를 만들어라"라고 말합니다. 나에게 필요한 유형의 변수(대상) 정수 ".

문제가 발생한 경우

이전에는 우리가 하고 있는 일이 무엇인지 정확히 알고 있다는 가정 하에 상황에 접근했습니다. 하지만 거기에 맞지 않는 용기에 무언가를 넣으려고 한다면 어떻게 될까요?

거기에 "적합한" 것만 컨테이너에 남게 된다는 것이 밝혀졌습니다. 예를 들어 부동 소수점 숫자의 경우 소수 부분이 "잘려집니다".

//예제 1 class Test ( public static void main(String args) ( double a=11.2345; int b=(int)a; System.out.println(b); // 콘솔에 숫자 11이 표시됩니다. ) )

//예제 1

클래스 테스트(

공개 정적 무효 메인(문자열 인수)(

더블 a = 11.2345 ;

int b = (int ) a;

체계. 밖으로 . println(b); // 콘솔에 숫자 11이 표시됩니다.

우리는 분수 부분을 기억해야합니다 반올림되지 않음, ㅏ 폐기됨.

허용된 범위를 벗어나는 숫자를 입력하려고 하면 어떻게 되나요? 예를 들어 숫자 128을 바이트(바이트 범위 -128 ~ 127)로 입력하면? 우리가 1등할 것 같아? 아니요. 우리는 -128을 얻습니다:

class Test ( public static void main(String args) ( double a=128; byte b=(byte)a; System.out.println(b); //콘솔에 -128이 표시됩니다) )

이러한 변환을 통해 변수 값을 계산할 수 있지만 프로그래머의 목표는 값이 허용 한계를 초과하는 상황을 피하는 것입니다. 이로 인해 프로그램이 잘못 작동할 수 있기 때문입니다.

작업:
  1. char 및 유형을 포함하여 모든 기본 유형의 서로 변환을 컴파일러에 일관되게 작성하십시오.
바이트 짧은 정수 뜨다 더블 부울
바이트
짧은
정수
뜨다
더블
부울

교차점에 다음을 작성하십시오. a - 변환이 자동으로 발생하는 경우 on - 명시적 변환을 사용해야 하는 경우 x - 변환이 불가능한 경우.

* 유형을 자신에게 캐스팅하는 것을 호출합니다. 동일한– 꼭 등록할 필요는 없습니다

  1. 각 기본 유형의 크기가 얼마나 되는지 다시 살펴보세요. 어떤 유형이 어디로 가는지 보여주는 순서도를 만들어 보세요. "변형 확장"과 "변형 축소"라는 라벨이 붙은 화살표를 그립니다.
질문

Junior Java Developer 직위에 대한 인터뷰 중 다음과 같은 질문을 받을 수 있습니다.

기본 데이터 유형 변환에 대해 무엇을 알고 있습니까? 데이터 손실이 있습니까? 부울 유형을 변환할 수 있습니까?

질문에 답해 보세요.

요약해보자:
  • 더 작은 컨테이너의 내용을 더 큰 컨테이너에 "넣는" 경우 자동으로 변환이 이루어지며 오류가 발생하지 않습니다.
  • "더 큰 컨테이너의 값을 더 작은 컨테이너에" 넣어야 하는 경우 주의해서 명시적 유형 캐스팅을 사용해야 합니다.
  • float 또는 double을 정수 유형으로 캐스팅할 때 소수 부분은 반올림되지 않고 단순히 삭제됩니다.
  • 부울 유형은 어떤 유형으로도 캐스팅할 수 없습니다.
  • char 유형은 UNICODE 시스템의 문자 코드와 같은 숫자 유형으로 변환됩니다.
  • 숫자가 컨테이너보다 크면 결과를 예측할 수 없습니다.

이 기사에서는 유형 캐스팅 주제에 관한 자료의 일부만 설명합니다. 또한 객체 유형 캐스트, 문자열로 캐스트(결국 무엇이든 문자열로 작성할 수 있습니다. 그렇죠?) 및 표현식의 자동 유형 승격도 있습니다.

우리 기사가 당신에게 도움이 되었기를 바랍니다. 키예프에서 Java 코스에 등록할 수 있는 기회도 있습니다. 우리는 처음부터 가르칩니다. 자세한 정보는 당사 웹사이트에서 확인하실 수 있습니다.


때로는 한 유형의 변수에 값을 다른 유형의 변수에 할당해야 하는 상황이 발생합니다. 예를 들어:

예 1: 한 유형의 변수 값을 다른 유형에 할당

int i = 11; 바이트 b = 22; 나는 = b;

Java에는 두 가지 유형의 변환이 있습니다. 자동 변환(암시적)그리고 유형 캐스팅(명시적 변환).

1. 자동 변환

먼저 자동 변환을 살펴보겠습니다. 두 유형이 모두 호환되는 경우 Java에서 자동으로 변환이 수행됩니다. 예를 들어 다음과 같은 값은 바이트 항상 다음과 같은 변수에 할당될 수 있습니다. 정수 , 예 1에 표시된 대로.

자동 유형 변환을 위해서는 두 가지 조건이 충족되어야 합니다.

  • 두 유형 모두 호환 가능해야 함
  • 대상 유형의 길이는 소스 유형의 길이보다 커야 합니다.

이런 경우가 발생합니다 확장자를 사용한 변환.

다음 다이어그램은 Java의 확장 변환을 보여줍니다.

실선은 데이터 손실 없이 수행된 변환을 나타냅니다. 점선은 변환 중에 정밀도 손실이 발생할 수 있음을 나타냅니다.

예를 들어 데이터 유형 정수 항상 해당 유형의 모든 유효한 값을 저장할 만큼 충분히 큽니다. 바이트 이므로 이 경우 명시적인 유형 변환 연산자가 필요하지 않습니다. 확대 변환의 관점에서 정수 및 부동 소수점을 포함한 숫자 데이터 유형은 서로 호환됩니다. 동시에 숫자 유형에서 유형으로의 자동 변환은 없습니다. 또는 부울 . 유형 그리고 부울 또한 서로 호환되지 않습니다.

예를 들어 유형과 같은 이유를 조금 설명할 가치가 있습니다. 바이트 자동으로(명시적으로는 아님) 유형으로 변환되지 않습니다. , 유형이 있지만 바이트 너비는 8비트이고 - 16, 유형 변환에도 동일하게 적용됩니다. 짧은 V . 이런 일이 일어나는 이유는 바이트 그리고 짧은 서명된 데이터 유형 및 서명되지 않은. 따라서 이 경우 명시적 유형 캐스팅을 사용해야 합니다. 컴파일러는 사용자가 원하는 것과 유형의 부호 있는 비트가 처리되는 방법을 알고 있음을 명시적으로 나타내야 하기 때문입니다. 바이트 그리고 짧은 유형으로 변환할 때 .

유형 값 동작 대부분의 경우 정수 유형 값의 동작과 일치하므로 유형 값은 값이 필요한 곳이면 어디든 사용할 수 있습니다. 정수 또는 . 그러나 유형은 다음과 같습니다. 부호가 없으므로 유형과 다르게 동작합니다. 짧은 , 두 유형 모두의 범위가 16비트라는 사실에도 불구하고.

2. 타입 캐스팅

자동 유형 변환의 편리성에도 불구하고 모든 긴급한 요구를 충족할 수는 없습니다. 예를 들어 값이 다음과 같다면 어떻게 될까요? 정수 유형의 변수에 할당되어야 합니다. 바이트 ? 이 변환은 유형의 길이 때문에 자동으로 수행되지 않습니다. 바이트 유형보다 작음 정수 . 때때로 이러한 유형의 변환을 호출합니다. 축소 변환, 대상 데이터 유형에 맞게 값이 명시적으로 좁혀지기 때문입니다.

호환되지 않는 두 데이터 유형 간에 변환하려면 유형 캐스트를 사용해야 합니다. 캐스트는 단지 명시적인 유형 변환일 뿐입니다. 유형 캐스팅의 일반적인 형태는 다음과 같습니다.

(target_type) 값

매개변수는 어디에 있나요? 대상_유형지정된 값이 변환되어야 하는 유형을 나타냅니다.

예 2: 유형 캐스팅

예를 들어 다음 코드 조각에서 유형은 정수 유형으로 캐스팅 바이트:

정수 i = 11; 바이트 b = 22; b = (바이트)i;

예제 3: 부동 소수점을 정수로 변환

부동소수점 값을 정수로 변환하는 예를 살펴보겠습니다. 이 예에서는 부동 소수점 값의 소수 부분이 단순히 삭제됩니다(잘라내기 작업).

이중 d = 3.89; int a = (int) d; //결과는 3이 됩니다.

예 4: 더 큰 정수 유형에서 더 작은 정수 유형으로의 변환

더 큰 정수 유형을 더 작은 정수 유형으로 캐스팅할 때 가장 중요한 비트는 단순히 버려집니다.

정수 i = 323; 바이트 b = (바이트)i; //결과는 67이 됩니다.

예 5: 더 큰 부동 소수점 값을 더 작은 정수 용량으로 변환

더 큰 부동 소수점 값을 정수로 캐스팅할 때 가장 중요한 비트가 잘리고 삭제됩니다.

더블 d = 389889877779.89; 짧은 s = (짧은) d; //결과는 -1이 됩니다.

3. 표현식의 자동 유형 승격

할당 작업 외에도 식에서 특정 형식 변환을 수행할 수도 있습니다.

Java에는 다음 규칙이 적용됩니다.

  1. 하나의 피연산자가 유형인 경우 더블 더블.
  2. 뜨다, 다른 하나도 유형으로 변환됩니다. 뜨다.
  3. 그렇지 않고 피연산자 중 하나가 유형인 경우 , 다른 하나도 유형으로 변환됩니다. .
  4. 그렇지 않으면 두 피연산자가 모두 유형으로 변환됩니다. 정수.
  5. 혼합 할당 표현식(+=,-=,*=,/=)에서는 캐스트를 수행할 필요가 없습니다.

예는 다음과 같습니다.

예 6. 표현식의 자동 유형 승격

변수 b1( 바이트) 2( 정수) 결과는 다음과 같습니다 정수. 따라서 결과를 변수 b2( 바이트) 컴파일 오류가 발생합니다. 그러나 결합 할당 연산자(*=)를 사용하면 이 문제가 발생하지 않습니다.

바이트 b1 = 1; 바이트 b2 = 2 * b1; //컴파일 오류 int i1 = 2 * b1; b2 *= 2;

예 7. 표현식의 자동 유형 승격

다음 예에서는 다음과 같은 숫자에도 불구하고 컴파일 오류가 발생합니다. 바이트, 작업 결과는 다음 유형이 됩니다. 정수,하지만 짧은.

공용 클래스 IntegerDemo1 ( public static void main(String args) ( byte b1 = 50, b2 = -99; short k = b1 + b2; //컴파일 오류 System.out.println("k=" + k); ) )

예 8. 표현식의 자동 유형 승격

이 예제는 이전 예제와 유사하지만 캐스트가 자동으로 발생하는 결합 할당 작업을 사용합니다.

공용 클래스 IntegerDemo2 ( public static void main(String args) ( byte b1 = 50, b2 = -99; b1 += b2; System.out.println("b1=" + b1); ) )

주석: 이번 강의에서는 유형 변환 문제를 다룹니다. Java는 강력한 유형의 언어이므로 컴파일러와 가상 머신은 항상 유형 처리를 모니터링하여 프로그램 실행의 신뢰성을 보장합니다. 그러나 많은 경우 프로그램 논리를 구현하려면 하나 이상의 변환을 수행해야 합니다. 반면에 Java에서는 개발자에게 암시적인 방식으로 유형 간 안전한 전환이 수행되도록 허용하므로 프로그램 작동 방식에 대한 오해가 발생할 수 있습니다. 강의에서는 모든 유형의 변환과 이를 적용할 수 있는 프로그램의 모든 상황에 대해 논의합니다. 마지막으로 변수의 유형과 저장할 수 있는 값의 유형을 분류하기 시작합니다. 이 문제는 다음 강의에서 더 자세히 다루겠습니다.

이게 다 무슨 뜻인가요? 순서대로 시작합시다. 단순 유형의 경우 확장은 용량이 작은 유형에서 용량이 더 큰 유형으로 전환되는 것을 의미합니다. 예를 들어 byte 유형(1바이트 길이)에서 int 유형(4바이트 길이)으로 변경됩니다. 이러한 변환은 새 유형이 항상 이전 유형에 저장된 모든 데이터를 포함하므로 데이터 손실이 발생하지 않는다는 점에서 안전합니다. 이것이 바로 개발자가 눈치채지 못한 채 컴파일러가 이를 자체적으로 구현하는 이유입니다.

바이트 b=3; int a=b;

마지막 줄에서 바이트 변수 b의 값은 자동으로 변수 a의 유형(즉, int )으로 변환되므로 이를 위해 특별한 조치를 취할 필요가 없습니다.

다음 19개 변환은 확장 변환입니다.

  • 바이트에서 short, int, long, float, double로
  • short에서 int, long, float, double로
  • char에서 int, long, float, double로
  • int에서 long, float, double로
  • long에서 float로, double로
  • 플로트에서 더블로

길이가 더 작거나 같은 유형(바이트, short)에서 char로 변환하거나, 반대로 데이터 손실 없이 char에서 short로 변환할 수 없다는 점에 유의하세요. 이는 다른 정수 유형과 달리 char이 부호가 없기 때문입니다.

그러나 확장을 하더라도 특수한 경우에는 데이터가 여전히 왜곡될 수 있다는 점을 기억해야 합니다. 이전 강의에서 이미 논의한 바 있는데, int 값을 float 유형으로 캐스팅하고, long 값을 float 또는 double 유형으로 캐스팅하는 것입니다. 이러한 분수 유형은 해당 정수보다 훨씬 더 큰 숫자를 수용할 수 있지만 유효 자릿수는 더 적습니다.

이 예를 반복해 보겠습니다.

긴 a=111111111111L; 플로트 f = a; a = (긴) f; 인쇄(a);

결과는 다음과 같습니다:

역변환(협소화)은 더 큰 유형에서 덜 큰 유형으로 전환이 수행됨을 의미합니다. 이 변환을 사용하면 데이터가 손실될 위험이 있습니다. 예를 들어 int 숫자가 127보다 큰 경우 이를 바이트로 변환할 때 8번째보다 높은 비트 값은 손실됩니다. Java에서는 이러한 변환이 명시적으로 수행되어야 합니다. 프로그래머는 그러한 변환을 수행할 의사가 있으며 데이터를 잃을 의사가 있음을 코드에 명시적으로 표시해야 합니다.

다음 변환이 좁아지고 있습니다.

  • 바이트에서 문자로
  • 짧은 것부터 바이트, 문자까지
  • 문자에서 바이트로, 짧게
  • int에서 바이트, short, char로
  • long에서 byte, short, char, int로
  • float에서 byte, short, char, int, long으로
  • 더블에서 바이트로, short, char, int, long, float

정수 유형을 더 좁은 정수 유형으로 좁힐 때 새로운 유형에 속하지 않는 모든 상위 비트는 단순히 삭제됩니다. 보다 정확한 결과를 얻기 위해 반올림이나 기타 작업이 수행되지 않습니다.

print((바이트)383); print((바이트)384); print((바이트)-384);

결과는 다음과 같습니다:

부호 비트는 단순히 폐기되었기 때문에 축소하는 동안 아무런 영향을 미치지 않았음을 알 수 있습니다. 반대 숫자(384 및 -384)를 가져온 결과는 동일한 것으로 나타났습니다. 결과적으로 정확한 절대값뿐만 아니라 크기의 부호도 손실될 수 있습니다.

char 유형의 경우에도 마찬가지입니다.

문자 c=40000; print((짧은)c);

결과는 다음과 같습니다:

분수 유형을 정수 유형으로 줄이는 것은 더 복잡한 절차입니다. 그것은 두 단계로 수행됩니다.

첫 번째 단계에서는 대상 유형이 long이면 소수 값을 long으로 변환하고, 그렇지 않으면 int로 변환합니다(대상 유형은 byte, short, char 또는 int 입니다). 이를 위해 원래 분수는 먼저 수학적으로 0을 향해 반올림됩니다. 즉, 분수 부분은 단순히 삭제됩니다.

예를 들어 숫자 3.84는 3으로 반올림되고 -3.84는 -3이 됩니다. 이 경우 특별한 경우가 발생할 수 있습니다.

  • 원래 분수 값이 NaN이면 첫 번째 단계의 결과는 선택한 유형(예: int 또는 long)의 0이 됩니다.
  • 원래 분수 값이 양수 또는 음수 무한대이면 첫 번째 단계의 결과는 각각 선택한 유형(예: int 또는 long )에 대해 가능한 최대값 또는 최소값이 됩니다.
  • 마지막으로, 분수 값이 최종 값이었지만 반올림 결과 선택한 유형(예: int 또는 long )에 대한 절대값이 너무 큰 경우 이전 단락에서와 같이 첫 번째 결과는 step은 각각 이 유형의 가능한 최대값 또는 최소값입니다. 반올림 결과가 선택한 유형의 값 범위에 속하면 첫 번째 단계의 결과가 됩니다.
  • 및 int는 매우 분명합니다. 분수 무한대는 각각 이러한 유형의 가능한 최소 및 최대 값으로 변환되었습니다. 다음 세 가지 유형(short, char, byte)에 대한 결과는 본질적으로 변환 절차의 두 번째 단계에 따라 int에 대해 얻은 값을 더욱 좁힌 것입니다. 그리고 이는 설명된 대로 간단히 가장 중요한 비트를 삭제하여 수행됩니다. 비트 형식에서 가능한 최소값은 1000..000(int의 경우 32비트, 즉 1과 31 0)으로 표시된다는 점을 기억하세요. 가능한 최대값은 1111..111(31개 단위)입니다. 가장 중요한 비트를 버리면 음의 무한대에 대해 결과 0을 얻습니다. 이는 세 가지 유형 모두에 대해 동일합니다. 양의 무한대의 경우 모든 비트가 다음과 같은 결과를 얻습니다. 1

    결론적으로 부울 유형의 기본 값은 항등 변환에만 참여할 수 있다는 사실에 다시 한 번 주목하겠습니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: