JavaRush /Java Blog /Random-KO /Java의 오토박싱 및 언박싱
DSergey_Kh
레벨 12

Java의 오토박싱 및 언박싱

Random-KO 그룹에 게시되었습니다
이 기사에서는 autoboxing/unboxing 이라는 Java의 기능을 살펴보겠습니다 . Autoboxing 및 Unboxing은 기본 유형을 객체 유형으로 또는 그 반대로 변환하는 기능입니다. Java의 Autoboxing 및 Unboxing - 1전체 프로세스는 JRE(Java Runtime Environment)에 의해 자동으로 수행됩니다. 하지만 이 기능을 구현할 때는 주의해야 합니다. 왜냐하면... 이는 프로그램 성능에 영향을 미칠 수 있습니다.

소개

intJDK 1.5 이하 버전에서는 , char, 와 같은 기본 데이터 유형을 래퍼 클래스 Integer, Character, Float, Double로 float변환 하는 것이 쉽지 않았습니다 . doubleJDK 5부터 기본 유형을 동등한 객체로 변환하는 이 기능이 자동으로 구현됩니다. 이 속성을 Autoboxing 이라고 합니다 . 그 반대 프로세스는 각각 Unboxing 입니다 . 객체를 해당 기본 유형으로 변환하는 프로세스입니다. Autoboxing 및 Unboxing 에 대한 샘플 코드는 다음과 같습니다.
Integer integer = 9;
언박싱
int in = 0;
in = new Integer(9);
자동 포장 및 포장 풀기는 언제 사용됩니까? Autoboxing은 다음 조건에서 Java 컴파일러에 의해 사용됩니다.
  • 기본 유형의 값이 해당 래퍼 클래스의 객체를 기대하는 메소드 매개변수로 메소드에 전달되는 경우.
  • 기본 유형의 값이 해당 래퍼 클래스의 변수에 할당되는 경우.
다음 예를 고려하십시오. 목록 1: 오토박싱을 보여주는 간단한 코드
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
jdk 1.5 이전에는 나머지 연산자 % 및 단항 더하기 +=를 래퍼 클래스에 적용할 수 없었기 때문에 위 코드에서 컴파일 오류가 발생했습니다. 그러나 jdk 1.5 이상에서는 이 코드가 오류 없이 컴파일되어 Integer를 int. Unboxing은 다음 조건에서 Java 컴파일러에 의해 사용됩니다.
  • 해당 기본 유형을 기대하는 메소드에 객체가 매개변수로 전달되는 경우.
  • 객체가 해당 기본 유형의 변수에 할당되는 경우.
다음 예를 고려하십시오. 목록 2: 언박싱을 보여주는 간단한 코드
import java.util.ArrayList;
import java.util.List;

public class UnboxingCheck {

public static void main(String[] args) {
Integer in = new Integer(-8);

// 1. Распаковка через вызов метода
int absVal = absoluteValue(in);
System.out.println("absolute value of " + in + " = " + absVal);

List<Double> doubleList = new ArrayList<Double>();

// Автоупаковка через вызов метода
doubleList.add(3.1416);

// 2. Распаковка через присвоение
double phi = doubleList.get(0);
System.out.println("phi = " + phi);
}

public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
오토박싱과 언박싱을 통해 개발자는 읽고 이해하기 쉬운 코드를 작성할 수 있습니다. 다음 표는 기본 데이터 유형과 해당 래퍼 객체를 보여줍니다.
기본 유형 쉘 클래스
부울 부울
바이트 바이트
성격
뜨다 뜨다
정수 정수
짧은 짧은
표 1: 비교 ​​연산자가 포함된 기본 유형 및 동등한 래퍼 클래스 Autoboxing 및 unboxing은 비교 연산자와 함께 사용할 수 있습니다. 다음 코드 조각은 이것이 어떻게 발생하는지 보여줍니다. 목록 3: 비교 연산자를 사용하여 자동박싱 및 언박싱을 보여주는 샘플 코드
public class BoxedComparator {
  public static void main(String[] args) {
      Integer in = new Integer(25);
      if (in < 35)
          System.out.println("Value of int = " + in);
  }
}
메서드 오버로드 시 자동 패킹 및 압축 풀기 다음 규칙에 따라 메서드를 오버로드할 때 자동 패킹 및 압축 풀기가 수행됩니다.
  • 확장과 패키징 중 하나를 선택해야 하는 상황에서는 확장이 패키징을 "패배"합니다. 확장이 더 좋습니다.
목록 4: 오버로드의 이점을 보여주는 샘플 코드
public class WideBoxed {
  public class WideBoxed {
  static void methodWide(int i) {
       System.out.println("int");
   }

  static void methodWide( Integer i ) {
      System.out.println("Integer");
  }

