자바의 원시타입

김멉덥·2022년 8월 13일
1

기술면접 공부

목록 보기
1/8
post-thumbnail

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

Backend-Interview-Question

자바에 존재하는 원시타입들과 바이트 크기는 다음과 같습니다.

종류데이터형크기 (바이트)
논리형boolean1
문자형char2
정수형byte1
정수형short2
정수형int4
정수형long8
실수형float4
실수형double8

우선 자바에는 두가지의 데이터 타입이 존재합니다.

  1. 원시 타입 (Primitive Type)
  2. 참조 타입 (Referecne Type)

원시 타입

  • 원시 타입은 실제 데이터 값을 저장하는 타입입니다.

    ex ) int, boolean, char

참조 타입

  • 참조 타입은 기본 타입을 제외한 타입으로, 객체의 주소를 저장하는 타입입니다.

    ex ) 문자열, 배열, 열거형 상수, 클래스, 인터페이스

자바에서 객체는 힙 영역에 저장되는데, 참조 타입 변수는 이러한 실제 객체의 주소를 스택 영역에 저장합니다.
그리고 이러한 객체들을 사용할 때 마다 참조 타입 변수에 저장된 객체의 주소를 불러와 사용하게 됩니다.

( 자바의 메모리 구조 - 참고 )


원시 타입에 대해서 자세히 알아보기

논리형 - boolean

  • 저장 가능한 범위 true / false
  • true / false 두가지 밖에 없지만 자바가 데이터를 다루는 최소 범위가 1 Byte 이기 때문에 낭비적이지만 1 Byte를 사용한다.

문자형 - char

  • 자바의 경우 유니코드를 사용한다.
    • 동양의 글자의 경우 2 Byte까지 필요하기 때문에 char의 경우 2 Byte를 이용한다.
    • 유니코드란 ?
      • 문자를 표현할 때에는 아스키코드유니코드를 사용한다.
      • 아스키(ASCII) 코드
        1바이트(8bit)로 영문자, 숫자, 특수문자 등을 표현함
      • 유니코드 (Unicode)
        영문자, 숫자, 특수문자 뿐만 아니라 한글, 한자와 같이 복잡한 언어를 표현함 (대표적으로는 UTF-8, UTF-16가 존재)
  • 자바에서 유일하게 제공되는 unsigned 형태다.
    • unsigned : 음수 없이 0부터 시작하여 양수 값만 가지는 데이터 형태
      2 Byte = 16진수 0x00 = **0**000 0000 0000 0000

      → 원래는 여기서 맨 앞 1 Bit를 가지고 음수나 양수를 표현한다.

      하지만 char형은 unsigned 형식이기 때문에 맨 앞 비트를 음수 양수 형식 으로 사용하지 않는다.

    • short 형이 1111 1111 1111 1111 의 Bit를 가지고 있을 때, 10진수의 값 → -1

    • char 형이 1111 1111 1111 1111 의 Bit를 가지고 있을 때, 10진수의 값 → 65535

char a = 'A'; 
char b = 'B'; 
  • 일때 if (a > b) 가 가능한 이유 : char형은 유니코드 정수형태로 저장되어 char a = 'A' 일 때, a 변수에 'A' 의 정수 값인 65가 들어가기 때문이다.

정수형 - byte, short, int, long

  • JVM의 피연산자 스택이 피연산자를 4 Byte 단위로 저장한다.

    따라서 int보다 작은 자료형의 값을 계산시, int형으로 형변환 되서 연산이 수행된다.

    • 피연산자란, 연산에 참여하는 변수나 상수를 뜻한다.
  • 정수형 데이터 타입은 **int형 데이터 타입이 기본 데이터 타입이다.

    정수형 데이터를 사용하게 되면 JVM에서 기본적으로 int형 데이터타입의 데이터로 인식한다.

    따라서 int형 데이터 타입의 범위를 넘어서는 long 데이터 타입의 정수를 사용하고자 하는 경우에는 정수 데이터 맨 뒤 쪽에, 접미사 'l' 이나 'L'을 붙여줘야한다.

    • 소문자 l 은 숫자 1과 혼돈할 우려가 있기 때문에 대문자 L을 붙여 사용하는것이 좋다.
    • 4Byte 넘어가는 타입 선언시,
      Long val = 123456789000;
      이런식으로 뒤에 ‘L’을 붙여줘야한다.
      Long val = 123456789000**L**;

