JavaRush /Java Blog /Random-KO /포장, 풀기 및 포장

포장, 풀기 및 포장

Random-KO 그룹에 게시되었습니다
안녕하세요! 당신은 이미 기본 유형에 대해 꽤 잘 알고 있으며, 이러한 유형에 대해 많은 작업을 해왔습니다. 포장, 풀기 및 포장 - 1프로그래밍, 특히 Java의 기본 요소에는 많은 장점이 있습니다. 즉, 메모리를 거의 차지하지 않아 프로그램 효율성이 높아지고 값 범위가 명확하게 구분됩니다. 그러나 Java를 배우는 과정에서 우리는 “ Java에서는 모든 것이 객체이다 ”라는 진언처럼 여러 번 반복했습니다. 그러나 원시인들은 이러한 말을 직접적으로 반박합니다. 그것들은 객체가 아닙니다. 그렇다면 '모든 것은 객체이다'라는 원칙은 거짓인가요? 설마. Java에서 모든 기본 유형에는 쌍둥이 형제인 래퍼 클래스 ( Wrapper)가 있습니다. 래퍼란 무엇입니까? 래퍼는 기본 요소의 값을 자체적으로 저장하는 특수 클래스입니다. 그러나 이것은 클래스이기 때문에 자체 인스턴스를 생성할 수 있습니다. 실제 객체이면서 필요한 기본 값을 내부에 저장합니다. 래퍼 클래스의 이름은 해당 기본 요소의 이름과 매우 유사하거나 완전히 일치합니다. 따라서 기억하기가 매우 쉬울 것입니다.
기본 데이터 유형에 대한 래퍼 클래스
기본 데이터 유형 래퍼 클래스
정수 정수
짧은 짧은
바이트 바이트
뜨다 뜨다
더블 더블
성격
부울 부울
래퍼 클래스 객체는 다른 객체와 마찬가지로 생성됩니다.
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
래퍼 클래스를 사용하면 기본 유형의 단점을 완화할 수 있습니다. 가장 분명한 것은 기본 요소에는 메소드가 없다는 것입니다 . 예를 들어 메서드가 없으므로 숫자를 문자열로 toString()변환하는 등의 작업을 수행할 수 없습니다 . int하지만 래퍼 클래스를 사용하면 Integer쉽습니다.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
역변환에도 어려움이 있을 것이다. 숫자가 포함된 것으로 확실히 알려진 문자열이 있다고 가정해 보겠습니다. 그러나 기본 유형의 경우 int문자열에서 이 숫자를 가져와 실제로 숫자로 변환할 수 없습니다. 하지만 래퍼 클래스 덕분에 이제 이런 기회가 생겼습니다.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
출력: 1166628 문자열에서 숫자를 성공적으로 검색하여 참조 변수에 할당했습니다 Integer i. 그건 그렇고, 링크에 대해. 매개변수가 다양한 방식으로 메소드에 전달된다는 사실을 이미 알고 있습니다. 기본 요소는 값으로 전달되고 객체는 참조로 전달됩니다. 메소드를 생성할 때 이 지식을 사용할 수 있습니다. 예를 들어 분수를 사용하여 메소드가 작동하지만 참조로 전달하는 논리가 필요한 경우 . Double/Float대신 매개변수를 메소드에 전달할 수 있습니다 double/float. 또한 래퍼 클래스에는 메서드 외에도 사용하기 매우 편리한 정적 필드가 있습니다. 예를 들어, 가능한 최대 숫자를 콘솔에 인쇄한 int다음 가능한 최소 숫자를 인쇄 하는 작업에 직면했다고 상상해 보세요 . 이 작업은 초보적인 것 같지만 여전히 Google 없이는 거의 할 수 없습니다. 그리고 래퍼 클래스를 사용하면 다음과 같은 "일상적인 문제"를 쉽게 해결할 수 있습니다.
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
이러한 분야를 사용하면 더 심각한 작업에서 주의가 산만해지지 않습니다. 숫자 2147483647 (정확히 MAX_VALUE) 을 인쇄하는 과정에서 잘못 입력하는 것은 놀라운 일이 아닙니다. 또한 이전 강의 중 하나에서 우리는 이미 래퍼 클래스의 객체가 불변입니다 .
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
출력: 0 참조가 원래 가리키는 개체의 а상태가 변경되지 않았습니다. 그렇지 않으면 값 b도 변경되었을 것입니다. 와 마찬가지로 String래퍼 객체의 상태를 변경하는 대신 완전히 새로운 객체가 메모리에 생성됩니다. Java 제작자가 궁극적으로 언어에서 기본 유형을 유지하기로 결정한 이유는 무엇입니까? 모든 것이 객체여야 하고 프리미티브가 표현하는 모든 것을 표현하는 데 사용할 수 있는 래퍼 클래스가 이미 있으므로 이를 언어에 그대로 두고 프리미티브를 제거하는 것이 어떨까요? 대답은 간단합니다. 성능입니다. 원시 유형에는 객체의 "무거운" 기능이 많이 없기 때문에 원시 유형이라고 합니다. 예, 객체에는 편리한 메소드가 많이 있지만 항상 필요한 것은 아닙니다. true때로는 숫자 33, 2.62 또는 / 값만 필요할 수도 있습니다 false. 객체의 모든 이점이 중요하지 않고 프로그램 작동에 필요하지 않은 상황에서는 기본 요소가 훨씬 더 나은 작업을 수행합니다.

