Java : Primitive Type / Reference Type

    자바 Primitive Type / Reference Type

    데이터 타입은 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려준다. 자바에는 크게 Primitive Type(기본형 타입)과 Reference Type(참조형 타입)이 존재한다. 그렇다면 각 타입은 어떤 차이점을 가지고 있을까?

     


    기본형 타입(Primitive Type)

    • 기본형 타입은 기본값을 가지고 있다. 기본값이 존재하기 때문에 Null이 존재하지 않는다.
    • 기본형 타입은 8가지가 존재한다.
    • 기본형 타입은 실제 값을 스택(Stack) 메모리에 저장한다. 
    • 변수의 선언과 동시에 메모리에 생성됨.
    • 컴파일 시점에 담을 수 없는 값을 담으려 하는 경우 컴파일 에러가 발생한다. Null을 넣을 수 없기 때문에 Null을 할당하는 경우 컴파일 에러가 발생한다. 
      타입 할당되는 메모리 크기 기본값 저장 공간
    논리형 boolean 1 byte false Stack Memory
    정수형 byte 1 byte 0 Stack Memory
    short 2 byte 0 Stack Memory
    int(기본) 4 byte 0 Stack Memory
    long 8 byte 0L Stack Memory
    실수형 float 4 byte 0.0F Stack Memory
    double 8 byte 0.0 Stack Memory
    문자형 char 2 byte   Stack Memory

     

     


    참조형 타입(Reference Type)

    • 기본형 타입을 제외한 타입들이 모두 참조형 타입이다.
    • 빈 객체를 의미하는 Null이 존재한다. 즉, 런타임에 Null Pointer Exception이 발생할 수 있다.
    • 참조형 타입은 어떤 값이 저장되어 있는 주소를 값으로 갖는다.
    • 객체의 값이 저장되어 있는 곳의 주소값을 힙(Heap) 메모리에 저장한다. 
      • 힙 메모리 영역에서 GC가 동작하며 불필요한 객체들을 삭제한다. 
    • 참조형 변수 간의 연산은 불가능하다. 
      • 참조형 변수의 값 자체는 주소값을 의미하기 때문이다. 참조형 변수끼리 더한다는 것은 주소 값이 가리키고 있는 기본형 변수끼리 연산된다.
    타입 예시 기본값 할당되는 메모리 크기
    Array int[] arr = new int[5]; Null 4 byte (객체의 주소값)
    Enum   Null
    Class String str = "test" Null
    Interface   Null

     


    Primitive Type vs Reference Type의 비교

    아래 그림으로 살펴볼 수 있다.

    • Primitive Type
      • n = 10을 하면 현재 호출된 메서드의 Stack 영역에서 바로 생성된다. 즉, Stack 메모리 영역에는 n이라는 변수가 선언되어 있고, n은 10을 가진다. 
    • Reference Type
      • Reference Type은 생성될 때 힙(Heap) 메모리 영역에서 생성된다. 생성된 인스턴스가 필드를 가지고 있다면, 그 값은 인스턴스에게 배정된 메모리에 할당된다. 
      • new String()을 하면 인스턴스가 생성된다. 이 때, 리턴값은 생성된 인스턴스의 힙 메모리의 주소다.
      • A = new String()일 때, A는 현재 메서드가 호출된 Stack 메모리 영역에 할당된 변수(주소)다. 그리고 이 변수(주소)는 힙 메모리에 생성된 인스턴스 주소를 가리킨다. 


    기본형 매개변수(Primitive Type)와 참조형(Reference Type) 매개 변수

    자바에서 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 매개변수의 타입에 따라서 어떻게 값이 복사되어 전달되는지가 결정된다.

    • 기본형(Primitive Type, CallByValue로 동작) : 기본형 타입은 Stack 영역에서 값을 직접 가지고 있다. 따라서 매개변수로 값을 넘겨준다면, 값이 직접 복사되어 전달된다. 즉, 매개변수로 전달되는 값의 주소와 전달된 곳에서의 값의 주소가 서로 다르다. CallByValue를 의미한다.
    • 참조형(Reference Type, CallByReference로 동작) : 참조형 타입은 힙 메모리 영역의 인스턴스 주소를 가리킨다. 매개변수로 넘기게 되면, 힙 메모리 영역의 인스턴스 주소를 복사해서 넘기게 된다. 매개변수로 전달되는 값이 주소와 전달된 곳에서의 값의 주소가 동일하다.  즉, 힙 메모리에 존재하는 동일한 객체를 가리키기 때문에 값을 읽어오고 변경하는 것이 가능해진다. CallByReference를 의미한다.

    출처

    https://gbsb.tistory.com/6

    댓글

    Designed by JB FACTORY