본문 바로가기
Java/About Java

[Java] Primitive Type & Reference Type

by seaweed_one 2023. 1. 9.
728x90

안녕하세요. 씨위드입니다.
오늘은 자바의 데이터 타입에 대하여 포스팅해보려고 합니다.
Java의 데이터 타입은 크게 기본타입(Primitive Type)과 참조타입(Reference Type)으로 나눌 수 있습니다.
각각의 특징과 차이점에 대하여 알아보겠습니다.

Primitive Type

기본 타입은 실제 데이터 값을 저장하는 타입입니다.
다른 이름으로는 원시타입이라고도 부르는데요.
정수, 실수, 문자, 논리, 리터럴을 저장하며 기본타입의 자료형은 아래와 같이 나눌 수 있습니다.

문자 char
정수 byte, int, short, long
실수 float, double
논리 boolean
리터럴 데이터 그 자체의 값 즉 소스 코드 내에 직접 입력된 데이터를 의미

직접 데이터 값을 저장하기 때문에 변수마다 사용 가능한 값의 범위가 존재합니다.
예를 들어 byte는 1byte(8bit)의 크기를 갖습니다.
이 범위를 넘어가게 되면 overFlow 현상이 발생하는데 500ml 물컵에 600ml의 물을 담으면 흘러넘치는 것으로 이해하시면 쉽습니다.

위 자료형들의 한 가지 공통점을 발견하셨나요?
그렇다면 여러분은 천재십니다 ^ㅇ^
기본형 변수는 소문자로 시작한다는 특징을 가집니다.

Reference Type

참조타입은 객체의 주소를 참조하는 타입으로 배열, 리스트 클래스, 인터페이스 타입을 말합니다.
기본 타입을 제외한 타입을 말한다고 생각하시면 이해가 더 쉬우실 겁니다.
기본타입의 변수는 실제 값을 변수에 저장하지만 참조 타입은 메모리 주소값을 값으로 갖게 됩니다.
주소를 통해 객체를 참조한다는 의미에서 참조타입이라는 이름을 갖게 된 것이죠.

Primitive Type vs Reference Type

생성 및 저장 위치

기본타입과 참조타입의 다른 점은 저장되는 값, 데이터 생성 및 저장 위치에 차이가 있습니다.
앞서 기본타입의 객체는 실제 값을 가지고 있다고 말씀드렸죠?
반면 참조타입의 객체는 실제 데이터는 힙영역에 참초타입 변수는 스택영역에서 실제 객체의 주소를 저장합니다.
해서 객체 사용시마다 스택 영역에서 객체의 주소를 불러와 사용하게 됩니다.

와닿지 않으시는 분들도 계시죠?
괜찮아요! 저 역시 처음에는 와닿지 않았습니다.
조금 더 덧붙이자면 JVM에 대한 포스팅에서 각 데이터 타입이 생성되는 메모리 영역을 설명한 적이 있었죠?
그때 간단하게 언급하고 넘어갔지만 기본타입의 객체는 정적 영역인 스택 영역에, 참조 타입의 객체는 동적 영역인 힙 영역에 생성됩니다.
지난 포스팅을 읽지 못하신 분들은 아래 포스팅을 참고해 주세요.

 

Java Memory

이번 포스팅에서는 자바의 메모리 영역에 대하여 알아보겠습니다. 본격적으로 알아보기에 앞서 왜 메모리 영역을 알아야 하는 걸까요? 자바에는 가비지 컬렉터(Garbage Collector)가 존재하여 사용

seaweed-one.tistory.com


만약 우리가 아래와 같은 객체를 생성했다고 가정해 봅시다.

String user = “seaweed”;


힙 영역에는 주소1111 라는 곳에 “seaweed”라는 객체가 생성됩니다.
그럼 우리가 생성한 String user라는 객체는 어디에 생성될까요?
바로 스택 영역에 생성됩니다.
user라는 객체는 아래와 같은 값을 가지고 있겠죠?
String user = 주소 1111
보기 쉽게 표현하자면 아래와 같을 것입니다.

Stack Memory Heap Memory
String user = 주소1111 주소1111 = “seaweed”

null

먼저 기본타입은 null을 담을 수 없습니다.
아래와 같은 코드를 작성해 보세요. 에러가 발생할 것입니다.

int num = null;

그러면 이번엔 아래와 같이 입력해 보세요.

Integer num = null;

에러가 발생하지 않을 것입니다.

제네릭

기본 타입은 제네릭을 사용할 수 없습니다.
아래와 같은 객체 생성이 가능할까요?

Set<int> seaweed = new HashSet<>();

 

의식하지 못하시더라도 여러분은 아래와 같은 형식으로 객체를 생성해 사용하셨을 것입니다.

Set<Integer> seaweed = new HashSet<>();

객체의 크기

객체의 크기에도 차이가 있습니다.
기본타입의 객체는 담을 수 있는 값의 크기가 정해져 있다고 말씀드렸었죠?
참조타입은 기본타입 변수들과는 다르게 크기가 정해져 있지 않습니다.
프로그램 실행 시에 동적으로 할당되죠.
더 이상 참조하는 변수가 없다면 GC에 의해 삭제되게 됩니다.
자세한 내용은 위에 첨부한 포스팅을 참고해 주세요.

접근 속도 및 메모리

기본타입이 참조타입에 비해 접근 속도가 빠르고 메모리도 적게 사용합니다.
이유는 여러분도 예상하셨겠지만 기본타입 객체는 직접 값을 가지고 있기에 상대적으로 빠릅니다.
하지만 참조타입은 스택메모리에는 참조값만 존재하고 실제 데이터는 힙 메모리에 존재하기 때문에 접근 속도가 상대적으로 느립니다.
사용하는 메모리의 양도 참조타입이 더 높습니다.
따라서 특별한 이유가 없다면 참조타입보다는 원시타입의 객체를 사용하는 것이 더 합리적이겠죠?

여기까지 자바의 객체 타입에 대하여 알아보았습니다!
혹시 궁금하신 점이나 추가되었으면 좋겠다는 내용이 있으시다면 댓글 남겨주세요.
긴 글 읽으시느라 고생하셨습니다!

728x90

'Java > About Java' 카테고리의 다른 글

[Java] 생성자  (2) 2023.01.31
[Java] Java Memory Leak  (0) 2023.01.11
[Java] JNA? JNI?  (0) 2023.01.04
[Java] Java Memory  (1) 2022.12.28
[Java] JDK, JVM, JRE  (0) 2022.12.27