💝 Computer Science/Database

[CS] 자바의 원시타입 | 참조타입 | 원시타입, 참조타입 비교

budtree 2022. 7. 20. 23:01

기술면접

자바의 원시타입들은 무엇이 있으며 각각 몇 바이트를 차지하나요?

정수형 byte(1), short(2), int(4), long(8)

실수형 float(4), double(8)

문자형 char(2)

논리형 boolean(1)

  • 참고


boolean b = false;
int i = 5; //4bytes -> 32bits
short s = 5; //2bytes -> 16bits (-32768~32767)
byte b = 5; //1byte -> 8bits (-128~127)
long l = 5l; //8bytes
float f = 5.5f;
double d = 5.5f;
char c = 'A'; //65
c = 66;
System.out.println(c); //B

int k = (int)5.5; //type casting

char

  • 자바에서 유일하게 제공되는 unsigned 형태

  • 보통 2Byte = 0x00 = 0000 0000 0000 0000이고 맨 앞의 1Bit가 음수/양수를 나타내는데, char은 unsigned이기 때문에 앞자리까지 양수의 숫자로 다 사용!(0~65535까지의 값을 가짐)

  • ex) 1111 1111 1111 1111 → 65535

  • char c1 = ‘A’, c2 = ‘B’; 일때 c1 < c2인 이유?

    : JVM에서 피연산자를 4Byte 단위로 저장하기 때문에 더 적은 자료형의 값(char, short)을 계산하면 int형으로 자동 형변환된다.

    char형은 유니코드 정수 형태로 저장되기 때문에 c1에는 ‘A’의 정수값인 65가 들어간다


원시타입, 참조타입

자바에서 숫자를 다루는 타입의 종류

원시타입(primitive type) : 정수, 실수, 문자, 논리 리터럴등 실제 데이터 값을 저장하는 타입

참조타입(reference type) : 객체의 주소를 저장하는 타입으로, 주소를 통해 객체를 참조한다.

특징 비교

  1. Null 가능 여부

    원시타입은 null을 가질 수 없다.

    참조 타입은 null을 입력값으로 받을 수 있다. (힙 영역의 객체를 참조하지 않는다는 의미)

     int i = null;//불가능
     Integer integer = null; //가능
  2. 제네릭 타입에서의 사용가능여부

    원시타입은 제네릭타입에서 사용 불가능

    참조 타입은 제네릭 타입에서 사용 가능

     List<int> i; //불가능
     List<Integer> integer; //가능

성능 비교

  1. 접근 속도


    원시타입 : 스택 메모리에 값이 존재한다

    참조타입 : 스택메모리에는 참조값만 있고, 실제 값은 힙 메모리에 존재한다.

    값을 필요로 할때마다 언박싱 과정을 거쳐야 하기 때문에 원시타입에 비해 속도가 느리다

     int age = 24;
     double height = 165.5;
    
     String name = "다정";
     String hobby = "공부";
    스택 영역 힙 영역
    age : 24 200번지 : “다정”
    height : 165.5; 300번지 : “공부”
    name : 200번지
    hobby : 300번지
  2. 메모리 양

    원시타입이 사용하는 메모리 참조타입이 사용하는 메모리
    boolean - 1bit Boolean – 128 bits
    byte - 8bits Byte - 128bits
    short, char - 16bits Short, Charater - 128bits
    int, float - 32bits Integer, Float - 128bits
    long, double - 64bits Long, Double - 196bits

    참조타입이 사용하는 메모리 양이 압도적으로 높음을 확인할 수 있다.


결론 :

  1. 성능과 메모리에 장점이 있는 원시 타입을 먼저 고려한다.
  2. Null을 다루거나, 제네릭 타입에서 사용되어야 한다면 참조타입을 사용한다.