자동 포장/자동 포장 풀기

Java의 프리미티브 및 해당 래퍼 클래스의 기능 중 하나는 autoboxing/autounboxing입니다. 포장, 풀기 및 포장 - 2 이 개념을 이해해 봅시다. 여러분과 제가 이미 앞서 배웠듯이 Java는 객체 지향 언어입니다. 이는 Java로 작성된 모든 프로그램이 객체로 구성된다는 의미입니다. 프리미티브는 객체가 아닙니다. 그러나 래퍼 클래스 변수에는 기본 유형의 값이 할당될 수 있습니다. 이 프로세스를 오토박싱 이라고 합니다 . 같은 방식으로 기본 유형의 변수에 래퍼 클래스의 객체를 할당할 수 있습니다. 이 프로세스를 자동 언박싱(autounboxing)이라고 합니다 . 예를 들어:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
5번째 줄에서는 래퍼 클래스의 객체인 y의 값을 원시 x에 할당합니다 Integer. 보시다시피, 이를 위해 추가 작업이 필요하지 않습니다. 컴파일러는 intInteger, 실제로 동일한 것을 알고 있습니다 . 자동 언패킹입니다. 6행의 오토박싱에서도 동일한 일이 발생합니다. 객체 y에는 기본 값(x*123)이 쉽게 할당됩니다. 이것은 자동 포장의 예입니다. 이것이 "auto"라는 단어가 추가된 이유입니다. 래퍼 클래스의 객체에 기본 참조를 할당하기 위해(또는 그 반대로) 아무것도 할 필요가 없으며 모든 것이 자동으로 발생합니다 . 편리하지 않나요? :) 자동 패킹/자동 패킹 해제의 또 다른 매우 큰 편리성은 메소드의 작동에서 나타납니다. 사실 메소드 매개변수도 autopacking 및 autounpacking의 대상입니다 . 예를 들어, 그 중 하나가 두 개의 개체를 입력으로 사용하는 경우 Integer일반 기본 요소를 쉽게 전달할 수 있습니다 int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
출력: 숫자 7을 입력했습니다. 반대의 경우도 마찬가지입니다.
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
기억해야 할 중요한 점: autoboxing 및 unboxing은 배열에서는 작동하지 않습니다 !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
객체 배열을 입력으로 사용하는 메서드에 기본 형식 배열을 전달하려고 하면 컴파일 오류가 발생합니다. 마지막으로 다시 한 번 기본 요소와 래퍼를 간략하게 비교해 보겠습니다 .
  • 성능상의 이점이 있습니다
래퍼:
  • "모든 것이 객체이다"라는 원칙을 위반하지 않도록 하여 숫자, 기호 및 부울 값 true/false가 이 개념에서 벗어나지 않도록 합니다.
  • 편리한 방법과 필드를 제공하여 이러한 값으로 작업할 수 있는 기능 확장
  • 일부 메소드가 객체에서만 작동할 수 있는 경우 필요합니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION