자바의 원시타입을 이해해보자

Lee·2023년 4월 16일
2

Java

목록 보기
8/9
post-thumbnail

자바의 데이터 타입

자바에서는 데이터 타입에 대해 크게 두 가지를 제공한다. 바로 원시 타입(Primitive Type)과 참조 타입(Reference Type)이 있다.

원시 타입은 논리형, 문자형, 정수형, 실수형 등의 실제 데이터(값)를 저장하는 타입이고,
참조 타입은 객체가 생성된 메모리의 주소를 저장하는 타입이다.

저장 영역

원시 타입과 참조 타입을 알아보기 전에 이 두개의 타입은 서로 다른 메모리 영역에 저장된다.

Stack 영역

해당 영역에서는 원시 타입의 변수가 할당되고 실제 값들이 저장된다.
참조 타입의 변수들은 힙 영역에 생성된 객체들의 주소 값을 저장하고 있다.

객체 안의 메소드의 작업이 종료되면 할당되었던 메모리 공간은 반환되어 비워진다.

Heap 영역

해당 영역에선 객체와 배열이 생성된다.
참조 타입(배열, 객체, 인터페이스)들이 가지고 있는 주소 값은 Stack 영역에 저장된다.
원시 타입과는 다르게 크기가 정해져 있지 않으며, 프로그램 실행 시 Heap 영역에 동적으로 할당된다.

만약 참조하는 변수가 없다면 GC가 제거하는 대상이 된다.

원시 타입(Primitive Type)

원시타입은 JVM 메모리 구조 중 Stack 영역에 저장된다.
원사타입의 갯수는 총 8개가 있으며, 기본적으로 자바가 데이터를 다루는 최소 범위는 1 Byte이다.

종류데이터형크기(byte / bit)표현 범위
논리형boolean1 / 8true 또는 false
문자형char2 / 16'\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터)
정수형byte1 / 8-128 ~ 127
정수형short2 / 16-32768 ~ 32767
정수형int4 / 32-2147483648 ~ 2147483647( -21억 ~ + 21억)
정수형long8 / 64-9223372036854775808 ~ 9223372036854775807(-100경 ~ + 100경)
실수형float4 / 321.4E-45 ~ 3.4028235E38
실수형double8 / 644.9E-324 ~ 1.7976931348623157E308

참조 타입(Reference Type)

원시타입을 제외한 나머지 타입은 전부다 참조 타입이라고 볼 수 있다.

실제 객체는 Heap 영역에 저장되며, 참조 타입 변수는 Stack 영역에 실제 객체의 주소 값을 저장하게 된다.

스택 영역힙 영역
int age = 25
char cc = 'c'
String name = 1111번지1111번지 : "커피"

Boxing, UnBoxing

Boxing은 원시 타입을 참조 타입으로 변환 시키는 것을 말하고, UnBoxing은 참조 타입을 원시 타입으로 변환 시키는 것을 말한다.

자바 1.5부터 추가된 Auto Boxing / UnBoxing 기능으로 인해 명시적으로 형변환을 하지 않아도 자동으로 Boxing / UnBoxing을 해준다.

public class BoxingUnBoxing {

	public static void main(String[] args) {

		// Boxing
		int i = 10;
		Integer integer = i;

		System.out.println(i);
		System.out.println(integer);

		// UnBoxing
		Integer integer2 = 20;
		int i2 = integer2;

		System.out.println(i2);
		System.out.println(integer2);
	}

}

결과
10
10
20
20

원시 타입과 참조 타입의 차이

Null 포함 여부

원시타입은 null을 담을 수 없고, 참조 타입은 가능하다.

int a = null; // 불가능
Integer integer = null; // 가능

제네릭 타입에서 사용 여부

원시 타입은 제네릭 타입에서 사용할 수 없지만, 참조 타입은 가능하다.

ArrayList<int> list; // 불가능
ArrayList<Integer> list; // 가능

0개의 댓글