Wrapper 클래스
•
Java에서 객체로 다루지 않는 기본형 변수를 객체로 다뤄야 할 때 사용하는 클래스
◦
매개변수로 객체를 요구할 때
◦
기본형 값이 아닌 객체로 저장해야 할 때
◦
객체 간의 비교가 필요할 때 등
•
래퍼 클래스의 생성자는 매개변수로 문자열이나 각 자료형 값들을 인자로 받음.
◦
이 때 각 자료형에 알맞은 문자열을 사용해야 함!
▪
new Integer("1.0")은 예외 발생
•
boolean → Boolean
◦
Boolean(boolean value)
◦
Boolean(String s)
Boolean b = new Boolean(true);
Boolean b2 = new Boolean("true");
Java
•
char → Character
◦
Character(char value)
Character c = new Character('a');
Java
•
byte → Byte
◦
Byte(byte value)
◦
Byte(String s)
Byte b = new Byte(10);
Byte b2 = new Byte("10");
Java
•
short → Short
◦
Short(short value)
◦
Short(String s)
Short s = new Short(10);
Short s2 = new Short("10");
Java
•
int → Integer
◦
Integer(int value)
◦
Integer(String s)
Integer i = new Integer(100);
Integer i2 = new Integer("100");
Java
•
long → Long
◦
Long(long value)
◦
Long(String s)
Long l = new Long(100);
Long l2 = new Long("100");
Java
•
float → Float
◦
Float(double value)
◦
Float(float value)
◦
Float(String s)
Float f = new Float(1.0);
Float f2 = new Float(1.0f);
Float f3 = new Float("1.0f");
Java
•
double → Double
◦
Double(double value)
◦
Double(String s)
Double d = new Double(1.0);
Double d2 = new Double("1.0");
Java
•
래퍼 클래스는 모두 equal()가 오버라이딩되어 있어 주소값이 아닌 개체가 가진 값을 비교
•
Integer 객체에 비교연산자를 사용할 순 없어서 compareTo() 사용
•
toString()도 오버라이딩되어 있어서 객체가 가진 값을 문자열로 반환
WrapperEx1.java
Number 클래스
•
내부적으로 숫자를 멤버변수로 갖는 래퍼 클래스들의 조상인 추상 클래스
◦
기본형 중 숫자와 관련된 래퍼 클래스들은 모두 Number의 자손
•
BigInteger : long으로 다룰 수 없는 큰 범위의 정수 처리
•
BigDecimal : double로 다룰 수 없는 큰 범위의 부동 소수점수 처리
•
Number 클래스의 실제 소스
◦
객체가 가지고 있는 값을 숫자와 관련된 기본형으로 변환하여 반환하는 메소드들을 정의
public abstract class Number implements java.io.Serializable {
public abstract int intValue();
public abstract long longValue();
public abstract float floatValue();
public abstract double doubleValue();
public byte byteValue() {
return (byte)intValue();
}
public short shortValue() {
return (short)intValue();
}
}
Java
문자열을 숫자로 변환하기
•
문자열을 숫자로 변환하는 다양한 방법
int i = new Integer("100").intValue(); // floatValue(), longValue(), ...
int i2 = Integer.parseInt("100"); // 주로 이 방법을 많이 사용
Integer i3 = Integer.valueOf("100");
Java
•
문자열 → 기본형
byte b = Byte.parseByte("100");
short s = Short.parseShort("100");
int i = Integer.parseInteger("100");
long l = Long.parseLong("100");
float f = Float.parseFloat("3.14");
double d = Double.parseDouble("3.14");
Java
•
문자열 → 래퍼 클래스
Byte b = Byte.valueOf("100");
Short s = Short.valueOf("100");
Int i = Integer.valueOf("100");
Long l = Long.valueOf("100");
Float f = Float.valueOf("3.14");
Double d = Double.valueOf("3.14");
Java
•
JDK 1.5부터 도입된 오토박싱(autoboxing) 기능 떄문에 반환값이 기본형일 때와 래퍼 클래스일 떄의 차이가 사라짐.
◦
valueOf도 성능이 살짝 느리지만 나쁘지 않음.
int i = Integer.parseInteger("100");
long l = Long.parseLong("100");
int i = Integer.valueOf("100");
long l = Long.valueOf("100");
Java
•
문자열이 10진수가 아닌 다른 진법(radix) 숫자일 때도 변환이 가능하도록 다음 메소드를 제공
static int parseInt(String s, int radix) // 문자열 s를 radix진법으로 인식
static Integer valueOf(String s, int radix)
int i4 = Integer.parseInt("100", 2); // 100(2) -> 4
int i5 = Integer.parseInt("100", 8); // 100(8) -> 64
int i6 = Integer.parseInt("100", 16); // 100(16) -> 256
int i7 = Integer.parseInt("FF", 16); // FF(16) -> 255
// int i8 = Integer.parseInt("FF"); // 진법을 생략하면 10진수로 간주. NumberFormatException 발생
Java
WrapperEx2.java
오토박싱 & 언박싱 (autoboxing & unboxin)
•
오토박싱 : 기본형 값을 래퍼 클래스의 객체로 자동 변환 해주는 것
•
언박싱 : 래퍼 클래스의 객체를 기본형 값으로 자동 변환 해주는 것
•
JDK 1.5 전에는 기본형과 참조형 간의 연산이 불가능했기에, 래퍼 클래스로 기본형 객체를 만들어서 연산해야 했지만..
int i = 5;
Integer iObj = new Integer(7);
int sum = i + iObj; // 에러. 기본형과 참조형 간의 덧셈 불가(JDK 1.5 이전)
Java
•
이제는 컴파일러가 자동으로 참조형을 기본형으로 변환해주기 때문에 연산 가능
int sum i + iObj; -> int sum i + iObj.intValue();
Java
•
이 외에도 내부적으로 객체 배열을 가지고있는 Vector 클래스나 ArrayList 클래스에 기본형 값을 저장해야 할 때나 형변환이 필요할 때도 컴파일러가 자동으로 코드 추가
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10); // 오토박싱. 10 -> new Integer(10)
int value = list.get(0) // 언박싱. new Integer(10) -> 10
Java
WrapperEx3.java