원시타입과 래퍼클래스

devhan·2023년 7월 31일

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);
	}

}

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
}
profile
한번에 한가지씩

0개의 댓글