티스토리 뷰
int 는 primitive type
Integers 는 wrapper type
라고 하는데
그럼 primitive data type은 무엇일까요.
Primitive data type
보통 Primitive data type이라고 하면
int, float, double, char, boolean ,..... 을 떠올리는데
이것들은 변수의 값이 저장될 공간의 크기(사이즈)와 타입을 지정해준다고 합니다.
이 저장될 공간의 크기는
int는 4 bytes로
-2,147,483,648 ~ 2,147,483,647 까지의 숫자를 저장 할 수 있는데
(4bytes는 32 bits의 저장공간이기때문에
2^32(4,294,967,296)의 저장 공간이 있고,
이걸 나누기 2 하면 2,147,483,648가 된다.
음수는 - 2,147,483,648 전부 가능하지만
양수는 2,147,483,648-1 인 이유는
+/-를 구분짓는 sign bit 때문인데..
후략)
이러한 사이즈를 의미합니다.
이 primitive data type은 별도로 제공하는 메소드는 없는데
wrapper class 는 별도의 메소드를 제공합니다.
e.g. Integer.parseInt(), Integer.toHexString(),...
Wrapper Class
Wrapper Class는 타입을 포함한/가지고 있는 클래스 라고 합니다.
Integer는 int의 래퍼클래스 인거죠.
wrapper class는 객체로서 비교나 저장이 필요할때
이용합니다.
Wrapper class는 null 값이 처리가 가능하지만
산술연산을 하기 위해선 unboxing(wrapper class -> primitive 변환)이 필요하다고 하는데....
하지만!
JDK1.5 이후로 Autoboxing-자동 변환이 가능해져
실제로 아래 코드로 테스트를 해본 결과
이렇게 나왔습니다.
public static void main(String[] args) {
Integer integerA = new Integer("1");
Integer integerB= new Integer("1");
int intA = 1;
int intB = 1;
System.out.println("integerA.equals(integerB): " + integerA.equals(integerB)); //true
System.out.println("integerA == integerB: " + (integerA == integerB)); //false
System.out.println(intA == intB); //true
System.out.println("integerA + integerB = " + (integerA + integerB)); // 2
System.out.println("integerA + intA = " + (integerA + intA)); // 2
}
.equals() 는 내용(content)을 비교하기때문에
integerA.equals(integerB)는 true를 반환하지만
== 연산자는 주소값을 비교합니다.
integerA 와 integerB 는 같은 내용물을 갖고 있지만
다른 객체이기 때문에 주소값이 달라
integerA==integerB 는
false를 반환합니다.
intA 와 intB 는 객체가 아닌
값을 지정한 것이기 때문에
intA== intB는 true를 반환합니다.
직접 boxing/unboxing을 할 필요없이
자동으로 변환이 되는듯 했습니다.
하지만 오토박싱을 사용하면
성능이 저하된다고 합니다.
정리
Primitive Type | Wrapper Class |
int, double, boolean, char ... | Integer, Double, Boolean, Character ... |
변수가 저장될 공간의 크기와 타입을 지정 | primitive type 을 포함/가지고 있는 Class -> primitive type을 객체로 비교/이용할때 사용한다 |
제공되는 메소드가 없다 | 제공되는 메소드가 있다. |
Boxing: primitive type을 wrapper class 로 변환하는것
Unboxing: wrapper class 를 primitive type으로 변환 하는것
auto-boxing/ auto-unboxing: JDK1.5 이후 박싱/언박싱 형변환들이 컴파일러에 의해 자동으로 실행되는것