ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Wrapper Class, 래퍼클래스란? ( 박싱과 언박싱)
    프로그래밍 언어/JAVA 2023. 6. 13. 09:42

     

    Int와 Integer에 차이에 대해서 궁금점은 한번씩은 다 가져봤으리라 생각한다. 그 차이를 알아보기 위해 Wrapper 클래스에대해 정리해보자.

     


    📑 Wapper 클래스란? 

     

    프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있다. 예를 들어, 메소드의 인수로 객체 타입만이 요구되면, 기본 데이터를 그대로 사용할 순 없다. 이때 기본 타입의 데이터를 먼저 객체로 변환 후 작업을 수행해야한다. 

     

    이렇게 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 한다. 래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어준다. 이러한 래퍼 클래스는 모두 java.lang 패키지에 포함되어 제공된다. 

     

    자바의 기본 타입에 대응하여 제공하고 있는 래퍼 클래스는 다음과 같다. 

     


     

    📑 박싱(Boxing)과 언박싱(UnBoxing)

     

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

     

     

     

    기본 타입의 데이터를 래퍼 클래스의 인스턴스로 변환하는 과정을 박싱이라고 한다. 반면 래퍼클래스의 인스턴스에 저장된 값을 다시 기본 타입의 데이터로 꺼내는 과정을 언박싱이라고 한다. 

     


     

    📑 오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)

     

    JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리해준다. 이렇게 자동화된 박시과 언박싱을 오토 박싱과 오토 언박싱이라고 부른다. 

     

    package step4;
    
    public class wrapperEx {
        public static void main(String[] args) {
    
            Integer num = new Integer(17); // 박싱
            int n = num.intValue(); // 언박싱
            System.out.println(n); //17
    
            Character ch = 'X'; // Character ch = new Character('X'); 오토박싱
            char c = ch; // char c = ch.charValue(); 오토 언박싱
            System.out.println(c); //c
    
        }
    }

     

     

    위의 예제에서 볼 수 있듯이 래퍼 클래스인 Integer 클래스와 Charater 클래스에는 각각 언박싱을 위한 intValue()와 charValue() 메서드가 포함되어 있다. 또한 오토 박싱을 이용하면 new 키워드를 사용하지 않고도 자동으로 Character 인스턴스를 생성할 수 있다. 

     

     

     

    package step4;
    
    public class wrapperEx2 {
        public static void main(String[] args) {
            Integer num1 = new Integer(7); //박싱
    /*        Integer num1 = 7오토박싱*/
            Integer num2 = new Integer(3);
    
            int int1 = num1.intValue();//언박싱
            int int2 = num2.intValue(); //언박싱
    
            Integer result1 = num1 + num2; //10
            Integer result2 = int1 - int2; //4
            int result3= num1 * int2; //21
            System.out.println(result1);
            System.out.println(result2);
            System.out.println(result3);
    
        }
    }

     

    위의 코드를 보면 result 연산들은 내부적으로 래퍼 클래스인 피연산자를 오토 언박싱하여 기본 타입끼리 연산을 수행하고 있는 것이다. (원래 객체는 연산 불가능) 

     

     

     

    package step4;
    
    public class wrapperEx3 {
        public static void main(String[] args) {
    
            Integer num1 = new Integer(10);
            Integer num2 = new Integer(20);
            Integer num3 = new Integer(10);
    
            System.out.println(num1 < num2); //true
            System.out.println(num1 == num3); //false
            System.out.println(num1.equals(num3)); //true
    
            
        }
    }

     

    래퍼 클래스의 비교 연산도 오토 언박싱을 통해 가능하지만, 인스턴스에 저장된 값의 동등 여부 판단은 num1==num3 처럼 비교 연산자인 동등 연산자(==)를 사용하면 안 되며, equals() 메서드를 사용해야만 한다. (객체 비교기 때문에!!) 

     

    래퍼 클래스도 객체이므로 동등 연산자(==)를 사용하게 되면, 두 인스턴스의 값을 비교하는 것이 아니라 두 인스턴스의 주소값을 비교하게 된다. 

     


     

     

    📑 int와 Integer 비교하기 

     

     

    📌 Int 

     

    - primitive 자료형(long, float, double)이다.

    - 산술 연산이 가능하다.

    - null로 초기화할 수 없다. 

     

    📌 Integer

     

    - Wrapper 클래스(한 객체를 의미)이다.

    - Unboxing을 하지 않으면 산술 연산이 불가능하지만, null 처리를 할 수 있다.

    - null 값 처리가 용이하기 때문에 sql과 연동할 경우 처리를 원할하게 할 수 있다. 

    - DB 자료형이 정수형이지만 null값이 필요한 경우 VO에서 Integer를 사용할 수 있다. 

     

     

     

     


     

     

    [참고]

    http://www.tcpschool.com/java/java_api_wrapper

    반응형

    댓글

Designed by Tistory.