  public static void main(String[] args) {
      short shVal = 25;
      methodWide(shVal);
  }
 }
}
프로그램 출력 - 유형int
  • 확장이 가변 개수의 인수를 이긴다. 확장과 가변 개수 인수 중 하나를 선택해야 하는 상황에서는 확장이 바람직하다.
목록 5: 오버로드의 이점을 보여주는 샘플 코드
public class WideVarArgs {

    static void methodWideVar(int i1, int i2) {
      System.out.println("int int");
    }

    static void methodWideVar(Integer... i) {
       System.out.println("Integers");
    }

   public static void main( String[] args) {
       short shVal1 = 25;
      short shVal2 = 35;
     methodWideVar( shVal1, shVal2);
   }
  }
  • Packing이 가변 개수의 인수를 이긴다. Packing과 가변 개수의 인수 중 하나를 선택해야 하는 상황에서는 Packing이 바람직하다.
목록 6: 오버로드의 이점을 보여주는 샘플 코드
public class BoxVarargs {
     static void methodBoxVar(Integer in) {
         System.out.println("Integer");
     }

     static void methodBoxVar(Integer... i) {
         System.out.println("Integers");
     }
     public static void main(String[] args) {
         int intVal1 = 25;
         methodBoxVar(intVal1);
    }
}
자동 패킹을 사용하는 동안 다음 사항을 염두에 두어야 합니다. 우리가 알고 있듯이 모든 좋은 기능에는 단점이 있습니다. 이와 관련하여 자동 포장도 예외는 아닙니다. 이 기능을 사용할 때 개발자가 명심해야 할 몇 가지 중요한 참고 사항은 다음과 같습니다.
  • ' ' 연산자를 사용하여 객체를 비교하는 것은 ==기본 유형 및 객체에 적용될 수 있으므로 혼란스러울 수 있습니다. 이 연산자를 객체에 적용하면 실제로 객체 자체가 아닌 객체에 대한 참조를 비교합니다.
목록 7: 비교를 보여주는 샘플 코드.
public class Comparator {
   public static void main(String[] args) {
     Integer istInt = new Integer(1);
       Integer secondInt = new Integer(1);

       if (istInt == secondInt) {
         System.out.println("both one are equal");

       } else {
          System.out.println("Both one are not equal");
      }
   }
}
  • 객체와 기본 유형을 항등 및 관계 연산자와 혼합합니다. 기본 유형을 객체와 비교하면 객체가 unboxing되어 NullPointerException객체가 있는 경우 던질 수 있습니다 null.
  • 객체 캐싱. 이 메서드는 valueOf()캐시하는 기본 개체의 컨테이너를 만듭니다. 값은 -128부터 127까지의 범위에 캐시되므로 캐시된 개체는 다르게 동작할 수 있습니다.
  • 성능 저하. Autoboxing 또는 Unboxing은 가비지 수집기가 더 자주 실행되도록 하는 원치 않는 개체를 생성하므로 애플리케이션 성능을 저하시킵니다.
AutoBoxing의 단점 AutoBoxing에는 여러 가지 장점이 있지만 다음과 같은 단점도 있습니다. 목록 8: 성능 문제를 보여주는 샘플 코드.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
이 코드 섹션 sum +=i 에서는 sum = sum + i. ' ' 연산자부터 시작하면 ' ' 연산자를 Integer 객체에 적용할 수 없기 +때문에 JVM은 unboxing을 시작합니다 . +그런 다음 결과가 다시 자동으로 압축됩니다. JDK 1.5 이전에는 데이터 유형 int과 Integer가 달랐습니다. 메소드 오버로딩의 경우에는 이 두 가지 타입을 문제없이 사용했습니다. 자동 포장/포장해체의 출현으로 이것이 더욱 어려워졌습니다. 이에 대한 예는 remove()의 오버로드된 메서드입니다 ArrayList. 클래스 ArrayList에는 두 가지 삭제 메소드( remove(index)및 ) 가 있습니다 remove(object). 이 경우 메서드 오버로드가 발생하지 않으며 해당 메서드가 적절한 매개변수를 사용하여 호출됩니다.

결론

오토박싱은 기본 데이터 유형을 해당 래퍼 클래스(객체)로 암시적으로 변환하는 메커니즘입니다. 컴파일러는 메소드를 사용하여 valueOf()기본 유형을 객체로 변환하고 메소드 IntValue()doubleValue()을 사용하여 객체의 기본 유형을 얻습니다. Autoboxing은 부울 유형을 boolean부울, byte바이트, char문자, float부동, int정수, longLong, shortShort로 변환합니다. 포장 풀기는 반대 방향으로 발생합니다. 원본 기사
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION