jdk1.5 이후에 소개된 새로운 컨텐츠입니다. 퍼블리싱이 최고의 추억이라고 주장하면서, 블로그로 메모리를 교체하기로 결정했습니다.
Java 언어 사양에 따르면 다음과 같습니다. 많은 경우 패키징 및 언패킹은 컴파일러 자체에서 수행됩니다(이 경우 패키징을 박싱(boxing)이라고 하며 패키징 풀기를 언박싱(unboxing)이라고 합니다).
실제로 내가 이해한 바에 따르면 자동 박싱은 Java의 객체 지향을 준수하기 위해 기본 데이터 유형을 객체 유형으로 캡슐화하는 것으로 간단히 이해될 수 있습니다. 예를 들어 int를 사용합니다.
다음과 같이 코드 코드를 복사합니다 .
//Integer 객체 선언
정수 숫자 = 10;
//위 명령문은 자동 박싱을 사용합니다. 다음과 같이 구문 분석됩니다.
Integer num = new Integer(10); 위의 예는 10이 기본 데이터 유형에 속하기 때문에 원칙적으로 Integer 객체에 직접 할당할 수 없지만 jdk1.5 이후에는 다음과 같은 명령문을 수행할 수 있습니다. 기본 데이터 유형을 해당 캡슐화된 유형으로 자동 변환하는 오토박싱의 매력입니다. 객체가 된 후 객체가 선언한 모든 메서드를 호출하여 자동으로 unboxing할 수 있습니다. 따라서 이름은 객체를 기본 데이터 유형으로 다시 변환한다는 의미입니다.
//권투
정수 숫자 = 10;
//언박싱
int num1 = num; 자동 언박싱의 가장 일반적인 용도는 작업을 수행할 때입니다. 왜냐하면 객체는 직접 연산되지 않지만 덧셈, 뺄셈, 곱셈 및 나눗셈을 수행하기 전에 기본 데이터 유형으로 변환해야 하기 때문입니다.
정수 숫자 = 10;
// 계산을 수행할 때 자동 언박싱이 암시적으로 적용됩니다.
System.out.print(num--); 하하, 매우 간단하게 느껴질 것입니다. 이제 좀 더 어려운 것에 대해 이야기하겠습니다.
//-128~127 이외의 숫자
정수 num1 = 297; 정수 num2 = 297;
System.out.println("num1==num2: "+(num1==num2));
// -128~127 이내의 숫자
정수 num3 = 97; 정수 num4 = 97;
System.out.println("num3==num4: "+(num3==num4)); 인쇄된 결과는 다음과 같습니다: num1==num2: false num3==num4: true
이상합니다. 이는 Java의 Integer 및 int 자동 박싱 및 언박싱 설계 때문입니다. 플라이웨이트 모드(flyweight)라고 하는 모드입니다.
단순 숫자의 재사용을 늘리기 위해 Java는 다음을 정의합니다. 자동 박싱 중에 128과 127 사이의 값에 대해 Integer 객체로 박싱된 후 재사용을 위해 메모리에 저장되며 항상 하나만 존재합니다. 개체가 128에서 127 사이의 값을 초과하면 박스형 Integer 개체가 재사용되지 않습니다. 이는 상자형으로 묶일 때마다 새 Integer 개체를 만드는 것과 같습니다. 위 현상은 원인에 의해 발생합니다. 오토박싱, 오토박싱을 사용하지 않고 일반 클래스처럼 인스턴스화하기 위해 new를 사용하면 새로 생성될 때마다 새 객체가 생성됩니다.
이 자동 boxing 및 unboxing은 기본 데이터 유형뿐만 아니라 String 클래스에서도 사용됩니다. 예를 들어 String 객체를 자주 선언하는 경우입니다.
다음과 같이 코드 코드를 복사합니다 .
문자열 str = "sl";
//다음 선언 메소드를 대체합니다.
String str = new String("sl");
기본 데이터(Primitive) 형태의 Autoboxing과 Unboxing은 J2SE 5.0부터 제공되는 기능이다. 기본 데이터 유형을 패키징하는 데 편리함을 제공하지만, 세부적인 내용을 숨길 수도 있습니다. 기본 데이터 유형과 객체의 차이점을 구분할 수 있는 경우에만 사용하는 것이 좋습니다.
오토박싱과 언박싱
Java에서는 처리되는 거의 모든 것이 객체(Object)입니다. 예를 들어 이전에 사용했던 Scanner도 객체이고, String(String)도 객체입니다. 그러나 기본 데이터 유형은 객체, 즉 int, double, boolean 등을 사용하여 정의하는 변수와 직접 작성하는 리터럴 상수가 아닙니다.
이전 섹션에서 객체 조작의 편리성을 대략적으로 살펴봤고, Java를 한동안 사용해 본 사람이라면 기본 데이터 유형을 객체로 변환해야 하는 경우가 있다는 것을 알고 있습니다. 예를 들어 Map 객체의 put() 메서드를 사용할 때 전달해야 하는 매개변수는 기본 데이터 유형이 아닌 객체입니다.
기본 데이터 유형을 객체로 래핑하려면 래퍼 유형(Wrapper Types)을 사용해야 합니다. 이전 섹션에서 J2SE 5.0 이전에는 다음 명령문을 사용하여 int를 Integer 객체로 래핑해야 한다는 것을 이미 알고 있습니다. 정수(10) ;
J2SE 5.0 이후에는 자동 박싱 기능이 제공됩니다. 기본 데이터 유형을 패킹하려면 다음 명령문을 직접 사용할 수 있습니다. Integer 정수 = 10;
컴파일할 때 컴파일러는 작성한 명령문을 기반으로 자동 박싱을 수행할지 여부를 자동으로 결정합니다. 위의 예에서 정수는 Integer 클래스의 인스턴스를 나타냅니다. boolean, byte, short, char, long, float, double 등과 같은 기본 데이터 유형에 동일한 작업을 적용할 수 있습니다. 해당 래퍼 유형(래퍼 유형) Boolean, Byte, Short, Character, Long, Float 또는 Double은 각각 사용됩니다. 예제 4.4를 다시 작성하기 위해 오토박싱 기능을 직접 사용해 보겠습니다.
예제 4.5 AutoBoxDemo.java
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 AutoBoxDemo {
공개 정적 무효 메인(String[] args) {
정수 데이터1 = 10;
정수 데이터2 = 20;
//Double 값으로 변환하고 3으로 나눕니다.
System.out.println(data1.doubleValue() / 3);
//두 값 비교
System.out.println(data1.compareTo(data2));
}
}
프로그램은 훨씬 간단해 보입니다. data1과 data2는 런타임 시 Integer의 인스턴스이며 개체 작업을 직접 수행할 수 있습니다. 결과는 다음과 같습니다.
3.3333333333333335
1
자동 복싱을 사용하는 방법은 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다 .
int i = 10;
정수 정수 = i;
또한 오토박싱을 위해 보다 일반적인 java.lang.Number 클래스를 사용할 수도 있습니다. 예를 들어:
숫자 = 3.14f;
3.14f는 자동으로 Float로 박싱된 후 번호에 할당됩니다.
J2SE 5.0부터는 자동 boxing과 자동 unboxing이 가능합니다. 즉, 객체에 있는 기본 데이터 양식 정보를 자동으로 객체에서 빼냅니다. 예를 들어 다음과 같이 작성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다 .
정수 fooInteger = 10;
int fooPrimitive = fooInteger;
fooInteger가 자동으로 Integer로 boxing된 인스턴스를 참조한 후 int 유형의 fooPrimitive 변수에 할당되면 자동으로 int 유형으로 변경된 다음 fooPrimitive에 할당됩니다. 작동 중에는 자동 박싱 및 언박싱도 수행할 수 있습니다. 예를 들어:
다음과 같이 코드 코드를 복사합니다 .
정수 i = 10;
System.out.println(i + 10);
System.out.println(i++);
위의 예에서는 20과 10이 표시됩니다. 컴파일러는 자동으로 박싱 및 언박싱을 수행합니다. 즉, 10이 먼저 박싱된 다음 i + 10일 때 먼저 박싱이 해제되고 i++가 수행됩니다. 라인도 먼저 박싱을 해제한 다음 증분 작업을 수행합니다. 또 다른 예를 살펴보겠습니다.
다음과 같이 코드 코드를 복사합니다 .
부울 부 = 참;
System.out.println(boo && false);
동일한 boo는 원래 Boolean의 인스턴스입니다. AND 연산을 수행하면 boo가 먼저 unboxing된 다음 false로 AND 처리되어 결과가 false로 표시됩니다.
///////////////////////////////////////////////// /// //////////////////
Boxing: 기본 유형에서 Object 유형으로 변환하는 것을 boxing이라고 합니다. ***Unboxing: Object에서 기본 유형으로 변환하는 작업을 unboxing이라고 합니다. 이 작업은 일반적으로 반사 과정에서 사용됩니다.
Packing: 힙에 Object 인스턴스를 생성하고 지정한 값을 복사합니다. ***Unboxing: 참조가 가리키는 힙의 정보가 분할할 유형인지 확인하고 힙에서 값을 가져와 보냅니다. 스택 변수에 저장합니다. 그렇지 않으면 예외가 보고됩니다.
///////////////////////////////////////////////// /// ///////////////////
박싱은 값 유형을 객체 유형 또는 값 유형이 구현하는 인터페이스 유형으로 은둔적으로 변환하는 것입니다.
값 유형을 박싱하면 개체 인스턴스가 할당되고 해당 값이 새 개체에 복사됩니다.
다음과 같이 코드 코드를 복사합니다 .
정수 i=123;
객체 o=i;
이 문장의 결과는 힙의 int 유형 값을 참조하는 객체 o를 스택에 생성하는 것입니다. 이 값은 변수 i에 할당됩니다.
값 유형 값의 복사본입니다.
아래는 boxing 변환을 수행하는 디스플레이입니다.
다음과 같이 코드 코드를 복사합니다 .
정수 i=123;
객체 o=(객체)i;
이 예에서는 박싱을 통해 정수 변수 i를 객체 o로 변환합니다. 이렇게 하면 변수 i에 저장된 값이 123에서 456으로 변경됩니다. 이 예에서는 객체가 콘텐츠의 원본 복사본을 유지함을 보여줍니다. 123입니다.
Unboxing은 객체 유형에서 값 유형으로 또는 인터페이스 유형에서 인터페이스를 구현하는 값 유형으로 명시적으로 변환하는 것입니다. 개봉 작업에는 다음이 포함됩니다.
객체 인스턴스를 검사하여 주어진 값 유형의 박스형 값인지 확인합니다.
인스턴스의 값을 값 유형 변수에 복사합니다.
예:
다음과 같이 코드 코드를 복사합니다 .
정수 i=123;
객체 상자=i;
int j=(int)상자;