타입(Data type)
타입은 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지 명시적으로 알려준다.
자바에서의 타입은 크게 기본형 타입 (Primitive type) 과 참조형 타입 (Reference type) 이 있다.
기본형 타입은 원시 타입이라고도 한다.
기본형 타입은 정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입이다.
참조 타입은 객체의 주소를 저장하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입이다.
기본형 타입 (Primitive type)
- 8가지의 기본형 타입을 미리 정의하여 제공한다.
- 기본값이 있기 때문에 Null이 존재하지 않는다. 만약 기본형 타입에 Null 을 넣고 싶다면 래퍼 클래스를 활용한다.
- 실제 값을 저장하는 공간으로 Stack 메모리에 저장된다.
- 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다. 주로 문법상의 에러가 많다. (예를 들면 ; 안붙였을 때 빨간색 줄이 쳐지는 경우)
타입 | 할당되는 메모리 크기 | 기본값 | 데이터의 표현 범위 | ||
논리형 | boolean | 1 byte | false | true, false | |
정수형 | byte | 1 byte | 0 | -128 ~ 127 | |
short | 2 byte | 0 | -32,768 ~ 32,767 | ||
int(기본) | 4 byte | 0 | -2,147,483,648 ~ 2,147,483,647 | ||
long | 8 byte | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
||
실수형 | float | 4 byte | 0.0F | (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 | |
double(기본) | 8 byte | 0.0 | (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 | ||
문자형 | char | 2 byte (유니코드) | '\u0000' | 0 ~ 65,535 |
int가 기본형이기 때문에 long을 사용할 때는 이 때 정수 데이터 맨 뒤 쪽에 'l' 나 'L' 을 붙여줘야 한다. 소문자 l을 숫자 1과 헷갈릴 수 있으니 L을 사용하는 것이 좋다.
실수형 데이터에서도 마찬가지로 double이 기본이므로 float을 사용할 때는 실수 데이터 맨 뒤 쪽에 'f' 나 'F'를 붙여줘야 한다.
참조형 타입 (Reference type)
- 기본형 타입을 제외한 타입들이 모두 참조형 타입이다.
- 빈 객체를 의미하는 Null 이 존재한다.
- 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(Heap) 메모리에 저장된다.
- 실제 객체는 Heap 영역에 저장되면 참조 타입 변수는 스택 영역에 실제 객체들의 주소를 저장하여, 객체를 사용할 때 마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.
- 문법상으로 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다. (예를 들면 객체나 배열을 Null 값으로 받으면 NullPointException이 발생하므로 변수값을 넣어야 한다.)
타입 | 예시 | 기본값 | 할당되는 메모리 크기 |
배열(Array) | int[] arr = new int[5]; | Null | 4 byte (객체의 주소값) |
열거(Enumeration) | Null | ||
클래스(Class) | String str = "test"; Student sujin = new Student(); |
Null | |
인터페이스(Interface) | Null |
Boxing, Unboxing
Boxing은 기본타입을 참조타입으로 변환시키는 것이다.
Unboxing은 참조타입을 기본타입으로 변환시키는 것이다.
자바 1.5 이전에는 일일히 변환 과정을 거쳐야 했지만, 자바 1.5부터 Auto Boxing, Unboxing 기능이 추가되어 명시적으로 자동으로 기능을 수행해준다.
int i = 10;
Integer integer = i;
기본타입과 참조타입의 차이
스택은 정적 메모리
스택 영역에는 기본타입 변수가 할당되고 변수의 실제 값들이 저장된다.
참조 타입의 변수들은 이 스택 영역에서 힙 영역에 생성된 객체들의 주소 값을 저장하고 있다.
객체 안의 메소드의 작업이 종료되면 할당되었던 메모리 공간은 반환되어 비워진다.
힙은 동적 메모리
힙 영역에는 객체와 배열이 생성된다.
참조타입들이 이 객체들의 주소를 스택 영역에 저장한다.
참조타입들은 기본타입 변수들과 다르게 크기가 졍해저 있지 않다.
프로그램 실행시 메모리에 동적으로 할당된다.
참조하는 변수가 없으면 자바의 가비지 컬렉터가 제거한다. (가비지 컬렉터는 메모리의 힙 영역에 더 이상 사용하지 않는 객체를 제거하는 역할을 한다. -> 메모리 관리)
참조타입의 장점
int i = null; // 불가능
Integer integer = null; // 가능
2. 제네틱 타입에서 사용 가능 여부
기본타입은 제네릭 타입에서 사용할 수 없지만, 참조 타입은 가능하다.
List<i> list; // 불가능
List<Integer> list; // 가능
기본타입의 장점
참조 :