>  기사  >  Java  >  Java의 오토박싱 및 언박싱

Java의 오토박싱 및 언박싱

PHPz
PHPz원래의
2024-08-30 16:06:21670검색

오토박싱은 기본 유형과 해당 래퍼 클래스 객체 간의 Java 컴파일러의 자동 변환입니다. 즉, int에서 Integer로, double에서 Double로의 변환입니다. Unboxing은 래퍼 클래스 객체에서 동등한 기본 유형으로의 자동 변환입니다. 즉, 정수에서 정수로. 이 기능은 Java 버전 1.5에서 도입되었습니다.

Java에서 Autoboxing과 Unboxing은 어떻게 작동하나요?

컴파일러는 내부적으로 valueOf() 메서드를 사용하여 프리미티브를 해당 래퍼 객체(예: 오토박싱)로 변환하고, 그 반대의 경우 unboxing 패러다임과 마찬가지로 intValue(), doubleValue() 등을 사용합니다.

무료 소프트웨어 개발 과정 시작

웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등

Java의 기본 유형과 래퍼 클래스 매핑은 다음과 같습니다.

Primitive type Wrapper class
boolean Boolean
byte Byte
char Character
float Float
int Integer
long Long
short Short
double Double

정수 ArrayList를 사용하여 언박싱 개념을 활용해 보겠습니다.

import java.util.ArrayList;
public class MyClass {
public static void main(String args[]) <em>{</em>
ArrayList<Integer> intlist = new ArrayList<Integer>();
//wrapper Integer objects being added here
intlist.add(1);
interest.add(2);
//auto-unboxing is happening here
int x = intlist.get(0);
System.out.println(x);
}
}

따라서 위의 예에서 x에 값을 추가하는 동안 x가 원시적인 것처럼 보이는 것을 알 수 있습니다. 결과적으로 할당이 완료되는 동안 여기에서 언박싱이 자동으로 수행됩니다.

public class MyClass {
public static void main(String args[]) {
Integer sum =0;
for(int i=0;i<10;i++)
{
sum = sum + i;
}
System.out.println(sum);
}
}
  • 위에서는 이러한 맥락에서 일반적인 시나리오가 제시된 두 번째 예를 보여주었습니다. Java에서 객체 생성에 익숙하다면 "Integer sum =0"이 객체를 선언하는 것을 볼 수 있고 루프 내부에서 계산을 수행하면 기본 값 "i"가 래퍼 "sum."
  • 따라서 "+" 연산자는 프리미티브에서만 작동하므로 먼저 래퍼에서 프리미티브로의 변환이 발생한다는 것을 알 수 있습니다. 따라서 개체 언박싱이 먼저 발생합니다. 그런 다음 계산이 발생하고 그 후에 객체 오토박싱이 다시 발생합니다. 그런 다음 해당 값이 "sum" 변수에 할당됩니다.
  • 많은 중간 Integer 객체가 생성된 다음 삭제되어(나중에 가비지 수집됨) 이로 인해 속도가 저하되므로 JVM에 불필요한 오버헤드가 발생합니다. 따라서 이러한 논리는 주의해서 다루어야 합니다.
  • 일반적인 인식과 조건이 어떻게 다른지 살펴보겠습니다. 오토박싱과 언박싱을 이해하기 위해 몇 가지 코딩을 사용하겠습니다.

아래에 있는 스니펫을 고려해 보세요. 이것의 결과는 무엇입니까?

public class Main
{
public static void main(String[] args) {
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
}
}
  • 'true'라고 말하면 출력도 'false'이므로 'false'입니다. -128부터 127까지의 정수 범위를 비교할 수 있으므로 이 범위를 벗어나는 값은 unboxing해야 합니다.
  • 결과적으로 위 정수의 intValue()를 비교해야 합니다. 지금은 컴파일러가 valueOf() 속성을 사용하여 이 작업을 수행합니다.
  • 이 범위가 위에 인용된 범위에 속할 경우 위 코드는 비교를 위해 먼저 정수 리터럴 풀을 참조하므로 "true"를 제공할 가능성이 높습니다.
public class Main
{
public static void main(String[] args) {
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
}
}

리터럴 풀에 100이 있으므로 이는 "참" 값으로 평가됩니다.

메서드 오버로딩을 사용한 Java의 Autoboxing 및 Unboxing

  • 메서드 오버로딩으로 autoboxing 및 unboxing에 태그를 지정하기 전에 독자가 메서드 오버로딩의 개념을 이해하고 있다고 가정합니다. 우리는 단지 몇 가지 통찰력만 제공할 것이며, 자세한 내용은 동일한 Oracle 문서를 참조하십시오.
  • 메서드 오버로드는 동일한 메소드 이름과 다른 수의 입력 인수, 동일한 이름을 가진 다양한 데이터 유형의 변수 등을 사용하여 모든 계산 방법의 여러 변형을 제시하는 프로세스입니다.
  • 이해를 돕기 위해 예를 들어보겠습니다. 출력 이미지는 아래와 같습니다.
public class Main
{
public static void main(String[] args) {
Overload obj =  new Overload();
int i =5;
obj.printval(5);
Integer m = i;
obj.printval(m);
}
}
class Overload
{
public void printval(int i)
{
System.out.println("printing the unboxed value "+ i);
}
public void printval(Integer i)
{
System.out.println("printing the autoboxed value "+ i);
}
}

출력:

Java의 오토박싱 및 언박싱

참고: 모든 IDE에서 위 프로그램을 실행하여 위의 출력을 얻을 수 있습니다.
  • 결과적으로 위의 동작은 오토박싱 기술이 개념 오버로딩에 유용하며 코딩 시 주의해서 사용해야 함을 명백히 나타냅니다.

Java Autoboxing 및 Unboxing의 장점

  • 컴파일러는 자동으로 적절한 변환을 수행합니다.
  • 개발자가 코드를 적게 작성하여 더욱 깔끔한 코드를 만들 수 있습니다.
  • 수동으로 형변환 표현식을 사용할 필요가 없습니다.

 결론

우리는 오토박싱과 언박싱의 사용 사례와 이 개념이 얼마나 암시적인지, 그리고 장단점을 살펴보았습니다. 코딩할 때 주의해서 사용해야 합니다. 그렇지 않으면 불필요한 계산 변환 오버헤드가 추가될 수 있습니다. 결과적으로 과도한 가비지 수집 오버헤드와 임시 개체 생성을 방지하려면 기본 형식에서 변환을 수행해야 합니다. 또한 Java의 오버로드 개념을 사용한 오토박싱의 사용 사례도 살펴보았습니다. 이와 함께 몇 가지 제약사항을 더 확인하실 수 있습니다.

위 내용은 Java의 오토박싱 및 언박싱의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Java의 2D 그래픽다음 기사:Java의 2D 그래픽