JavaRush /Java Blog /Random-KO /Java에서 기본 유형 캐스팅(변환)

Java에서 기본 유형 캐스팅(변환)

Random-KO 그룹에 게시되었습니다
안녕하세요! JavaRush를 진행하는 동안 기본 유형을 두 번 이상 발견했습니다. 우리가 그들에 대해 알고 있는 짧은 목록은 다음과 같습니다.
  1. 객체가 아니며 메모리에 저장된 값을 나타냅니다.
  2. 기본 유형에는 여러 가지 유형이 있습니다.
    • 정수 - byte, short, int,long
    • 부동 소수점 숫자(소수) - floatdouble
    • 부울 -boolean
    • 기호(문자 및 숫자를 나타냄) -char
  3. 각각에는 고유한 값 범위가 있습니다.
기본 유형 메모리 크기 값의 범위
바이트 8비트 -128~127
짧은 16비트 -32768부터 32767까지
16비트 0부터 65536까지
정수 32비트 -2147483648에서 2147483647까지
64비트 -9223372036854775808에서 9223372036854775807까지
뜨다 32비트 (2의 -149승)에서 ((2-2의 -23)*2의 127승)까지
더블 64비트 (-2의 63승)에서 ((2의 63승) - 1)까지
부울 8(배열에 사용되는 경우), 32(비배열에 사용되는 경우) 참 또는 거짓
그러나 값 외에도 유형에 따라 메모리 크기도 다릅니다. int이상 소요됩니다 byte. A long- 이상 short. 프리미티브가 차지하는 메모리 양은 중첩 인형과 비교할 수 있습니다. 기본 유형의 확장 및 축소 - 2 중첩 인형 내부에는 여유 공간이 있습니다. 중첩 인형이 클수록 공간이 더 많아집니다. 큰 중첩 인형 안에 long작은 인형을 쉽게 넣을 수 있습니다 int. 쉽게 맞고 추가 작업이 필요하지 않습니다. Java에서는 기본 형식으로 작업할 때 이를 자동 변환이라고 합니다. 다른 말로 확장이라고 합니다. 다음은 간단한 확장 예시입니다:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
byte여기서는 변수에 값을 할당합니다 int. 할당은 성공적이었고 아무런 문제도 없었습니다. 에 저장된 값은 에 byte"적합"한 것보다 적은 메모리 공간을 차지합니다 int. “작은 중첩 인형”(값 byte)은 “큰 마트료시카”(변수 int)에 쉽게 맞습니다. 반대 작업을 시도하는 것은 또 다른 문제입니다. 해당 크기에 맞게 설계되지 않은 변수에 큰 값을 입력하는 것입니다. 원칙적으로 이 트릭은 실제 중첩 인형에서는 작동하지 않지만 Java에서는 작동하지만 뉘앙스가 있습니다. int변수에 값을 넣어 보겠습니다 short.
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
오류! 컴파일러는 사용자가 비표준적인 작업을 하려고 한다는 것을 이해하고 int작은 인형( ) 안에 큰 마트료시카 인형( )을 넣습니다 short. 이 경우 컴파일 오류는 컴파일러의 경고입니다. “ 이 작업을 하시겠습니까? "확실하다면 컴파일러에게 다음과 같이 말하십시오. " 모든 것이 정상입니다. 내가 무엇을 하고 있는지 알고 있습니다!" ” 이 프로세스를 명시적 유형 변환 또는 축소 라고 합니다 . 범위를 좁히려면 값을 캐스팅하려는 유형을 명시적으로 나타내야 합니다. 즉, 컴파일러의 질문에 대답하십시오. " 글쎄, 이 작은 인형 중 어느 것을 이 큰 인형에 넣고 싶습니까?" " 우리의 경우에는 다음과 같습니다.
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
int우리는 값을 변수에 맞추고 short이에 대한 책임을 지고 싶다고 명시적으로 밝혔습니다 . 더 좁은 유형의 명시적인 표시를 확인하는 컴파일러는 변환을 수행합니다. 결과는 어떻게 될까요? 콘솔 출력: -27008 약간 예상치 못한 결과입니다. 정확히 왜 이런가요? 실제로는 간단합니다. 원래 값은 10000000이었습니다. 이 값은 32비트를 차지하는 변수에 저장되었으며 int이진 형식에서는 다음과 같습니다. 기본 유형의 확장 및 축소 - 3 이 값을 변수에 썼지 short만 16비트만 저장할 수 있습니다! 따라서 숫자의 처음 16비트만 그곳으로 이동되고 나머지는 삭제됩니다. 결과적으로 변수 에는 10진수 형식으로 정확히 -27008과 동일한 short값이 포함됩니다 기본 유형의 확장 및 축소 - 4. 이것이 바로 컴파일러가 특정 유형에 대한 명시적 캐스트 형식으로 "확인을 요청"한 이유입니다. 첫째, 결과에 대해 책임을 져야 함을 보여주고, 둘째, 유형을 캐스팅할 때 할당할 공간을 컴파일러에 알려줍니다. 결국, 마지막 예에서 유형 이 아닌 유형 int으로 캐스팅했다면 우리가 사용할 수 있는 비트는 16비트가 아닌 8비트뿐이고 결과는 달라졌을 것입니다. 분수 유형( 및 )의 경우 축소가 다르게 발생합니다. 이러한 숫자를 정수 유형으로 변환하려고 하면 소수 부분이 삭제됩니다. byteshortfloatdouble
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
콘솔 출력: 2

