programing

Java에서 자동 박스와 언박스를 사용하는 이유는 무엇입니까?

sourcetip 2022. 10. 2. 23:18
반응형

Java에서 자동 박스와 언박스를 사용하는 이유는 무엇입니까?

자동 박스는 Java 컴파일러가 원시 유형과 대응하는 객체 래퍼 클래스 간에 수행하는 자동 변환입니다.예를 들어 int를 Integer로, double을 Double로 변환하는 등입니다.변환이 반대로 진행되면 이를 언박싱이라고 합니다.

그러면 왜 이것이 필요하고, 왜 Java에서 자동 박스와 언박스를 사용하는 걸까요?

이 배경의 주된 이유를 완전히 이해하기 위해서는 몇 가지 맥락이 필요합니다.

기본과 클래스 비교

Java의 원시 변수에는 값(정수, 2배 정밀도의 부동 소수점 이진수 등)이 포함됩니다.이러한 값은 길이가 다를있으므로 값을 포함하는 변수마다 길이가 다를 수 있습니다.floatvs 대 double를 참조해 주세요.

한편 클래스 변수에는 인스턴스에 대한 참조가 포함됩니다.참조는 일반적으로 여러 언어로 포인터(또는 포인터와 매우 유사한 것)로 구현됩니다.이러한 디바이스는 일반적으로 참조하는 인스턴스의 크기에 관계없이 크기가 동일합니다( ).Object,String,Integer 참조)

클래스 변수의 이러한 특성은 클래스 변수가 포함하는 참조를 (어느 정도) 교환할 수 있게 한다.이를 통해 대체라고 하는 작업을 수행할 수 있습니다.대략적으로 말하면 특정 유형의 인스턴스를 다른 관련 유형의 인스턴스로 사용하는 것입니다(사용 방법:StringObject★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

원시 변수는 동일한 방식으로 서로 또는 서로 호환되지 않습니다.Object가장 확실한 이유는 (단, 유일한 이유는 아니지만) 크기 차이입니다.이것은 이 점에서 원시적인 유형을 불편하게 만들지만, 우리는 여전히 언어(주로 성능으로 요약되는 이유)로 그것들을 필요로 한다.

제네릭 및 유형 삭제

범용 유형은 하나 이상의 유형 매개 변수를 가진 유형입니다(정확한 수를 범용 유형이라고 합니다).예를 들어 일반 유형 정의 List<T> 타입이 .T 하면 '다'라고 할 수 Object(콘크리트 타입 생성) List<Object>String )List<String>Integer )List<Integer>입니니다

제네릭 타입은 비제너릭 타입보다 훨씬 복잡합니다.Java에 도입되었을 때(초기 출시 후), JVM에 근본적인 변경을 가하거나 오래된 바이너리와의 호환성을 깨는 것을 피하기 위해 Java의 제작자들은 가장 침습성이 적은 방법으로 범용 타입을 구현하기로 결정했습니다: 모든 구체적인 타입의List<T> 2진법으로되어 있습니다.List<Object>타입의 는 (바운드가) 아닌 이 될 수.Object하지만 요점은 알 수 있습니다.)이 프로세스에서는 범용 aritytype 파라미터 정보가 손실되므로 type errase라고 부릅니다.

둘을 합치다

는 위의입니다. 즉, 만약 이 현실의 조합입니다.List<T> becomes가 되다List<Object>모든 경우 에 직접 할당할 수 있는 타입이어야 합니다.다른 어떤 것도 허용될 수 없습니다.아까도 말씀드렸듯이int,float ★★★★★★★★★★★★★★★★★」doubleObject , 는 수 List<int>,List<float> ★★★★★★★★★★★★★★★★★」List<double> 한 (JVM의 경우)

는 "Java"와 같은 합니다.Integer,Float ★★★★★★★★★★★★★★★★★」Double인스턴스에서 효과적으로 .Object, 범용 타입은 (사용자가 (사용할 수 있기 때문에) 프리미티브에서도 간접적으로 동작할 수 있습니다.List<Integer>,List<Float>,List<Double>등 ) 。

「」의 .Integer int ,a ,aFloat float이런 걸 복싱이라고 하죠그 반대는 언박싱이라고 불립니다.원형을 사용할 때마다 상자에 넣어야 하기 때문입니다.Object불편합니다.언어가 자동으로 기능을 수행하는 경우있습니다.이것 오토박싱이라고 합니다.

자동 박스는 원시 데이터 유형을 래퍼 클래스 개체로 변환하는 데 사용됩니다.래퍼 클래스는 원시 유형에서 수행할 수 있는 광범위한 기능을 제공합니다.가장 일반적인 예는 다음과 같습니다.

