본문 바로가기

Language & Framework/Java

자바 Wrapper 클래스의 기본 활용

 

객체 지향에서 모든 것은 객체로 다루어져야 하지만 JAVA에서 기본형 타입은 객체로 다루어지지 않는다.

그러나 종종 기본형 타입도 객체로 다루어야할 때가 있고 이런 상황에서 Wrapper 클래스를 활용하게 된다.

 

 

Boolean bool = new Boolean(false);
Character c = new Character('s');
Byte b = new Byte((byte) 1);
Short s = new Short((short) 1111);
Integer integer = new Integer(100);
Long longLong = new Long(100000000000000L);
Float f = new Float(123.123f);
Double d = new Double(123.1112334455);

System.out.println("bool == new Boolean(false) ? " + (bool == new Boolean(false)));
System.out.println("bool.equals(new Boolean(false)) ? " + (bool.equals(new Boolean(false))));
// Integer는 비교 연산자를 사용할 수 없기 때문에 compareTo로 비교해야 한다.
System.out.println("f.compareTo(823.123f) ? " + f.compareTo(823.123f));
System.out.println("bool.compareTo(new Boolean(true) ? " + bool.compareTo(new Boolean(true)));
System.out.println("longLong.toString() ? " + longLong.toString());
System.out.println("Integer.MAX_VALUE = " + Integer.MAX_VALUE);
System.out.println("Double.Min_VALUE = " + Double.MIN_VALUE);

//bool == new Boolean(false) ? false
//bool.equals(new Boolean(false)) ? true
//f.compareTo(823.123f) ? -1
//bool.compareTo(new Boolean(true) ? -1
//longLong.toString() ? 100000000000000
//Integer.MAX_VALUE = 2147483647
//Double.Min_VALUE = 4.9E-324

래퍼 클래스는 기본적으로 equals가 오버라이드 되어 있기 때문에 객체의 값으로 비교해서 결과를 반환한다.

또한 new String("하위~") == new String("하위~")가 다르듯 당연히 다른 객체간의 비교는 동등연산자로 무조건 false다.

별다른 특이사항은 없고 래퍼 클래스는 비교 연산자 사용이 불가능하기 때문에 compareTo()메서드를 사용해야 한다는 점만 알고 지나가면 될 것 같다.

 

byte num1 = Byte.parseByte("2");
int num2 = Integer.parseInt("3000");
int num3 = Integer.parseInt("FF",16);

문자열을 다시 int byte double long으로 반환 시 위와 같은 방법으로 변환해주면 된다.

두번째 매개변수로 n진법을 지정해주면 10진수로 반환해준다.

다만 두번째 매개변수를 지정하지 않고 "FF"만 넣어준다면 NumberFormatException이 발생한다.

 

 

int i = new Integer("100").intValue();
int i2 = Integer.parseInt("100");
Integer i3 = Integer.valueOf("100");
System.out.println(i2 + 2); // i2.intValue() + 2와 같다.

아까 래퍼 클래스는 비교 연산자 사용이 불가능하다고 했는데 기본형과의 연산은 가능하다.

띠용?

이것은 자바의 AutoBoxing(오토 박싱)기능 때문이다.

우리는 그냥 new Integer("100") + 3을 했어도 컴파일러가 알아서 new Integer("100").intValue() + 3으로 intValue() 메서드를 붙여 정수형간의 덧셈으로 변형해준다. 단순 덧셈 말고도 다음과 같은 사례들이 있다.

 

 

int intint = 0;
Integer inte = (Integer)intint; // 이렇게 쓰면
Integer inte2 = Integer.valueOf(i); // 컴파일러가 이렇게 만들어준다.

Object obj = (Object)inte; // 이렇게 대충 형변환해도
Object obj2 = (Object)Integer.valueOf(i); // 컴파일러가 알아서 해준다.

Long lng = 100L; // 사실 new Long new Intger도 안해줘도 된다.
Long lng2 = new Long(100);

 

사실 이클립스는 모르겠지만 인텔리제이 사용 시 Integer.valueOf(i)이런 식으로 쓰면 쓸데 없이 길게 썼으니까 바꾸라고 알려준다.

그래도 IDE는 도구일 뿐 우리는 작동 원리를 이해해야 하니 꼭 알아두자.