개발 언어/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;