Wrapper 클래스
- java.lang.Wrapper
- 기본 자료형의 값을 인스턴스로 감싸는 목적의 클래스를 래퍼 클래스(Wrapper Class)라 한다.
- 인스턴스(객체)의 참조 값을 요구하는 자리에 기본 자료형의 값을 놓아야 하는 경우 래퍼클래스를 사용할 수 있다.
class WrapperClassExam {
public static void showData(Object obj) {
System.out.println(obj);
}
public static void main(String[] args) {
showData(new Integer(3)); // 정수 3을 감싸는 래퍼 인스턴스 생성 및 전달
showData(new Double(7.15)); // 7.15를 감싸는 래퍼 인스턴스 생성 및 전달
}
}
// 실행 결과
3
7.15
래퍼 클래스 종류
모든 기본 자료형을 대상으로 래퍼 클래스가 다음과 같이 정의되어 있다.
종류 생성자
Boolean public Boolean(boolean value)
Character public Charater(char value)
Byte public Byte(byte value)
Short public Short(short value)
Integar public Integar(int value)
Long public Long(long value)
Float public Float(float value), public Float(double value)
Double public Double(double value)
래퍼 클래스의 static 메소드
valueOf()
- 인스턴스를 생성해주는 static 메소드
- 클래스를 대상으로 valueOf 메소드를 호출하면 전달된 인자값을 해당 클래스의 인스턴스로 감싸서 그 참조값을 반환해준다.
- Integer.valuOf(5); == new Integer(5);
max(), min(), sum()
- 대소 비교와 합을 계산하는 static 메소드
toBinaryString(), toOctalString(), toHexString()
- 정수에 대한 2,8,16진수 표현 결과를 반환하는 static 메소드
- toBinaryString : 2진법
- toOctalString : 8진법
- toHexString : 16진법
class WrapperClassStaticMethod {
public static void main(String[] args) {
// 1) 인스턴스를 생성해주는 클래스 메소드
Integer n1 = Integer.valueOf(5); // 숫자 기반 Integer 인스턴스 생성
Integer n2 = Integer.valueOf("1024"); // 문자열 기반 Integer 인스턴스 생성
// 2) 대소 비교와 합을 계산하는 클래스 메소드
System.out.println("큰 수: " + Integer.max(n1, n2));
System.out.println("작은 수: " + Integer.min(n1, n2));
System.out.println("합: " + Integer.sum(n1, n2) );
System.out.println();
// 3) 정수에 대한 2진, 8진, 16진수 표현 결과를 반환하는 클래스 메소드
System.out.println("12의 2진 표현: " + Integer.toBinaryString(12));
System.out.println("12의 8진 표현: " + Integer.toOctalString(12));
System.out.println("12의 16진 표현: " + Integer.toHexString(12));
}
}
// 실행 결과
큰 수: 1024
작은 수: 5
합: 1029
12의 2진 표현: 1100
12의 8진 표현: 14
12의 16진 표현: c
박싱, 언박싱
- 박싱(Boxing) : 값을 인스턴스로 감싸는 것
- 언박싱(Unboxing) : 저장된 인스턴스에서 값을 꺼내는 것
- 박싱은 인스턴스의 생성을 통해 이뤄지며, 언박싱은 래퍼 클래스에 정의된 메소드의 호출을 통해 이뤄진다.
- 래퍼 인스턴스는 담고 있는 값을 수정하지 못한다. (imutable)
- 따라서 값의 수정이 필요하다면 새로운 래퍼 인스턴스를 생성해줘야 한다.
public class BoxingUnboxingExam {
public static void main(String[] args) {
Integer iObj = new Integer(10); // 박싱
Double dObj = new Double(3.14); // 박싱
System.out.println(iObj);
System.out.println(dObj);
System.out.println();
int i = iObj.intValue(); // 언박싱
double d = dObj.doubleValue(); // 언박싱
System.out.println(i);
System.out.println(d);
System.out.println();
// 래퍼 인스턴스 값의 증가 방법
iObj = new Integer(iObj.intValue() + 10); // 새로운 인스턴스 생성
dObj = new Double(dObj.doubleValue() + 1.2); // 새로운 인스턴스 생성
System.out.println(iObj);
System.out.println(dObj);
}
}
언박싱 메소드
Boolean public boolean booleanValue()
Character public char charValue()
Integar public int intValue()
Long public long longValue()
Double public double doubleValue()
오토 박싱과 오토 언박싱
- 자바 5부터 박싱과 언박싱이 필요한 상황에서 이를 컴파일러가 자동으로 처리해준다.
- 인스턴스가 와야 할 위치에 기본 자료형 값이 오면 오토 박싱이 진행된다.
- 기본 자료형 값이 와야할 위치에 인스턴스가 오면 오토 언박싱이 진행된다.
class AutoBoxingUnboxing {
public static void main(String[] args) {
Integer iObj = 10; // 오토 박싱
Double dObj = 3.14; // 오토 박싱
System.out.println(iObj); // 10
System.out.println(dObj); // 3.14
int i = iObj; // 오토 언박싱
double d = dObj; // 오토 언박싱
System.out.println(i); // 10
System.out.println(d); // 3.14
}
}
Number 클래스
- java.lang.Number
- Character, Boolean을 제외한 모든 래퍼 클래스는 넘버 클래스를 상속한다.
- 넘버 클래스는 래퍼 클래스에게 공통된 기능을 제공하기 위해 존재하는 클래스이다.
넘버 클래스의 추상 메소드
- 모든 래퍼 클래스는 아래의 추상 메소드를 모두 구현하고 있다.
- 때문에 래퍼 인스턴스에 저장된 값을 다양한 형태의 기본 자료형 값으로 반환할 수 있다.
public abstract int intValue()
public abstract long longValue()
public abstract double doubleValue()
class NumberClassMethod {
public static void main(String[] args) {
Integer num1 = new Integer(29);
System.out.println(num1.intValue()); // int형 값으로 반환
System.out.println(num1.doubleValue()); // double형 값으로 반환
Double num2 = new Double(3.14);
System.out.println(num2.intValue()); // int형 값으로 반환
System.out.println(num2.doubleValue()); // double형 값으로 반환
}
}
// 실행 결과
29
29.0
3
3.14
'☕ Java > 이론' 카테고리의 다른 글
[Java] Map 컬렉션 클래스 (0) | 2022.01.25 |
---|---|
[Java] 컬렉션 프레임워크 (0) | 2022.01.18 |
[Java] 제네릭3 (와일드 카드) (0) | 2022.01.17 |
[Java] 제네릭2 (상속, 제네릭 인터페이스) (0) | 2022.01.14 |
[Java] 제네릭1 (제네릭 클래스, 제네릭 메소드) (0) | 2022.01.13 |
[Java] Arrays 클래스 (0) | 2022.01.12 |
[Java] 기본 클래스 (Math, Random, StringTokenizer) (0) | 2022.01.12 |
[Java] BigInteger, BigDecimal 클래스 (0) | 2022.01.11 |