🥞 BE
home

Java의 자료형 - 원시 타입, 참조 타입

Date
2024/04/16
Category
Programming Language
Tag
Java
Detail
Java Basic
자바에서 데이터 타입은 크게 두 가지로 나눌 수 있다. Primitive Type(원시 타입) 과 Reference Type(참조 타입) 이 그것이다.
원시 타입은 정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입이고,
int, long, double, float, boolean, byte, short, char
참조 타입은 객체(Object)를 참조(주소를 저장) 하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입이다.
Integer, Long, Double, Float, Boolean, Byte, Short, Char
최근 자바는 오토박싱, 언박싱이 잘 되어 있어, 원시 타입과 참조 타입을 코드 구현 상에서 같이 사용해도 큰 불편함이 없다.
int i = Integer.valueOf(1); Integer integer = i; // 오토박싱 언박싱이 되기 때문에, 이런식으로 사용해도 컴파일 오류가 발생하지 않는다.
Java
복사

Primitive type(원시 타입)

int, long, double, float, boolean, byte, short, char 총 8가지의 primitive type을 Java 에서 미리 정의하고 제공한다.
Java에서 기본 자료형은 반드시 사용하기 전에 선언(Declared) 되어야하며, 자료형의 길이는 운영체제에 독립적이며 변하지 않는다.
스택(stack) 메모리 에 저장된다.

Reference Type(참조 타입)

원시 타입을 제외한 타입들(문자열, 배열, 열거, 클래스, 인터페이스)을 말한다.
즉, 참조 타입(Reference type 은 Java에서 최상위 클래스인 java.lang.Object 클래스를 상속하는 모든 클래스들을 말한다.
Java에서 실제 객체는 힙(heap) 메모리에 저장되며 참조 타입 변수는 스택 메모리에 실제 객체들의 주소를 저장하여, 객체를 사용할 때마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.
이후 Garbage Collector가 돌면서 메모리를 해제한다.
힙 메모리에 생성된 인스턴스는 메소드나 각종 인터페이스에서 접근하기 위해 JVM의 Stack 영역에 존재하는 에 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링한다.

원시 타입 vs. 참조 타입

원시 타입과 참조 타입의 기능적 차이는 크게 2가지가 있다.
1.
Null을 담을 수 있는가?
원시 타입은 null을 담을 수 없다. 반면에 참조 타입은 null을 입력값으로 받을 수 있다.
int i = null; // 불가능 Integer integer = null; // 가능
Java
복사
2.
제네릭 타입에서 사용할 수 있는가?
원시 타입은 제네릭 타입에서 사용할 수 없다. 반면에 참조 타입은 제네릭 타입에서 사용할 수 있다.
List<int> i; // 불가능 List<Integer> integer; // 가능
Java
복사

성능

원시 타입은 스택 메모리에 존재하고, 참조 타입은 스택 메모리에는 참조 값만 있고, 실제 값은 힙 영역에 존재한다.
참조 타입은 최소 2번 메모리 접근을 해야하며, 일부 타입의 언박싱 과정을 거쳐야 하므로 원시 타입과 비교해 접근 속도가 느리다.

Reference