데이터 유형 문자

char 유형이 개별 문자를 표시하는 데 사용된다는 것을 이미 알고 있습니다.
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
그러나 이해해야 할 중요한 기능이 많이 있습니다. 값 범위가 포함된 표를 다시 살펴보겠습니다.
기본 유형 메모리 크기 값의 범위
바이트 8비트 -128~127
짧은 16비트 -32768~32767
16비트 0부터 65536까지
정수 32비트 -2147483648에서 2147483647까지
64비트 -9223372036854775808에서 9223372036854775807까지
뜨다 32비트 (2의 -149승)에서 ((2-2의 -23)*2의 127승)까지
더블 64비트 (-2의 63제곱)에서 ((2의 63제곱)-1)까지
부울 8(배열에 사용되는 경우), 32(비배열에 사용되는 경우) 참 또는 거짓
유형 char의 숫자 ​​범위는 0부터 65536까지입니다. 그런데 이것이 무엇을 의미합니까? 결국 char이것은 숫자뿐만 아니라 문자, 구두점... 사실 값은 charJava에 유니코드 형식으로 저장됩니다. 우리는 이전 강의 중 하나에서 이미 유니코드를 접했습니다. 유니코드는 전 세계 거의 모든 언어의 문자를 포함하는 문자 인코딩 표준이라는 것을 기억하실 것입니다 . 즉, 이것은 모든 언어의 거의 모든 문자에 대한 코드가 있는 특수 코드 목록입니다. 일반 유니코드 테이블은 매우 방대하며 물론 암기할 필요는 없습니다. 예를 들어 다음은 그 일부입니다. 기본 유형의 확장 및 축소 - 5 가장 중요한 것은 값 저장의 원리를 이해 char하고 특정 기호의 코드를 알면 언제든지 프로그램에서 해당 기호를 얻을 수 있다는 점을 기억하는 것입니다. 임의의 숫자로 이것을 시도해 봅시다:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
콘솔 출력: 耰 이것은 Java에서 문자가 저장되는 형식입니다 char. 각 문자는 숫자(16비트 또는 2바이트의 숫자 코드)에 해당합니다. 유니코드 32816은 耰 문자에 해당합니다. 지금 이 순간에 주목하세요. 이 예에서는 변수를 사용했습니다 int. 32비트 의 메모리를 차지하는 반면 char16비트를 차지 합니다 . int여기서는 필요한 숫자인 32816이 범위를 벗어났기 때문에 선택했습니다 short. short와 마찬가지로 크기는 char16비트이지만 char범위에 음수가 없으므로 "양수" 범위는 char두 배 더 큽니다(32767 대신 65536 short). int코드가 65536 범위 내에 있으면 을 사용할 수 있습니다 . 그러나 숫자를 생성하면 int >6553616비트 이상을 차지하게 됩니다. 그리고 유형을 좁힐 때:
char c = (char) x;
여분의 비트는 버려지고 결과는 전혀 예상치 못한 결과가 됩니다.

문자와 정수 추가의 특징

다음과 같은 특이한 예를 살펴보겠습니다.
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
콘솔 출력: 50 O_O 논리는 어디에 있습니까? 1+1, 50은 어디서 왔는가?! char값은 문자의 유니코드를 나타내는 0에서 65536 사이의 숫자로 메모리에 저장된다는 것을 이미 알고 있습니다 . 기본 유형의 확장 및 축소 - 6 여기 있습니다. 덧셈을 수행하면 char일부 정수 유형이 char유니코드에서 해당 숫자로 변환됩니다. 코드에 1과 '1'을 추가하면 기호 '1'이 해당 코드인 49로 변환되었습니다(위 표에서 확인할 수 있음). 따라서 결과는 50이 되었습니다. 다시 한 번 우리의 오랜 친구인 -耰를 예로 들어 여기에 숫자를 더해 보겠습니다.
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
콘솔 출력: 33016 우리는耰가 코드 32816에 해당한다는 것을 이미 알아냈습니다. 그리고 이 숫자와 200을 더하면 정확히 33016이라는 결과를 얻게 됩니다. :) 보시다시피 작동 메커니즘은 매우 간단합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION