본문 바로가기

IT

자바의 원시 타입과 참조 타입: 기능과 성능 비교

728x90
반응형
728x170

자바에서는 숫자를 다루기 위해 크게 두 가지 타입으로 분류할 수 있습니다. 하나는 '원시 타입(primitive type)'이며, 다른 하나는 '참조 타입(reference type)'입니다.

 

원시 타입은 int, double, boolean 등과 같은 것들을 의미하며, 참조 타입은 Integer, Double, Boolean과 같은 것들을 의미합니다.

 

요즘 자바는 오토박싱과 언박싱이 잘 되어서 원시 타입과 참조 타입을 코드 구현상에서 같이 사용해도 개발자 입장에서는 큰 불편함이 없습니다.

int i = Integer.valueOf(1);
Integer integer = i;
// 오토박싱 언박싱이 되기 때문에, 이런식으로 사용해도 컴파일 오류가 발생하지 않습니다.
// (참고로 오토박싱은 메모리 누수의 원인이 될 수 있습니다. 자세한 사항은 이펙티브 자바 아이템 6을 참고하세요.)

원시 타입과 참조 타입의 기능적 차이는 크게 두 가지가 있습니다.

 

1. Null을 담을 수 있는가?

  • 원시 타입은 null을 담을 수 없습니다.
  • 반면에 참조 타입은 null을 입력값으로 받을 수 있습니다.
int i = null; // 불가능
Integer integer = null; // 가능

2. 제네릭 타입에서 사용할 수 있는가?

  • 원시 타입은 제네릭 타입에서 사용할 수 없습니다.
  • 반면에 참조 타입은 제네릭 타입에서 사용할 수 있습니다.
List<int> i; // 불가능
List<Integer> integer; // 가능

그렇다면 원시 타입의 장점은 무엇일까요? 원시 타입은 null을 다룰 수 없고, 제네릭에 담기지도 못하는 등의 단점이 있지만, '성능' 측면에서 이점이 있습니다.

 

1. 접근 속도

  • 원시 타입은 '스택' 메모리에 값이 존재합니다.
  • 반면에 참조 타입은 하나의 인스턴스이기 때문에 '스택' 메모리에는 참조값만 있고, 실제 값은 힙 메모리에 존재하게 됩니다.
  • 그리고 값을 필요로 할 때마다 언박싱 과정을 거쳐야 하므로 원시 타입과 비교해서 접근 속도가 느려집니다.
    (예외적으로 엄청 큰 숫자를 복사해야 한다면, 참조값만 넘길 수 있는 참조 타입이 좋을 수도 있습니다.)

2. 차지하는 메모리 양

  • 참조 타입은 원시 타입에 비해 더 많은 메모리를 사용합니다.
    (아래 비교표는 64비트 컴퓨터 기준입니다.)
원시타입이 사용하는 메모리        참조타입이 사용하는 메모리
boolean - 1bit                Boolean – 128 bits
byte - 8bits                    Byte - 128 bits
short, character - 16bits        Short, Character - 128 bits
int, float - 32bits            Integer, Float - 128 bits
long, double - 64bits            Long, Double - 196 bits

 

[결론]
성능과 메모리 측면에서 이점이 있는 원시 타입을 먼저 고려합니다. 하지만 만약 Null을 다뤄야 하거나, 제네릭 타입에서 사용되어야 한다면 참조 타입을 사용하는 것이 좋습니다.

 

이렇게 자바에서 원시 타입과 참조 타입의 특징과 장단점을 알아보았습니다.

 

원시 타입과 참조 타입을 적절히 활용하여 자바 프로그래밍을 진행하면 더 효율적이고 성능 좋은 코드를 작성할 수 있습니다. 자바 개발 시에는 상황에 맞게 적절한 타입을 선택하여 코드를 작성하는 것이 중요하며, 이를 통해 더 효율적인 프로그램을 만들 수 있습니다.

728x90
반응형
그리드형