int a = 56;
Integer i = a; // Auto Boxing

프로그래머가 코드를 직접 쓸 수 있기 때문에 필요하며 JVM이 Boxing과 Unboxing을 담당합니다.

auto boxing은 java.util을 사용할 때도 편리합니다.컬렉션 타입원시 유형의 컬렉션을 만드는 경우 원시 유형의 컬렉션을 직접 만들 수 없습니다. 개체 모음만 만들 수 있습니다.예:

ArrayList<int> al = new ArrayList<int>(); // not supported 

ArrayList<Integer> al = new ArrayList<Integer>(); // supported 
al.add(45); //auto Boxing 

래퍼 클래스

Java의 8가지 기본 유형(바이트, 쇼트, int, 플로트, char, double, boolean, long)은 각각 별도의 래퍼 클래스를 가지고 있습니다.이러한 Wrapper 클래스에는 원시 데이터 유형에 대한 유용한 작업을 미리 형성하기 위한 미리 정의된 메서드가 있습니다.

래퍼 클래스 사용

String s = "45";
int a = Integer.parseInt(s); // sets the value of a to 45.

Wrapper 클래스에서 제공하는 유용한 함수는 많습니다.Java 문서를 보려면 여기를 클릭하십시오.

Unboxing은 래퍼 클래스 개체를 기본 유형으로 다시 변환하는 Auto Boxing과 반대입니다.이 작업은 JVM에 의해 자동으로 수행되므로 래퍼 클래스를 특정 작업에 사용한 후 원시 유형으로 다시 변환하여 처리 속도를 높일 수 있습니다.예:

Integer s = 45;
int a = s; auto UnBoxing;

개체와 함께 작동하는 컬렉션의 경우 자동 언박싱만 사용됩니다.방법은 다음과 같습니다.

ArrayList<Integer> al = new ArrayList<Integer>();
al.add(45);

int a = al.get(0); // returns the object of Integer . Automatically Unboxed . 

원시(비개체) 유형은 효율성에 있어 정당성이 있습니다.

시형 the 。int, boolean, double에서 사용할 수 있는 입니다.Object는 참조입니다.★★★★★★★★★★★★★★★★★★」

int i;
double x;
Object s;

로컬 메모리 4+8+8이 필요합니까?이 경우 객체의 경우 메모리에 대한 참조(주소)만 저장됩니다.

Integer, Double또는 히프 메모리 내의 일부 Integer/Double 인스턴스에 대한 간접적인 참조를 도입할 수도 있습니다.

왜 복싱이 필요한가?

그것은 상대적인 범위의 문제이다. is래, 것음음, 음음음음음음음음음음 in in in in in in in in in in in in in in in in 를 가질 수 있도록 .ArrayList<int> 올리기 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .

답변: 현시점에서는 ArrayList는 오브젝트에 대해서만 기능하며 오브젝트 참조를 위한 공간을 예약하고 가비지 컬렉션을 관리합니다.따라서 범용 유형은 개체 하위 유형입니다.따라서 부동소수점 값의 ArrayList를 원하는 경우 더블 오브젝트로 더블을 랩해야 합니다.

자바어 C++어느니 C++ 클래스vector<string>, vector<int>2년 전하다Java 설계에서는 ArrayList.class를 1개 사용하는 것을 목표로 하고 있으며 모든 파라미터 타입에 새로운 컴파일 제품이 필요하지 않습니다.

따라서 오브젝트에 대한 박스가 없으면 파라미터 타입이 발생할 때마다 클래스를 컴파일해야 합니다.Concreto: 모든 컬렉션 또는 컨테이너 클래스에 Object, int, double, boolean 버전이 필요합니다.Object 버전은 모든 자식 클래스를 처리합니다.

사실, 이러한 다양화의 필요성은 이미 자바 SE for IntBuffer, CharBuffer, DoubleBuffer 등 int, char, double로 동작합니다.공통의 소스로부터 이러한 소스를 생성함으로써, 허술한 방법으로 해결되었습니다.

JDK 5부터 Java는 자동 박스와 자동 박스라는 두 가지 중요한 기능을 추가했습니다.AutoBoxing은 기본 유형이 이러한 개체가 필요할 때마다 해당 래퍼에 자동으로 캡슐화되는 프로세스입니다.개체를 명시적으로 구성할 필요는 없습니다.자동 언박스는 캡슐화된 객체의 값이 필요할 때 자동으로 유형 래퍼에서 추출되는 프로세스입니다.intValue()나 doubleValue() 등의 메서드를 호출할 필요는 없습니다.

