기본 개념
Java에서 Data type에는 primitive type과 reference type이 있다.
프로그램을 만들다보면, 이 primitive type의 데이터를 reference type으로 처리해야 하는 경우가 있다.
이런 경우를 위해 Java에는 Wrapper class라는 것이 있다.
Wrapper class는 이 primitive type의 데이터를 객체로 사용할 수 있게 해준다.
Primitive Type | Reference Type |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
Boxing/Unboxing과 Auto-boxing/Auto-unboxing
primitive type의 데이터를 reference type으로 변환하는 것을 boxing,
반대로 reference type을 primitive type으로 변환하는 것을 unboxing이라 한다.
public void test() {
Integer num1 = new Integer(1); //boxing
int num2 = num1.intValue(); //unboxing
}
Java 1.5버전 이후부터는 이를 편하게 하기 위해 boxing과 unboxing을 자동적으로 해주는 기능이 추가됐다.
public void test() {
Integer num1 = 1; //auto-boxing
Integer num2 = 2; //auto-boxing
int sum = num1 + num2; //auto-unboxing
}
num1과 num2를 auto-unboxing하여 primitive type끼리의 연산을 수행한다.
특징
immutable
Wrapper class는 String class와 마찬가지로 immutable object이다.
private final int value;
Integer class 내부에 값을 담는 value 변수가 final로 선언된 것을 볼 수 있다.
처음, 인스턴스에 값이 정해지면, 해당 인스턴스에서는 더 이상 값을 바꿀 수 없다.
public void test() {
Integer num = 3;
changeValue(num);
System.out.println("num = " + num);
}
public void changeValue(Integer num) {
num += 7;
}
출력값이 10이 될 것 같지만 3이 출력된다.
값 비교 시 equals() 사용
Wrapper class 내부의 값끼리 비교할 때 ==을 사용하면 참조값을 비교하게된다.
따라서, 내부 값을 비교하고 싶을 땐 String class와 마찬가지로 equals()를 사용하면 된다.
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer class의 equals()를 보면 값 비교를 하게끔 overriding된 것을 확인할 수 있다.
참고
https://yaboong.github.io/java/2018/05/26/java-memory-management/
'언어 > Java' 카테고리의 다른 글
생성자 (1) | 2022.05.11 |
---|---|
static (0) | 2022.05.10 |
Class 클래스 (0) | 2022.04.01 |
String Constant Pool (0) | 2022.03.25 |
Overriding 오버라이딩 (0) | 2022.03.14 |
댓글