6월 4일 - 값 타입 vs 참조 타입

Yullgiii·2024년 6월 3일
0
post-thumbnail

값 타입 vs 참조 타입

자바에서 데이터가 저장되는 메모리의 위치에 따라 값 타입(원시 타입)과 참조 타입으로 나뉜다. 이 두 타입의 차이점을 이해하는 것은 성능 최적화와 메모리 관리를 위해 매우 중요하다.

값 타입 (Primitive Type)

  • 저장 위치: 스택(Stack) 영역에 저장된다. 크기가 작고 고정적이다.
  • 선언: 선언 시 스택에 즉시 생성되며, 선언 직후부터 데이터를 저장하는 용도로 사용할 수 있다.
  • 메모리 및 접근 속도: 스택에 저장되므로 접근 속도가 빠르다.
  • 소멸 시점: 변수를 선언한 메소드가 종료될 때 소멸된다.
  • 복사: 복사에 의해 별개의 복사본이 생성되며, 복사 후 원본과 복사본은 별개의 변수이다.
  • Null 값 저장: Null 값을 저장할 수 없다.

참조 타입 (Reference Type)

  • 저장 위치: 힙(Heap) 영역에 저장된다. 크기가 크고 가변적이다.
  • 선언: 선언에 의해 참조만 생성될 뿐, 데이터를 저장할 실제 메모리는 할당되지 않는다. 반드시 new 연산자로 메모리를 할당받아 초기화해야 한다.
  • 메모리 및 접근 속도: 참조 값은 스택에 존재하고 실제 값은 힙에 존재한다. 값을 필요로 할 때마다 언박싱 과정을 거쳐야 하므로 원시 타입보다 접근 속도가 느리다.
  • 소멸 시점: 더 이상 참조하는 변수가 없을 때 GC에 의해 제거된다.
  • 복사: 참조 타입끼리의 대입은 힙에 존재하는 데이터를 참조하는 참조자가 하나 더 늘어날 뿐이다. 따라서 별도의 메모리가 추가로 할당되지 않는다.
  • Null 값 저장: Null 값을 저장할 수 있다.

메모리 및 접근 속도 예시

public class PrimitiveVsReference {
    public static void main(String[] args) {
        // 값 타입 (Primitive Type)
        int a = 5;
        int b = a; // b에 a의 값이 복사됨
        b = 10;
        System.out.println("a: " + a); // a: 5
        System.out.println("b: " + b); // b: 10

        // 참조 타입 (Reference Type)
        Integer x = new Integer(5);
        Integer y = x; // y는 x를 참조함
        y = 10;
        System.out.println("x: " + x); // x: 5
        System.out.println("y: " + y); // y: 10
    }
}

추가 개념

차지하는 메모리의 양

Boolean의 경우, 원시 타입과 참조 타입 간의 메모리 사용량 차이는 128배가 될 수 있다.

Null

원시 타입은 Null 값을 저장할 수 없지만, 참조 타입은 Null 값을 저장할 수 있다.

성능 비교

아래 이미지는 값 타입과 참조 타입의 평균 실행 시간을 비교한 것이다. 값 타입이 참조 타입보다 더 빠르다는 것을 알 수 있다.

So...

성능과 메모리 효율성을 고려할 때는 원시 타입을 우선적으로 사용하는 것이 좋다. 하지만, Null 값을 다뤄야 하거나 제네릭 타입에서 사용되어야 하는 경우에는 참조 타입을 사용한다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글