1. 타입캐스팅

자바의 타입캐스팅

기본 유형의 변수(유형 제외 boolean)는 다양한 유형의 숫자를 저장하는 데 사용됩니다. 변수의 유형은 절대 변경되지 않지만 한 유형에서 다른 유형으로 변환할 수 있는 곳이 있습니다. 그리고 그 장소는 할당 입니다 .

서로 다른 유형의 변수를 서로 할당할 수 있습니다. 이렇게 하면 한 유형의 변수 값이 다른 유형의 값으로 변환되어 두 번째 변수에 할당됩니다. 이와 관련하여 두 종류의 유형 변환을 식별할 수 있습니다. 확대 및 축소입니다.

확대는 작은 바구니에서 큰 바구니로 값을 이동하는 것과 같습니다. 이 작업은 매끄럽고 고통이 없습니다. 축소는 큰 바구니에서 작은 바구니로 값을 이동할 때 발생합니다. 공간이 충분하지 않을 수 있으며 무언가를 버려야 합니다.

다음은 바구니 크기별로 정렬된 유형입니다.

자바 2의 타입캐스팅


2. 유형 변환 확대

한 숫자 유형의 변수를 다른 숫자 유형의 변수에 할당해야 하는 경우가 종종 있습니다. 어떻게 합니까?

Java에는 4가지 정수 유형이 있습니다.

유형 크기
byte 1 byte
short 2 bytes
int 4 bytes
long 8 bytes

더 작은 바스켓에 저장된 변수는 항상 더 큰 바스켓에 저장된 변수에 할당될 수 있습니다.

int, short변수 를 변수 byte에 쉽게 할당할 수 있습니다 long. short그리고 byte변수는 변수에 할당될 수 있습니다 int. 그리고 byte변수는 변수에 할당될 수 있습니다 short.

예:

암호 설명
byte a = 5;
short b = a;
int c = a + b;
long d = c * c;
이 코드는 잘 컴파일됩니다.

더 작은 유형에서 더 큰 유형으로의 이러한 변환을 확장 유형 변환이라고 합니다.

실수는 어떻습니까?

모든 것이 동일합니다. 크기가 중요합니다.

유형 크기
float 4 bytes
double 8 bytes

floatdouble아무런 문제 없이 변수 에 변수를 할당할 수 있습니다 . 그러나 정수 유형이 더 흥미롭습니다.

모든 정수 변수를 float변수에 할당할 수 있습니다. long길이가 8바이트인 유형 도 마찬가지입니다 . 그리고 변수에 원하는 모든 변수(정수 변수 또는 float변수) 를 할당할 수 있습니다 double.

암호 메모
long a = 1234567890;
float b = a;
double c = a;

b == 1.23456794E9
c == 1.23456789E9

실제 유형으로 변환하면 유효 자릿수가 충분하지 않아 정밀도가 손실될 수 있습니다.

정수에서 부동 소수점 숫자로 변환할 때 숫자의 하위 부분은 버려질 수 있습니다. 그러나 분수는 대략적인 값을 저장하는 것으로 이해되므로 이러한 할당 연산이 허용됩니다.


3. 유형 변환 축소

다른 가능성은 어떻습니까? long변수 에 값을 할당해야 하는 경우 어떻게 해야 합니까 int?

변수를 바구니로 상상해 보십시오. 1, 2, 4, 8바이트 등 다양한 크기의 바스켓이 있습니다. 작은 바구니에서 큰 바구니로 사과를 옮기는 것은 문제가 되지 않습니다. 그러나 큰 바구니에서 작은 바구니로 이동할 때 일부 사과가 손실될 수 있습니다.

더 큰 유형에서 더 작은 유형으로의 이러한 변환을 축소 유형 변환 이라고 합니다 . 이와 같은 할당 작업을 수행할 때 숫자의 일부가 새 변수에 맞지 않을 수 있으므로 폐기될 수 있습니다.

유형을 좁힐 때 우리는 컴파일러에게 우리가 실수를 하고 있는 것이 아니며 의도적으로 숫자의 일부를 버리고 있음을 명시적으로 알려야 합니다. 이를 위해 typecast 연산자가 사용됩니다. 괄호 안의 유형 이름 입니다 .

이러한 상황에서 Java 컴파일러는 프로그래머가 typecast 연산자를 지정하도록 요구합니다. 일반적으로 다음과 같습니다.

(type) expression

예:

암호 설명
long a = 1;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
typecast 연산자를 명시적으로 지정해야 할 때마다

