1. 타입캐스팅
기본 유형의 변수(유형 제외 boolean
)는 다양한 유형의 숫자를 저장하는 데 사용됩니다. 변수의 유형은 절대 변경되지 않지만 한 유형에서 다른 유형으로 변환할 수 있는 곳이 있습니다. 그리고 그 장소는 할당 입니다 .
서로 다른 유형의 변수를 서로 할당할 수 있습니다. 이렇게 하면 한 유형의 변수 값이 다른 유형의 값으로 변환되어 두 번째 변수에 할당됩니다. 이와 관련하여 두 종류의 유형 변환을 식별할 수 있습니다. 확대 및 축소입니다.
확대는 작은 바구니에서 큰 바구니로 값을 이동하는 것과 같습니다. 이 작업은 매끄럽고 고통이 없습니다. 축소는 큰 바구니에서 작은 바구니로 값을 이동할 때 발생합니다. 공간이 충분하지 않을 수 있으며 무언가를 버려야 합니다.
다음은 바구니 크기별로 정렬된 유형입니다.
2. 유형 변환 확대
한 숫자 유형의 변수를 다른 숫자 유형의 변수에 할당해야 하는 경우가 종종 있습니다. 어떻게 합니까?
Java에는 4가지 정수 유형이 있습니다.
유형 | 크기 |
---|---|
byte |
1 byte |
short |
2 bytes |
int |
4 bytes |
long |
8 bytes |
더 작은 바스켓에 저장된 변수는 항상 더 큰 바스켓에 저장된 변수에 할당될 수 있습니다.
int
, short
변수 를 변수 byte
에 쉽게 할당할 수 있습니다 long
. short
그리고 byte
변수는 변수에 할당될 수 있습니다 int
. 그리고 byte
변수는 변수에 할당될 수 있습니다 short
.
예:
암호 | 설명 |
---|---|
|
이 코드는 잘 컴파일됩니다. |
더 작은 유형에서 더 큰 유형으로의 이러한 변환을 확장 유형 변환이라고 합니다.
실수는 어떻습니까?
모든 것이 동일합니다. 크기가 중요합니다.
유형 | 크기 |
---|---|
float |
4 bytes |
double |
8 bytes |
float
double
아무런 문제 없이 변수 에 변수를 할당할 수 있습니다 . 그러나 정수 유형이 더 흥미롭습니다.
모든 정수 변수를 float
변수에 할당할 수 있습니다. long
길이가 8바이트인 유형 도 마찬가지입니다 . 그리고 변수에 원하는 모든 변수(정수 변수 또는 float
변수) 를 할당할 수 있습니다 double
.
암호 | 메모 |
---|---|
|
|
실제 유형으로 변환하면 유효 자릿수가 충분하지 않아 정밀도가 손실될 수 있습니다.
정수에서 부동 소수점 숫자로 변환할 때 숫자의 하위 부분은 버려질 수 있습니다. 그러나 분수는 대략적인 값을 저장하는 것으로 이해되므로 이러한 할당 연산이 허용됩니다.
3. 유형 변환 축소
다른 가능성은 어떻습니까? long
변수 에 값을 할당해야 하는 경우 어떻게 해야 합니까 int
?
변수를 바구니로 상상해 보십시오. 1, 2, 4, 8바이트 등 다양한 크기의 바스켓이 있습니다. 작은 바구니에서 큰 바구니로 사과를 옮기는 것은 문제가 되지 않습니다. 그러나 큰 바구니에서 작은 바구니로 이동할 때 일부 사과가 손실될 수 있습니다.
더 큰 유형에서 더 작은 유형으로의 이러한 변환을 축소 유형 변환 이라고 합니다 . 이와 같은 할당 작업을 수행할 때 숫자의 일부가 새 변수에 맞지 않을 수 있으므로 폐기될 수 있습니다.
유형을 좁힐 때 우리는 컴파일러에게 우리가 실수를 하고 있는 것이 아니며 의도적으로 숫자의 일부를 버리고 있음을 명시적으로 알려야 합니다. 이를 위해 typecast 연산자가 사용됩니다. 괄호 안의 유형 이름 입니다 .
이러한 상황에서 Java 컴파일러는 프로그래머가 typecast 연산자를 지정하도록 요구합니다. 일반적으로 다음과 같습니다.
(type) expression
예:
암호 | 설명 |
---|---|
|
typecast 연산자를 명시적으로 지정해야 할 때마다 |
여기서는 a
와 같으며 1
아마도 typecast 연산자는 과잉처럼 보일 것입니다. 하지만 a
더 크면 어떨까요?
암호 | 설명 |
---|---|
|
|
백만은 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 는 char
a 처럼 short
2바이트를 차지하지만 하나를 다른 것으로 변환하려면 항상 typecast 연산자를 사용해야 합니다. 여기서 문제는 short
유형이 부호 있고 에서 -32,768
까지 의 값을 포함할 수 +32,767
있지만 유형이 부호가 없고 에서 까지의 char
값을 포함할 수 있다는 것입니다 .0
65,535
음수는 에 저장할 수 없지만 char
에는 저장할 수 있습니다 short
. 그리고 a는 short
보다 큰 숫자를 저장할 수 없지만 32,767
이러한 숫자는 a에 저장할 수 있습니다 char
.
4. 표현의 종류
다른 유형의 변수가 동일한 표현식에 사용되면 어떻게 될까요? 논리적으로 먼저 공통 유형으로 변환해야 한다는 것을 이해합니다. 하지만 어느 것?
물론 더 큰 사람에게.
Java는 항상 더 큰 유형으로 변환됩니다. 대략적으로 말하면 먼저 유형 중 하나를 확장한 다음 동일한 유형의 값을 사용하여 작업을 수행합니다.
an int
과 a가 long
식에 포함된 경우 the의 값이 int
a로 변환된 long
다음에만 작업이 진행됩니다.
암호 | 설명 |
---|---|
|
a 가 a로 확장되고 long 추가가 발생합니다. |
부동 소수점 숫자
정수와 부동 소수점 숫자( float
또는 double
)가 표현식에 포함된 경우 정수는 부동 소수점 숫자( float
또는 double
)로 변환된 다음에만 연산이 수행됩니다.
작업에 a float
및 a 가 포함된 double
경우 float
가 로 변환됩니다 double
. 실제로 예상됩니다.
, 및 유형은 서로 상호 작용할 때 byte
항상 로 변환됩니다 . 유형이 표준 정수 유형으로 간주되는 데에는 타당한 이유가 있습니다 .short
char
int
int
byte
a에 a를 곱하면 short
가 됩니다 int
. byte
a에 a를 곱하면 byte
가 됩니다 int
. byte
a 와 a를 더해도 가 byte
됩니다 int
.
이에 대한 몇 가지 이유가 있습니다. 예:
암호 | 설명 |
---|---|
|
110 * 120 is 13,200 이며 다음 유형의 최대값보다 약간 큽니다 byte .127 |
|
110 + 120 is 230 이며 다음 유형의 최대값보다 약간 큽니다 byte .127 |
일반적으로 8비트(1바이트) 숫자와 8비트(1바이트) 숫자를 곱하면 16비트(2바이트)를 차지하는 숫자가 나옵니다.
결과적으로 보다 작은 정수 유형의 모든 연산은 int
항상 즉시 int
s로 변환됩니다. 즉, 계산 결과를 보다 작은 유형의 변수에 저장하려면 int
항상 유형 변환 연산자를 명시적으로 지정해야 합니다.
예:
암호 | 설명 |
---|---|
|
표현 byte * byte 은int |
|
표현 byte + byte 은int |
|
표현식 byte + int 은 입니다. int 리터럴은 입니다 int . |
5. 중요한 뉘앙스
typecast 연산자는 상당히 높은 우선 순위를 갖습니다.
즉, 예를 들어 식에 추가 및 typecast 연산자가 포함된 경우 typecast는 추가 전에 수행됩니다.
예:
암호 | 설명 |
---|---|
|
typecast 연산자는 a 이미 byte . 이 코드는 컴파일되지 않습니다. |
|
이것이 올바른 방법입니다. |
표현식의 한 구성 요소가 아니라 전체 표현식을 특정 유형으로 변환하려면 전체 표현식을 괄호로 묶고 typecast 연산자를 앞에 두십시오.
GO TO FULL VERSION