객체 지향에서 모든 것은 객체로 다루어져야 하지만 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는 도구일 뿐 우리는 작동 원리를 이해해야 하니 꼭 알아두자.
'Language & Framework > Java' 카테고리의 다른 글
자바 예외 (1) java.io.NotSerializableException (0) | 2022.06.21 |
---|---|
자바 ArrayList와 LinkedList는 무엇인가? 성능 비교 (+ Vector..?) (0) | 2022.06.12 |
자바 Math 클래스의 기본 활용 (0) | 2022.06.09 |
자바 String에 대한 이해와 기본 메서드 총 정리 (0) | 2022.06.09 |
자바 Object 클래스의 기본 메서드(3) clone() 얇은 복사와 깊은 복사 (0) | 2022.06.08 |