자동 박스와 자동 언박스의 추가에 의해, 알고리즘의 기입이 큰폭으로 심플해지기 때문에, 수동 박스와 값의 언박스의 미끼가 없어집니다.실수를 피하는 것도 도움이 됩니다.또, 물건만을 조작하는 제네릭에게도 매우 중요합니다.마지막으로 자동 박스는 Collections Framework를 사용한 작업을 용이하게 합니다.

일부 데이터 구조에서는 개체만 사용할 수 있으며 원시 유형은 사용할 수 없습니다.

예: HashMap의 키.

자세한 것은, 다음의 질문을 참조해 주세요.HashMap 및 int as 키

데이터베이스의 "int" 필드 등 NULL일 수 있는 다른 타당한 이유가 있습니다.Java의 int는 null일 수 없습니다.Integer 참조는 null일 수 있습니다.자동 박스와 언박스는 변환 시 외부 코드를 쓰지 않도록 하는 기능을 제공합니다.

왜 우리는 (언)이 있는 거죠?

원시 요소와 객체 지향(OO) 대안을 혼합하는 쓰기 코드를 보다 편안하고 덜 상세하게 만듭니다.

왜 우리는 원초적 요소와 그들의 OO 대안을 가지고 있는가?

은 () 클래스가 아니기 때문에 (C#의) .Object덮어쓸 수 없습니다.

, 원형이 있다, 원형이 있다, 원형이 있어요.int 이유로,및 「」의Object IntegerOO 프로그래밍의 이점을 위해, 그리고 부차적인 점으로서 효용 상수와 방법을 위한 좋은 위치를 확보하는 것(Integer). 및 MAX_VALUE »Integer.toString(int)를 참조해 주세요.

OOO의 장점은 Generics에서 가장 쉽게 확인할 수 있습니다(List<Integer>)는, 이것에 한정되는 것은 아닙니다.예를 들어 다음과 같습니다.

Number getMeSome(boolean wantInt) {

    if (wantInt) {
        return Integer.MAX_VALUE;
    } else {
        return Long.MAX_VALUE;
    }
}

ArrayList는 기본 유형만 지원하는 클래스를 지원하지 않습니다.그러나 우리는 int, double 등과 같은 원시적인 유형을 사용해야 한다.

ArrayList<String> strArrayList = new ArrayList<String>(); // is accepted.

ArrayList<int> intArrayList = new ArrayList<int>(); // not accepted.

Integer 클래스는 object.so 벨로우 코드에서 primitive type int 값을 랩합니다.

ArrayList<Integer> intArrayList = new ArrayList<Integer>(); // is accepted.

add(value) 방식으로 값을 추가할 수 있습니다.StrArrayList 코드에서 String 값을 추가하려면 "Hello"라고 말하면 됩니다.

strArrayList.add("Hello");  

그리고 int 값을 더하면 우리는 54를 쓸 수 있다.

intArrayList.add(54);

그러나 intArrayList.add(54)를 쓰면 컴파일러는 다음 행으로 변환됩니다.

intArrayList.add(Integer.valueOf(54)); 

에서 쉽고 수 는 "intArrayList.add(54)"라는어려운 작업을 합니다.intArrayList.add(Integer.valueOf(54));자동 복싱

는 intArrayList.get(0)로 됩니다.<code>intArrayList.get(0).intValue();자동 언박싱 ★★★

종류가 다르고 편리하기 때문입니다.퍼포먼스가 원시적인 타입의 이유일 가능성이 있습니다.

자동 상자 설정: 기본 값을 해당하는 래퍼 클래스의 개체로 변환합니다.

언박싱: 래퍼 형식의 오브젝트를 대응하는 프리미티브 값으로 변환합니다.

// Java program to illustrate the concept 
// of Autoboxing and Unboxing 
import java.io.*; 

class GFG 
{ 
    public static void main (String[] args) 
    { 
        // creating an Integer Object 
        // with value 10. 
        Integer i = new Integer(10); 

        // unboxing the Object 
        int i1 = i; 

        System.out.println("Value of i: " + i); 
        System.out.println("Value of i1: " + i1); 

        //Autoboxing of char 
        Character gfg = 'a'; 

        // Auto-unboxing of Character 
        char ch = gfg; 
        System.out.println("Value of ch: " + ch); 
        System.out.println("Value of gfg: " + gfg); 

    } 
} 

또 다른 특별한 경우는,

Integer intval = null;
int toPrimitive = intval;
System.out.println(toPrimitive);

는 ★★★★★★★★★★★★★★★★★★★★★★★★★NullPointerException, NPE, NPE를 잡을 뜻입니다.

언급URL : https://stackoverflow.com/questions/27647407/why-do-we-use-autoboxing-and-unboxing-in-java

반응형