-
원시타입과 래퍼클래스책/Head First Java 2023. 12. 20. 01:03
Integer vs int 이 둘은 무슨차이?
자바 1.5에서 auto-boxing과 auto-unboxing을 제공하여, 타입 측면에서는 차이가 없이 사용할 수 있다.
(컴파일 타임에 확인 가능)
int
- int는 Primitives 타입으로 4바이트만 차지한다.
- 메모리와 연산 속도에 이점이 있다.
- Integer 타입에 할당되는 경우, 컴파일 타임에 자동으로 Integer.valueOf()를 통해 auto-boxing 된다.
Integer
- Integer는 Reference 타입이기 때문에 보다 많은 메모리를 차지한다. (기본 int 값 + 각종 메소드)
- 힙에 할당된다.
- null 사용 가능하다.
- int 타입에 할당되는 경우, 컴파일 타임에 자동으로 Integer.initValue()를 통해 auto-unboxing 된다.
코드와 바이트코드
public class Runner { public static void main(String[] args) { // TODO Auto-generated method stub Runner r = new Runner(); int num = 1; Integer numObj = Integer.valueOf(1); System.out.println(numObj.intValue()); r.getInt(num); r.getInt(numObj); r.getInteger(num); r.getInteger(numObj); } void getInt(int num) { System.out.println("hello" + num); } void getInteger(Integer num) { System.out.println("hi" + num); } }
22, 25와 30,33에서 확인이 가능하다.
public class Runner { public Runner(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: new #2 // class Runner 3: dup 4: invokespecial #3 // Method "<init>":()V 7: astore_1 8: iconst_1 9: istore_2 10: iconst_1 11: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 14: astore_3 15: aload_1 16: iload_2 17: invokevirtual #5 // Method getInt:(I)V 20: aload_1 21: aload_3 22: invokevirtual #6 // Method java/lang/Integer.intValue:()I 25: invokevirtual #5 // Method getInt:(I)V 28: aload_1 29: iload_2 30: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 33: invokevirtual #7 // Method getInteger:(Ljava/lang/Integer;)V 36: aload_1 37: aload_3 38: invokevirtual #7 // Method getInteger:(Ljava/lang/Integer;)V 41: return void getInt(int); Code: 0: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream; 3: iload_1 4: invokedynamic #9, 0 // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String; 9: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 12: return void getInteger(java.lang.Integer); Code: 0: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream; 3: aload_1 4: invokedynamic #11, 0 // InvokeDynamic #1:makeConcatWithConstants:(Ljava/lang/Integer;)Ljava/lang/String; 9: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 12: return }
[이미지 출처]
https://www.amazon.com/Head-First-Java-Brain-Friendly-Guide/dp/1491910771 (글 표지 이미지)
'책 > Head First Java' 카테고리의 다른 글
List 정렬에 대하여 (1) 2023.12.21 HashSet! 무엇을 기준으로 같다고 할 것인가? (0) 2023.12.20