[Java] Class Wrapper
Javajava.lang 패키지
자바프로그래밍에 가장 기본이 되는 클래스들을 포함하고 있다.
Class Wrapper
java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Short
8개의 기본형을 대표하는 8개의 래퍼 클래스.
기본형 값을 객체로 다룰 수 있다.
생성자의 매개변수로 문자열을 제공할 때, 각 자료형에 알맞은 문자열을 사용해야 한다.
Boolean
- Boolean(boolean value)
- Boolean(String s)
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("true");
Character
- Character(char value)
Character c = new Character('a');
Byte
- Byte(byte value)
- Byte(String s)
Byte b1 = new Byte(2);
Byte b2 = new Byte("2");
Short
- Short(short value)
- Short(String s)
Short s1 = new Short(2);
Short s2 = new Short("2");
Integer
- Integer(int value)
- Integer(String s)
Integer i1 = new Integer(1000);
Integer i2 = new Integer("1000);
Long
- Long(long value)
- Long(String s)
Long l1 = new Long(1000);
Long l2 = new Long("1000");
Float
- Float(double value)
- Float(float value)
- Float(String s)
Float f1 = new Float(1.0);
Float f1 = new Float(1.0f);
Float f1 = new Float("1.0f");
Double
- Double(double value)
- Double(String s)
Double d1 = new Double(1.0);
Double d2 = new Double("1.0");
boolean equals(Object anObject)
오버라이딩 되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다.
Integer i1 = new Integer(2);
Integer i2 = new Integer(2);
System.out.println((i1 == i2)); // false
System.out.println(i1.equals(i2)); // true
int compareTo(Integer anotherInteger)
Integer 객체에 비교 연산자를 사용할 수 없어서 제공된 메서드.
Integer i1 = new Integer(2);
Integer i2 = new Integer(2);
Integer i3 = new Integer(5);
Integer i4 = new Integer(-5);
System.out.println(i1.compareTo(i2)); // 0
System.out.println(i1.compareTo(i3)); // -1
System.out.println(i1.compareTo(i4)); // 1
String toString()
객체가 가지고 있는 값을 문자열로 변환하여 반환한다.
Integer i = new Integer(2);
System.out.println(i.toString()); // 2
java.lang.Number
내부적으로 숫자를 멤버변수로 갖는 래퍼 클래스들(Byte, Double, Float, Int, Long, Short)의 조상.
추상 클래스.
객체가 가지고 있는 값을 숫자와 관련된 기본형으로 변환하여 반환하는 메서드들을 정의하고 있다.
public abstract class Number extends Object implements Serializable {
abstract double doubleValue();
abstract float floatValue();
abstract int intValue();
abstract long longValue();
byte byteValue() {
return (byte) intValue();
}
short shortValue() {
return (short) intValue();
}
...
}
문자열을 숫자로 변환
기본형을 반환하는 '타입.parse타입(String s)'과 래퍼 클래스 타입을 반환하는 '타입.valueOf()'
JDK1.5부터 도입된 오토박싱 덕분에 두 메서드의 차이가 없어졌다.
단, 성능은 valueOf()가 조금 더 느리다.
byte b = Byte.parseByte("2");
Byte B = Byte.valueOf("2"); // → byte B = Byte.valueOf("2");
short s = Short.parseShort("2");
Short S = Short.valueOf("2"); // → short S = Short.valueOf("2");
int i = Integer.parseInt("2");
Integer I = Integer.valueOf("2"); // → int I = Integer.valuseOf("2");
long l = Long.parseLong("2");
Long L = Long.valueOf("2"); // → long L = Long.valueOf("2");
float f = Float.parseFloat("2.0");
Float F = Float.valueOf("2.0"); // → float F = Float.valueOf("2.0");
double d = Double.parseDouble("2.0");
Double D = Double.valueOf("2.0"); // → double D = Double.valueOf("2.0");
문자열이 10진수가 아닌 다른 진법의 숫자일 때도 변환이 가능하다.
static int parseInt(String s, int radix);
static Integer valueOf(String s,int radix);
int i1 = Integer.parseInt("100", 2); // 4
int i2 = Integer.parseInt("100", 8); // 64
int i3 = Integer.parseInt("100", 16); // 256
int i4 = Integer.parseInt("aa", 16); // 170
int i5 = Integer.parseInt("aa"); // error: NumberFormatException
오토박싱 Autoboxing & 언박싱 Unboxing
기본형과 참조형 간의 연산이 가능하도록 컴파일러가 자동으로 변환하는 코드를 넣어준다.
개발자가 간략하게 쓴 구문을 컴파일러가 원래의 구문으로 변경해주는 것뿐 자바의 원칙이 바뀐 것은 아니다.
- 오토박싱 : 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것.
int i = 2;
Integer intg = (Integer) i; // = Integer.valueOf(i);
Object obj = (Object) i; // = (Object) Integer.valueOf(i);
Long l = 100L; // = new Long(100L);
- 언박싱 : 래퍼 클래스의 객체를 기본형 값으로 자동 변환해주는 것.
ArrayList list = new ArrayList<>();
list.add(10); // Autoboxing. 10 → new Integer(10)
int value = list.get(0); // Unboxing. new Integer(10) → 10
참고 서적: 자바의 정석 3판