개발 언어/Java

[Java] 기본형과 참조형

나규태 2021. 8. 11. 23:14

기본형 (Primitive Type)

종류 자료형 범위 bit byte
논리형 boolean false, true 8 1
문자형 char \ u0000 ~ \ uffff (0~216 - 1) 16 2
정수형 long -9,223,372,036,854,775,808 ~ 0 ~ 9,223,372,036,854,775,807 64 8
int - 2,147,483,648 ~ 0 ~ 2,147,483,647 32 4
short -32,768 ~ 0 ~ 32,767 16 2
byte -128 ~ 0 ~ 127 8 1
실수형 double 4.9E-324 ~ 1.8E308 64 8
float 1.4E-45 ~ 3.4E38 32 4
  • 논리형 : boolean을 제외한 나머지 7개의 기본형은 서로 연산이 가능하다. 1bit로 충분하지만 자바는 최소 단위가 1byte이다.
  • 문자형 : 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 다르지 않으며 정수형, 실수형과 연산이 가능하다. 컴퓨터는 숫자 밖에 모르기 때문에 모든 데이터를 숫자로 변환하여 저장한다.
  • 정수형 : CPU가 가장 효율적으로 처리할 수 있는 타입이며 메모리 절약 시 byte, short를 사용한다.
  • 실수형 : 소수 점을 표현하며 각 자료형마다 소숫점의 자리 수와 오차가 다르다.

실수형의 정밀도

자료형 정밀도 bit byte
float 7자리 32 4
double 15자리 64 8
  • 정밀도가 높을 수록 오차 범위가 줄어든다.

각 자료형의 범위

-2^n-1 ~ 2^n-1 - 1이며, n은 자료형의 bit 수이다.
int의 경우 bit가 4byte * 8bit = 32bit라서 -2^31 ~ 2^31 - 1이다.

 

참조형 (Reference Type)

  • 참조형은 객체의 메모리 주소를 저장한다.
  • 참조형은 객체의 종류에 의해 구분되므로 타입이라 칭한다.
  • String, Integer, Boolean, List 등 클래스가 참조형 타입니다.
Date date = new Date();
Sample sp = new Sample();
  • 참조형 변수는 객체의 메모리 주소를 참조한다. ex) date, sp
  • 객체에 사용된 클래스를 객체의 타입이라고 한다. ex) Date, Sample

래퍼 클래스 (Wrapper Class)

  • 기본형의 8가지 자료형을 객체로 사용하기 위한 클래스
기본형 (Primitive Type) 래퍼 클래스 (Wrapper Class)
boolean Boolean
char Character
long Long
int Integer
short Short
byte Byte
double Double
float Float
  • char, int형을 제외하고 나머지 자료형은 각 자료형의 첫 글자를 대문자로 바꾸면 클래스가 된다.

래퍼 클래스 (Wrapper Class) 상속 관계도

  • Boolean, Character 클래스를 제외한 래퍼 클래스는 Number라는 상위 클래스와 상속 관계에 있다.

Boxing과 UnBoxing

  • JDK 1.5 이전에는 기본형과 래퍼 클래스 간 연산이 불가능하였다.
  • 현재는 컴파일러가 intValue와 같은 메서드를 붙여 기본형과 래퍼 클래스 간의 연산이 가능해졌다.
// JDK 1.5 이전

int i = 5;
Interger j = 5;
i+j; //에러 발생

//JDK 1.5 이후
int i = 5;
Integer j = 5;
i+j.intValue(); //intValue()로 자료형 int를 받아 연상

Boxing & UnBoxing

  • Boxing : 기본형을 래퍼 클래스로 변환하는 것을 의미한다.
  • UnBoxing :
  • 래퍼 클래스를 기본형으로 변환하는 것을 의미한다.
Integer i = new Integer(100); // Boxing
int j = i.intValue(); // UnBoxing

Auto Boxing & Auto UnBoxing

Integer i = 17; // Auto Boxing
int j = i; // Auto UnBoxing

Boxing & UnBoxing Compile 비교

// 컴파일 전
Integer int = (Integer) x;
Object o = (Object) x;
Long l = 100L;


// 컴파일 후
Integer int = Integer.valueOf(x);
Object o = (Object) Integer.valueOf(x);
Long l = new Long(100L);

기본형과 참조형의 비교

Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
int num3 = 100;

num1 == num2; // 참조형과 참조형 비교 false

num1 == num3; // 참조형과 기본형 비교 true
num1.equals(num3) // equals를 이용한 참조형과 기본형 비교 true;