🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

Java/기초

[Java 기초] Wrapper(래퍼) 클래스

JONG_UK 2023. 5. 19. 23:21
728x90
반응형
SMALL

Wrapper(래퍼) 클래스

객체지향 개념에서 모든 것은 객체로 다루어져야 한다. 하지만 자바에서는 8개의 기본형을 객체로 다루지 않는다. 때로는 기본형(Primitive type) 변수도 어쩔 수 없이 객체로 다뤄야 하는 경우가 있다. 

예를 들어 매개변수로 객체를 요구하거나, 기본형 값이 아닌 객체로 저장해야 하는 경우, 객체간의 비교가 필요할 때 등등의 경우에서 사용한다.

따라서 위와 같은 몇가지 상황에서 기본형 값들을 객체로 변환하여 작업을 수행할 때가 있다.

 

Java에는 8개의 기본형을 대표하는 Wrapper(래퍼)클래스가 존재한다. 

래퍼 클래스는 내부적으로 기본형(Primitive type) 변수를 가지고 있다.

이 클래스들을 이용하면 기본형 값을 객체로 다룰 수 있다.

 

class WrapperEx1 {
	public static void main(String[] args) {
		Integer i  = new Integer(100);
		Integer i2 = new Integer(100);

		System.out.println("i==i2 ? "+(i==i2));
		System.out.println("i.equals(i2) ? "+i.equals(i2));
		System.out.println("i.compareTo(i2)="+i.compareTo(i2));
		System.out.println("i.toString()="+i.toString());

		System.out.println("MAX_VALUE="+Integer.MAX_VALUE);
		System.out.println("MIN_VALUE="+Integer.MIN_VALUE);
		System.out.println("SIZE=" +Integer.SIZE+" bits");
		System.out.println("BYTES="+Integer.BYTES+" bytes");
		System.out.println("TYPE=" +Integer.TYPE);
	}
}

래퍼 클래스는 모두 equals() 메소드가 오버라이딩 되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교할 수 있다.

또한 객체의 비교에는 비교연산자를 사용할 수 없다. '=='을 사용하는 경우, 값은 동일하지만 둘은 다르다고 나온다. 

그 이유는 객체간의 비교는 주소값을 비교하기 때문에 다르게 나오는 것이다. 즉 값을 비교하는 것이 아닌 객체의 주소를 비교하는 것이다.

== 연산자의 경우 객체의 주솟값을 비교하는 역할을 하기에, 비교하려는 객체가 동일한 객체인지를 판별한다.

따라서 객체의 값을 비교하고 싶다면, equals() 메소드를 사용해야 한다.

 

Number 클래스

- 숫자를 멤버변수로 갖는 클래스들의 조상(추상클래스)

Number 클래스는 모든 숫자 관련 클래스들의 조상이다. 위처럼 정의되어 있다.

 

 

문자열을 기본형 또는 래퍼 클래스로 변환하는 방법

public class WrapperEx2 {
    public static void main(String[] args) {
        int i = new Integer("100").intValue();
        int i2 = Integer.parseInt("100"); // 주로 이 방법을 많이 사용함
        Integer i3 = Integer.valueOf("100");

        System.out.println(i);
        System.out.println(i2);
        System.out.println(i3);

        // 00진수 값을 Int로 변환
        int i4 = Integer.parseInt("100", 2);
        int i5 = Integer.parseInt("100", 8);
        int i6 = Integer.parseInt("100", 16);
        int i7 = Integer.parseInt("FF", 16);

        System.out.println("100(2) -> " + i4);
        System.out.println("100(8) -> " + i5);
        System.out.println("100(16)-> " + i6);
        System.out.println("FF(16) -> " + i7);

        // valueOf 메서드를 통한 Wrapper 클래스로 변환
        Integer i9 = Integer.valueOf("100", 2);
        Integer i10 = Integer.valueOf("100", 8);
        Integer i11 = Integer.valueOf("100", 16);
        Integer i12 = Integer.valueOf("FF", 16);

        System.out.println("100(2) -> " + i9);
        System.out.println("100(8) -> " + i10);
        System.out.println("100(16)-> " + i11);
        System.out.println("FF(16) -> " + i12);
    }
}

 

valueOf() 메서드를 사용하는 것도 괜찮은 방법이지만, 성능이 조금 더 느리다.

웬만하면 Integer.parseInt() 메서드를 사용하자!

 

 

오토 박싱 & 언박싱 (Autoboxing & Unboxing)

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

하지만 이제는 기본형과 참조형 간의 덧셈이 가능하다. 자바 컴파일러가 자동으로 형변환을 해주는 코드를 넣어주기 때문이다.

 

기본형 값을 래퍼 클래스의 객처로 자동 변환해 주는 것을 '오토박싱(autoboxing)'이라고 하고,

반대로 변환하는 것을 '언박싱(unboxing)'이라고 한다.

출처 : https://velog.io/@hyojhand/JAVA-%EB%9E%98%ED%8D%BC%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%95%EC%8B%B1boxing-%EC%96%B8%EB%B0%95%EC%8B%B1unboxing

 

public class WrapperEx3 {
    public static void main(String[] args) {
        int i = 10;

        // 기본형을 참조형으로 형변환(형변환 생략가능)
        Integer intg = (Integer)i; // Integer intg = Integer.valueOf(i);
        Object   obj = (Object)i;  // Object obj = (Object)Integer.valueOf(i);

        Long     lng = 100L;  // Long lng = new Long(100L);

        int i2 = intg + 10;   // 참조형과 기본형간의 연산 가능
        long l = intg + lng;  // 참조형 간의 덧셈도 가능

        Integer intg2 = new Integer(20);
        int i3 = (int)intg2;  // 참조형을 기본형으로 형변환도 가능(형변환 생략가능)

        Integer intg3 = intg2 + i3;

        System.out.println("i     ="+i);
        System.out.println("intg  ="+intg);
        System.out.println("obj   ="+obj);
        System.out.println("lng   ="+lng);
        System.out.println("intg + 10  ="+i2);
        System.out.println("intg + lng ="+l);
        System.out.println("intg2 ="+intg2);
        System.out.println("i3    ="+i3);
        System.out.println("intg2 + i3 ="+intg3);
    }
}

 

728x90
반응형
LIST