[Java] java.lang 패키지와 오토박싱

가을·2022년 11월 9일
0

Java

목록 보기
2/2
post-thumbnail

java.lang 패키지

Java 프로그래밍 언어 설계에 필수적인 클래스를 제공하는 패키지

Wrapper 클래스

기본형 타입에 해당하는 데이터를 객체로 포장해 주는 클래스

1. 데이터 타입

1.1 기본형 타입(Primitive type)

  • 논리형
    • boolean
  • 정수형
    • byte
    • short
    • int
    • long
  • 실수형
    • float
    • double
  • 문자형
    • char

1.2 참조형 타입(Reference type)

  • 기본형 타입을 제외한 모든 타입

2. 박싱과 언박싱

Wrapper 클래스는 산술 연산을 위해 정의된 클래스가 아니므로 인스턴스에 저장된 값 변경이 불가능하며, 값을 참조하기 위해 새로운 인스턴스를 생성하고 생성된 인스턴스의 값만을 참조할 수 있다

  • 박싱(Boxing): 기본형 타입의 데이터를 Wrapper 클래스의 인스턴스로 변환하는 과정
  • 언박싱(UnBoxing): Wrapper 클래스의 인스턴스에 저장된 값을 다시 기본형 타입의 데이터로 꺼내는 과정

2.1 예제

public class example {
    public static void main(String[] args) {
        Integer integer = Integer.valueOf(3);    // 박싱
        int i = integer.intValue();              // 언박싱 
        System.out.println("i = " + i);

        Character ch = 'X';                      // 오토박싱
        char c = ch;                             // 오토언박싱 
        System.out.println("c = " + c);
        
        // 실행결과 
        // 3
        // c
    }
}
  • 오토박싱/오토언박싱을 통해 자동으로 인스턴스 생성 및 값을 참조할 수 있음
public class example {
    public static void main(String[] args) {
        Integer integer1 = Integer.valueOf(3);  // 박싱
        Integer integer2 = Integer.valueOf(4);  // 박싱

        int int1 = integer1.intValue();
        int int2 = integer2.intValue();

        Integer result1 = integer1 + integer2; // 오토언박싱
        Integer result2 = int1 - int2;		   // 오토박싱 
        int result3 = integer1 * int2;		   // 오토언박싱

        System.out.println("result1 = " + result1);
        System.out.println("result2 = " + result2);
        System.out.println("result3 = " + result3);
        
        // 실행결과 
        // result1 = 7
		// result2 = -1
		// result3 = 12
    }
}
  • Wrapper 클래스의 인스턴스끼리 산술연산이 불가능해 내부적으로 Wrapper 클래스인 피연산자를 오토언박싱하여 기본 타입끼리의 연산을 수행
public class example {
    public static void main(String[] args) {
        Integer integer1 = Integer.valueOf(127);  // 박싱
        Integer integer2 = Integer.valueOf(127);  // 박싱

        Integer integer3 = Integer.valueOf(128);  // 박싱
        Integer integer4 = Integer.valueOf(128);  // 박싱

        Integer integer5 = new Integer(128);
        Integer integer6 = new Integer(128);

        System.out.println("(integer1 == integer2) = " + (integer1 == integer2));
        System.out.println("(integer3 == integer4) = " + (integer3 == integer4));
        System.out.println("(integer5 == integer6) = " + (integer5 == integer6));
        
        // 실행결과
        // (integer1 == integer2) = true
   		// (integer3 == integer4) = false
		// (integer5 == integer6) = false
    }
}

Integer 클래스의 valueOf 메소드

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

참고: Integer.valueOf()
위의 코드와 같이 IntegerCache.low(-128) 이상이면서 IntegerCache.high(127) 이하인 int 리터럴 i를 매개변수로 넘기게 된다면 Integer.valueOf() 메소드는 IntegerCache로부터 Integer 객체들을 리턴한다. 즉, 새로운 Integer 객체를 생성하는 것이 아닌 배우의 IetegerCache 객체에서 Integer 객체를 반환한다. 캐시의 최대값은 Integer인 경우에만 JVM 옵션을 통해 조정 가능하다.

Java Document

참고: Integer()
생성자를 통해 인스턴스를 생성하는 것보다 Integer.valueOf()를 통해 생성하는 것이 앞서 말한 IetegerCache 통해 더 나은 공간 및 시간 성능을 산출할 가능성이 높아 더 이상 사용되지 않는다.

결론

  • java.lang 패키지는 Java 프로그래밍 언어 설계에 필수적인 클래스를 제공한다
  • 대표적인 클래스로 Object, Wrapper, String, StringBuffer, StringBuilder, System, Math 클래스가 존재한다
  • Wrapper 클래스는 기본형 타입에 해당하는 데이터를 객체로 포장해준다
  • 기본형 타입의 데이터 -> Wrapper 클래스의 인스턴스 : 박싱(Boxing)
  • Wrapper 클래스의 인스턴스 -> 기본형 타입의 데이터 : 언박싱(UnBoxing)
  • JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리 -> 오토박싱/오토언박싱
  • Integer 인스턴스는 성능상의 문제로 생성자를 통한 생성은 더 이상 사용되지 않기 때문에 Integer.valueOf()를 통해 생성해야 한다
  • Integer.valueOf(int i) int 리터럴 i가 -128 <= i <= 127인 경우, 미리 생성되어 있던 IntegerCache 객체에서 Integer 객체를 반환하여 위의 조건을 만족하는 i를 매개변수로 한 두 인스턴스의 메모리 주소값은 같다

출처
https://meetup.toast.com/posts/185
http://www.tcpschool.com/java/java_api_wrapper
https://docs.oracle.com/javase/9/docs/api/java/lang/Integer.html

profile
코린이

0개의 댓글