Post

[Java] Primitive Type(원시타입) & Reference Type(참조타입)

[Java]의 타입

Java에서 데이터 타입은 크게 Primitive Type(원시 타입)Reference Type(참조 타입)으로 나뉘어짐

최근 자바는 오토박싱, 언박싱이 잘 되어 있어, 원시 타입참조 타입을 코드 구현 상에서 같이 사용해도 큰 불편함이 없다.

  • Auto Boxing(오토박싱) & UnBoxing(언박싱)

    Boxing : 원시 타입 데이터에 대응하는 참조 타입으로 만드는 동작

    UnBoxing : 참조 타입에서 원시 타입으로 변환

    1
    2
    3
    4
    5
    6
    7
    
      // Boxing
      int i = 10;
      Integer num = new Integer(i);
        
      // UnBoxing
      Integer num = new Integer(10);
      int i = num.intValue();
    

    JDK 1.5부터는 자바 컴파일러가 Boxing과 UnBoxing이 필요한 상황에 자동으로 처리를 해줌

    1
    2
    3
    4
    5
    6
    7
    
      // Auto Boxing
      int i = 10;
      Integer num = i;
        
      // Auto UnBoxing
      Integer num = new Integer(10);
      int i = num;
    
    1
    2
    3
    4
    
      // 응용 예시
      List<Integer> li = new ArrayList<>();
      for (int i = 1; i < 50; i += 2)
      	li.add(i); // Auto Boxing
    
  • 하지만 오토박싱&언박싱이 일어날 경우 추가 연산 작업이 이루어 지기에 성능 향상을 위해선 동일 타입으로 지정이 효율적

Primitive Type(원시 타입)

정수, 실수, 문자, 논리 리터럴 등 실제 데이터 값을 저장하는 타입

  • Java에서 기본 자료형은 반드시 사용하기 전에 선언(Declared) 되어야하며, 자료형의 길이는 운영체제에 독립적이며 변하지 않는다.
  • 스택(Stack) 메모리에 저장
1
int a = 10; // 10이라는 값이 들어간 a가 stack 영역에 생성
종류데이터형크기(byte)
논리형boolean1
문자형char2
정수형byte1
정수형short2
정수형int4
정수형long8
실수형float4
실수형double8

Reference Type(참조 타입)

객체(Object)를 참조(주소를 저장) 하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입이다.

  • 참조 타입(Reference type 은 Java에서 최상위 클래스인 java.lang.Object 클래스를 상속하는 모든 클래스들을 말한다.
  • 실제 객체는 힙(heap) 메모리에 저장되며 참조 타입 변수는 스택(stack) 메모리에 실제 객체들의 주소를 저장하여, 객체를 사용할때 마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.
  • 이후 GC(Garbage Collector)가 돌면서 메모리를 해제


원시 타입 vs 참조 타입

기능적 차이

  1. Null을 담을 수 있는가?

    원시 타입은 null을 담을 수 없음. 반면에 참조 타입은 null을 입력 값으로 받을 수 있음

    1
    2
    
     int i = null; // 불가능
     Integer i = null = // 가능
    
  2. 제네릭 타입에서 사용할 수 있는가?

    원시 타입은 제네릭 타입에서 사용할 수 없음. 반면에 참조 타입은 제네릭 타입에서 사용 가능

    1
    2
    
     List<int> i; // 불가능
     List<Integer> i; // 가능
    

성능적 차이

원시 타입스택 메모리에 존재하고, 참조 타입스택 메모리에는 참조 값이 실제 값은 힙 메모리에 존재함

그렇기에 참조 타입은 최소 2번 메모리에 접근해야 하며, 일부 타입의 UnBoxing 과정을 거쳐야 하므로 원시 타입보다 성능이 떨어짐

결론

원시 타입성능적인 면에선 뛰어나지만 유용성작고,

참조 타입성능적인 부분은 부족하지만 유용성크다.



This post is licensed under CC BY 4.0 by the author.

Trending Tags