ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 래퍼 클래스(Wrapper Class)
    Java 2024. 2. 26. 00:10
    728x90
    반응형

    래퍼(wrapper) 클래스


        객체지향 개념에서 모든 것은 객체로 다루어져야 한다.
        
        하지만 자바는 8개의 기본형을 객체로 다루지 않는데, 
        이것이 자바가 완전한 객체지향 언어가 아니라는 얘기를 듣는 이유다.
        
        그 대신 보다 높은 성능을 얻을 수 있었다.

        때로는 기본형 변수(primitive type)도 어쩔 수 없이 객체로 다뤄야 하는 경우가 있다.

        예를 들면, 매개변수로 객체를 요구할 때, 기본형 값이 아닌 객체로 저장해야할 때 등의 경우는,
        기본형 값을 객체로 변환하여 작업을 수행해야 한다.

        이 때 사용되는 것이 래퍼클래스이다.
        
        8개의 기본형을 대표하는 8개의 래퍼클래스가 있는데,
        이 클래스들을 이용하면 기본형 값을 객체로 다룰 수 있다.

        래퍼클래스의 생성자는 매개변수로 문자열이나 각 자료형의 값들을 인자로 받는다.

        이 때 주의해야 할 것은 생성자의 매개변수로 문자열을 제공할 때,
        각 자료형에 알맞은 문자열을 사용해야 한다는 것

        예를 들어 new Integer("1.0");는 NumberFormatException이 발생

        래퍼클래스들은 모두 equals가 오버라이딩되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다.
        오토박싱이 된다 해도 Integer 객체에 비교연산자를 사용할 수 없다. 대신 compareTo() 제공

        그리고 toString도 오버라이딩되어 있어서 객체가 가지고 있는 값을 문자열로 변환하여 반환한다

        이 외에도 래퍼 클래스들은 MAX_VALUE, MIN_VALUE, SIZE, BYTES, TYPE 등의 static 상수를 공통으로 가지고 있다.

        참고            BYTES는 jdk1.8부터 추가


    Number 클래스

            추상클래스로, 내부적으로 숫자를 멤버변수로 갖는 래퍼 클래스들의 조상이다.
            기본형 중에서 숫자와 관련된 래퍼 클래스들은 모두 Number 클래스의 자손이다.

            객체가 가지고 있는 값을 숫자와 관련된 기본형으로 변환하여 반환하는 메서드들을 정의하고 있다.

        
        

    문자열을 숫자로 변환

    아래 방법 중 하나 선택

    int     i = new Integer("100").intValue();      // floatValue(), longValue(), ...
    int     i2 = Integer.parseInt("100");           // 주로 이 방법을 사용
    Integer i3 = Integer.valueOf("100");


    래퍼클래스의 '타입.parse타입(String s)'형식의 메서드는 반환값이 기본형,
    '타입.valueOf()'메서드는 반환값이 래퍼클래스다.

    int i = Integer.parseInt("100");
    
    Integer i = Integer.valueOf("100");
    


    jdk1.5부터 도입된 오토박싱 기능 때문에 반환값이 기본형일 때와 래퍼클래스일 때의 차이가 없어졌다.
    그래서 그냥 구별없이 valueOf를 써도 되지만 성능은 valueOf가 조금 더 느리다.
        

    오토박싱 & 언박싱

    jdk1.5 이전에는 기본형과 참조형 간의 연산이 불가능했기 때문에, 래퍼 클래스로 기본형을 객체로 만들어서 연산해야 했다.

    자바 언어의 규칙이 바뀐 것은 아니고, 컴파일러가 자동으로 변환하는 코드를 넣어주기 때문이다.

    아래의 경우, 컴파일러가 Integer객체를 int타입의 값으로 변환해주는 intValue()를 추가해준다.

    컴파일 전 코드
    int i = 5;
    Integer iObj = new Integer(7);
    int sum = i + iObj;
    >>
    컴파일 후 코드
    int i = 5;
    Integer iObj = new Integer(7);
    int sum = i + iObj.intValue();


    이 외에도 내부적으로 객체 배열을 가지고 있는 Vector클래스나 ArrayList클래스에 기본형 값을 저장해야할 때나 형변환이 필요할 때, 컴파일러가 자동적으로 코드를 추가해준다.

    기본형 값을 래퍼클래스의 객체로 자동 변환해주는 것을 오토박싱이라 하고,
    반대로 변환하는 것을 언박싱이라고 한다.

    ArrayList<Integer> list = new ArrayList<Integer>();
    
    list.add(10);                   // 오토박싱. 10 > new Integer(10)
    int value = list.get(0);        // 언박싱. new Integer(10) > 10
    728x90
    반응형
Designed by Tistory.