본문 바로가기
Spring

[Spring] 원시 타입(Primitive Type) vs 참조 타입(Reference Type)

by dong_seok 2023. 8. 8.

이전시간에 User 엔티티를 만들때 PK를 Long 타입으로 선언하였습니다. 그리고  서치를 하면서 다른 사람들이 개발한 코드들을 볼때도 Long이나 Integer로 선언한 모습을 볼 수 있었습니다. 그러다 문득 궁금한 점이 생겼습니다. 왜 long이나 int가 아니라 Long이나 Integer을 사용하는 것일까? 차이가 있는 것일까? 라는 생각이 들어서 알아보고자 하였습니다.

 

 

먼저 자바에서 데이터 타입은 크게 두 가지 원시 타입(Primitive Type) 참조타입(Reference Type)로 나뉘게 됩니다.

원시 타입은 정수, 실수, 문자, 논리 리터럴등의 실제 데이터 값을 저장하는 타입을 말합니다.

참조 타입은 원시 타입 이외의 모든 타입을 말하며 값이 저장되어 있는 곳의 주소값을 저장하는 타입으로 메모리 번지 값을 통해 객체를 참조합니다.

 

차이점

1. 원시 타입(Primitive Type)

기본 값을 가지고 있기 때문에 null이 될 수 없습니다

(기본형 타입에 null을 넣고싶다면 Wrapper 클래스 활용 ex)int->Integer )

스택(Stack) 메모리에 저장됩니다.

제너릭 타입에서 사용할 수 없습니다.

 

2. 참조타입(Reference Type)

빈 객체를 의미하는 null 이 존재합니다(기본 값이 null)

힙(Heap) 메모리에 저장됩니다.

제너릭 타입에서 사용할 수 있습니다.

 

Stack vs Heap

1. 정적 메모리 Stack 영역

  Stack 영역에는 기본타입 변수가 할당되고, 변수의 실제 값들이 저장됩니다.

  참조타입 변수들이 Heap 영역에 생성된 객체의 주소 값을 저장하는 공간입니다.

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

 

2. 동적 메모리 Heap 영역

  Heap 영역에는 객체와 배열이 생성됩니다.

  기본타입 변수들과는 다르게 크기가 정해져 있지 않습니다.

  프로그램 실행시 메모리에 동적으로 할당됩니다.

  참조하는 변수가 없으면 java 의 Garbage Collector 가 제거합니다.

 

*참고*

reference type의 경우 Stack 메모리에는 참조값만 있고, 실제값은 Heap 메모리에 존재합니다. 따라서 값을 필요로 할 때마다 Unboxing 과정을 거쳐야 하니, primitive type와 비교해서 접근 속도가 느려지게 됩니다.

 

 

결론

Wrapper Class 를 사용함으로써 기본형 타입에 Null을 대입해놓을 수 있는데, nullPointException이 발생할 가능성이 있지만 명시적으로는 PK가 아직 할당되지 않았음을 의미할수 있습니다. 또한 데이터를 수치상으로 볼땐 원시 타입은 기본 값이 0이라서 변수의 값이 실제로 0인건지 아니면 없어서 0인건지 구분하기 힘들다는 단점이 있습니다. 하지만 Wrapper Class의 경우 값이 없으면 null로 표시되기 때문에 훨씬 보기 편하다고 할 수 있습니다.

 

 

'Spring' 카테고리의 다른 글

[Spring] 회원가입(2)  (0) 2023.08.06
[Spring] 회원가입(1)  (0) 2023.08.06
[Spring] 개발환경  (0) 2023.08.05

댓글