정수형 데이터들의 표현할 수 있는 범위는 다음과 같다.

  • byte ( 1 바이트, 8 비트 ) https://velog.velcdn.com/images%2Fgillog%2Fpost%2F0c52ae90-cc86-4da5-9ec6-cbe0f5f305f3%2F263610505493DB6821.png
  • short (2 바이트, 16 비트 )
    https://velog.velcdn.com/images%2Fgillog%2Fpost%2Fc1f2117c-9f4d-44c2-bd57-27a0b5080768%2F272EEF505493DBF12E.png
  • int ( 4 바이트, 32 비트 )
    https://velog.velcdn.com/images%2Fgillog%2Fpost%2F2641bad2-dbb3-407b-b954-96ee1d5c17b7%2F237350495493DC051F.png
  • long ( 8 바이트, 64 비트 )
    https://velog.velcdn.com/images%2Fgillog%2Fpost%2Fdb711eaf-b287-4591-8df6-c4391fabc45d%2F22426E4A5493DC2B18.png
    ( -1를 해주는 이유는 중간에 0이 존재하기 때문 )

실수형 - float, double

  • 실수형 데이터 타입에서는 **double형 데이터타입이 기본 데이터 타입**이다.
    • 과거에는 실수를 표현할 때 float형을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용한다.

      따라서 실수형의 기본 데이터 타입이 double형 이기 때문에 float형 데이터를 사용하고자 하는 경우에도 아까 long형 처럼 실수 데이터 맨 뒤 쪽에 접미사 'f''F'를 붙여줘야한다.

    • float를 사용하고자 한다면, 아래와 같이 사용

      float val = 0.123456**F**;
  • float형 데이터 타입보다 double형 데이터 타입이 두배정도 더 정밀한 데이터를 표현할 수 있다.

원시 타입의 장단점

단점

  1. null 사용 불가
    • 원시 타입은 null을 담을 수 X
    • 반면에 참조 타입은 null을 입력값으로 받을 수 O
      int i = null;    // 불가능 (원시 타입)
      
      Integer integer = null;   // 가능 (참조 타입)
  2. 제네릭 타입에서 사용 불가
    • 원시 타입은 제네릭 타입에서 사용할 수 X
    • 반면에 참조 타입은 제네릭 타입에서 사용할 수 O
      List<int> i;    // 불가능 (원시 타입)
      
      List<Integer> integer;   // 가능 (참조 타입)

장점

  1. 접근 속도가 참조 타입보다 빠르다.
    • 원시 타입이 참조 타입과 비교해서 갖는 장점은 '성능'상의 이점이 있다.
    • 원시 타입은 '스택' 메모리에 값이 존재한다.
      반면에 참조 타입은 하나의 인스턴스이기 때문에 '스택' 메모리에는 참조값만 있고, 실제 값은 힙 메모리에 존재하게 된다.
    • 그리고 참조 타입은 값을 필요로 할 때마다 언박싱 과정을 거쳐야 하니 원시 타입보다는 접근 속도가 느려지게 된다.
      ( 그러나 예외적으로 엄청 큰 숫자를 복사해야 한다면, 참조값만 넘길 수 있는 참조 타입이 좋을 수 도 있다. )
  2. 차지하는 메모리 양이 참조 타입보다 적다.
    • 차지하는 메모리에 양도 참조 타입이 훨씬 많다.

참고 자료

원시타입, 참조타입(Primitive Type, Reference Type)
[Java] 메모리 구조 메소드(Method), 스택(Stack), 힙(Heap) 영역에 대하여
[Java] 원시 타입 vs 참조 타입
Java - 문자 자료형과 아스키코드, 유니코드(UTF-8, UTF-16)
[JAVA] 3. 기본형 데이터타입의 저장 가능 범위
코딩교육 티씨피스쿨
[Java] float과 double의 차이는 무엇일까?
원시타입이 있는 이유

profile
데굴데굴

0개의 댓글