1. Primitive 자료형 - Wrapper 클래스 관계
int | primitive 자료형 (long, float, double ...) |
산술 연산이 가능하다. | |
null로 초기화 할 수 없다. | |
Integer | Wrapper 클래스 (객체) |
Unboxing을 하지 않으면 산술 연산이 불가능 하지만, null 값을 처리할 수 있다. | |
null 값 처리가 용이하기 때문에 SQL과 연동할 경우 처리가 용이하다. | |
DB에서 자료형이 정수형이지만 null 값이 필요한 경우 VO에서 Integer를 사용할 수 있음. |
2. int와 Integer간의 변환
- Boxing과 Unboxing이라고 한다.
Boxing | Primitive 자료형 -> Wrapper 클래스 |
Unboxing | Wrapper 클래스 -> Primitive 자료형 |
- 예제 코드
// to int i from Integer ii
int i = ii.intValue();
// to Integer ii from int i
Integer ii = new Integer( i );
- valueOf()와 parseInt()의 차이
Integer.valueOf(String) | Integer 클래스를 리턴하기 때문에 산술 연산을 할 수 없다. |
Integer.parseInt(String) | int 형을 리턴하기 때문에 산술 연산을 할 수 있다. |
※ 정수로 파싱할 수 없는 String을 파라미터로 전달하면 에러
3. Auto boxing / unboxing
- 자바에서는 모든 경우는 아니지만 대부분의 경우에는 자동으로 boxing / unboxing을 해준다.
- 예제 코드
int i = 1;
Integer integer = i; // int -> Integer (Auto boxing)
int i2 = integer; // Integer -> int (Auto unboxing)
4. int와 Integer의 사이즈를 비교하는 재미있는 실험
- 환경
JRE | jdk 1.5.0_15 |
OS | Windows XP |
- 조건
Integer 및 int 배열을 1,000,000개 생성 |
- 결과
Integer | 19986824 byte |
int | 3998536 byte |
Rate(Integer/int) | 4.99 (약 5배) |
- 요약
- Object가 8 byte - Integer가 16 byte - Integer를 참조하는데 4 byte - Integer의 사이즈 = 16 + 4 = 20 byte - int의 사이즈 = 4 byte -> 5배 차이 |
출처: https://includestdio.tistory.com/1 [includestdio]
[Java] Integer와 int의 차이
1. Primitive 자료형 - Wrapper 클래스 관계 int primitive 자료형 (long, float, double ...) 산술 연산이 가능하다. null로 초기화 할 수 없다. Integer Wrapper 클래스 (객체) Unboxing을 하지..
includestdio.tistory.com
package tut02; public class Tut02 { public static void main(String[] args) { Integer iA = new Integer(123); Integer iB = new Integer(123); int ia = (int)iA; //(1) 언박싱(unboxing) int ib = iB; //(2) 오토언박싱(auto unboxing) Integer iC = (Integer)456; //(3)박싱(boxing) Integer iD = ia; //(4)오토 박싱(auto boxing) } } |
위 예세서 (1)은 명시적으로 언박싱을 해주는 것이고 (2)는 자동으로 수행해 주는 것이다. 박싱의 경우도 자동으로 처리해 준다. 오토박싱과 오토언박싱은 대응되는 자료형 사이에만 일어난다는 점도 유의해야 한다.
포장 클래스 객체간 연산도 가능하며 기본형과 포장형 간 연산도 가능하다.
package tut02; public class Tut02 { public static void main(String[] args) { Integer iA = new Integer(123); Integer iB = new Integer(123); int ia = (int)iA; //(1) 언박싱(unboxing) int ib = iB; //(2) 오토언박싱(auto unboxing) Integer iC = (Integer)456; //(3)박생(boxing) Integer iD = ia; //(4)오토 박싱(auto boxing) Integer iE = iA + iB; // 포장형끼리의 연산 Integer iF = ia - ib; // 기본형끼리의 연산 결과를 오토박싱 int ic = ia * iB; // 기본형과 포장형 간 연산 }} |
자바에서는 연산자가 오버로딩되지 않는다는 점을 생각하면 의아할 것이다. 하지만 이 코드는 내부적으로 포장형인 피연산자가 오토언박싱 되어서 기본형 끼리의 연산으로 수행되는 것이라고 이해할 수 있다.
비교 연산도 가능하지만 내용물의 동치 여부를 검사할 때 ==기호대신 equals() 메소드를 이용해야 한다.
package tut02; public class Tut02 { public static void main(String[] args) { Integer ia = new Integer(123); Integer ib = new Integer(123); Integer ic = new Integer(456); System.out.println("ia>=ib:"+(ia>=ib)); System.out.println("ib>=ic:"+(ib>=ic)); System.out.println("ia==ib:"+(ia==ib)); System.out.println("ia.equals(ib):"+ia.equals(ib)); } } |
ia>=ib:true ib>=ic:false ia==ib:false ia.equals(ib):true |
왜냐면 포장형고 객체이기 때문에 ==연산은 두 객체 인스턴스의 참조(주소값)을 비교하게 되는 것이다. 내용물의 동치 여부는 문자열 객체와 마찬가지로 equals() 메소드를 이용해야 한다.
출처: https://studymake.tistory.com/420 [스터디메이크]
'JAVA(자바)' 카테고리의 다른 글
[java] Date DateTime TimeStamp (0) | 2022.02.19 |
---|---|
Optional<T> (0) | 2022.02.01 |
JDK, JRE, JVM,컴파일러 개념 및 버젼 확인하기 (0) | 2022.01.03 |
[자바]getClass (0) | 2021.12.23 |
자바 입출력 정보 (0) | 2021.12.22 |
댓글