여기서는 a와 같으며 1아마도 typecast 연산자는 과잉처럼 보일 것입니다. 하지만 a더 크면 어떨까요?

암호 설명
long a = 1000000;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
a == 1000000
b == 1000000
c == 16960
d == 64

백만은 long와 에 완벽하게 맞습니다 int. 그러나 변수에 100만 개를 할당할 때 short처음 2바이트는 버리고 마지막 2바이트만 유지됩니다. 그리고 에 할당할 때 byte마지막 바이트만 남습니다.

숫자가 메모리에 배열되는 방식:

유형 이진 표기법 십진법
int 0b 00000000 00001111 01000010 01000000 1000000
short 0b 01000010 01000000 16.960
byte 0b 01000000 64

char유형

A 는 chara 처럼 short2바이트를 차지하지만 하나를 다른 것으로 변환하려면 항상 typecast 연산자를 사용해야 합니다. 여기서 문제는 short유형이 부호 있고 에서 -32,768까지 의 값을 포함할 수 +32,767있지만 유형이 부호가 없고 에서 까지의 char값을 포함할 수 있다는 것입니다 .065,535

음수는 에 저장할 수 없지만 char에는 저장할 수 있습니다 short. 그리고 a는 short보다 큰 숫자를 저장할 수 없지만 32,767이러한 숫자는 a에 저장할 수 있습니다 char.


4. 표현의 종류

다른 유형의 변수가 동일한 표현식에 사용되면 어떻게 될까요? 논리적으로 먼저 공통 유형으로 변환해야 한다는 것을 이해합니다. 하지만 어느 것?

물론 더 큰 사람에게.

Java는 항상 더 큰 유형으로 변환됩니다. 대략적으로 말하면 먼저 유형 중 하나를 확장한 다음 동일한 유형의 값을 사용하여 작업을 수행합니다.

an int과 a가 long식에 포함된 경우 the의 값이 inta로 변환된 long다음에만 작업이 진행됩니다.

암호 설명
int a = 1;
long b = 2;
long c = a + b;
a가 a로 확장되고 long추가가 발생합니다.

부동 소수점 숫자

정수와 부동 소수점 숫자( float또는 double)가 표현식에 포함된 경우 정수는 부동 소수점 숫자( float또는 double)로 변환된 다음에만 연산이 수행됩니다.

작업에 a float및 a 가 포함된 double경우 float가 로 변환됩니다 double. 실제로 예상됩니다.

놀라다

, 및 유형은 서로 상호 작용할 때 byte항상 로 변환됩니다 . 유형이 표준 정수 유형으로 간주되는 데에는 타당한 이유가 있습니다 .shortcharintint

bytea에 a를 곱하면 short가 됩니다 int. bytea에 a를 곱하면 byte가 됩니다 int. bytea 와 a를 더해도 가 byte됩니다 int.

이에 대한 몇 가지 이유가 있습니다. 예:

암호 설명
byte a = 110;
byte b = 120;
byte c = a * b;  // Error
110 * 120is 13,200이며 다음 유형의 최대값보다 약간 큽니다 byte.127
byte a = 110;
byte b = 120;
byte c = a + b; // Error
110 + 120is 230이며 다음 유형의 최대값보다 약간 큽니다 byte.127

일반적으로 8비트(1바이트) 숫자와 8비트(1바이트) 숫자를 곱하면 16비트(2바이트)를 차지하는 숫자가 나옵니다.

결과적으로 보다 작은 정수 유형의 모든 연산은 int항상 즉시 ints로 변환됩니다. 즉, 계산 결과를 보다 작은 유형의 변수에 저장하려면 int항상 유형 변환 연산자를 명시적으로 지정해야 합니다.

예:

암호 설명
byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
표현 byte * byteint
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
표현 byte + byteint
byte a = 1;
byte b = (byte) (a + 1);
표현식 byte + int은 입니다. int
리터럴은 입니다 int.

5. 중요한 뉘앙스

typecast 연산자는 상당히 높은 우선 순위를 갖습니다.

즉, 예를 들어 식에 추가 및 typecast 연산자가 포함된 경우 typecast는 추가 전에 수행됩니다.

예:

암호 설명
byte a = 1;
byte b = 2;
byte c = (byte) a * b;
typecast 연산자는 a이미 byte. 이 코드는 컴파일되지 않습니다.
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
이것이 올바른 방법입니다.

표현식의 한 구성 요소가 아니라 전체 표현식을 특정 유형으로 변환하려면 전체 표현식을 괄호로 묶고 typecast 연산자를 앞에 두십시오.