기본자료형과 참조자료형의 차이점 ?

2022. 11. 11. 17:29자바멘토링/자바의 신 1~7강 질문리스트 정리

ex1) 

Char v1 ='A';
if(v1=='A'){

int v2 = 100;
double vs = 3.14;
}
boolean v4 = true;

기본자료형은 직접 값을 가지고 있다 (stack)하지만 참조자료변수는 직접값을 가지고 있지 않는다 주소값을 참조하고  변지수를 가지고 있다.

 

 

ex2)

int[] scores ={10,20,30};
  1. -{10,20,30}값을 가지고 있는 배열 객체를 scores가 참조한다
  2. -배열은 힙 영역에 생성된다 
  3. -배열의 생성번지 (주소값)을 참조 
  4. -최종적으로 변수에 참조주소가 저장된다.

 

ex3)

String name1= new String("신용권");

 

클래스 타입 = 참조변수 

 

스트링 객체를 만들고 new를 하면 그 객체가 만들어진다 new는 객체생성 연산자 이다 .

 

 

기본 자료형(Primitive Data Type)

자바 컴파일러에 의해 해석되는 자료형태를 기본 자료형이라고 한다.

 

자료형의 종류에 따라 크기가 달라진다.

 

[특징]

  • 총 8가지의 기본형을 미리 정의하고 제공한다.
  • 기본 자료형은 반드시 사용하기 전에 선언(Declared)되야 한다.
  • OS(운영체제)에 따라 자료형의 길이가 변하지 않는다.
  • 비객체 타입이다. 따라서, null 값을 가질 수 없다.
    만약 기본형에 null을 넣고 싶다면, Wrapper Class를 활용해야 한다.
  • 스택(Stack) 메모리에 저장된다.

 

 

참조자료형(Reference Data Type)

JAVA에서 기본형(Primitive type)을 제외한 타입들이 모두 참조형(Reference type) 이다.

참조형(Reference type)은 JAVA에서 최상인 java.lang.Object클래스를 상속하는 모든 클래스들을 말한다.

 

원본 데이터의 주소 (참조값만) 가지고 있기에 모든 참조자료형의 크기는 같다 .

JVM에서는 8Byte를 할당한다.

 

 

클래스 타입(class type), 인터페이스 타입(interface type), 배열 타입(array type), 열거 타입(enum type) 이 있다.

 

 

 

[특징]

  • 빈 객체를 의미하는 Null이 존재한다.
  • 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다.
    • 예) 객체나 배열을 Null 값으로 받으면 NullPointException이 발생하므로 변수 값을 넣어야 한다.
  • new로 인하여 생성하는 것들은 메모리 영역인 Heap 영역에 생성을 하게되고, Garbage Collector가 돌면서 메모리를 해제한다.
  • Heap 메모리에 생성된 인스턴스는 메소드나 각종 인터페이스에서 접근하기 위해 JVM의 Stack 영역에 존재하는 Frame에 일종의 포인터(C의 포인터와는 다르다)인 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링한다.


객체 자료형은 보통 필요에 의해서 새롭게 만들어 사용하는 클래스나 기본적으로 자바가 제공해주는 클래스모두를 포함한다.

 

Object에는 무엇이 있고 기본자료형은 Object에 속하는가?

 

기본 자료형들은 각각, 그것들을 참조자료형을 사용하기 위한 Wrapper class 가 존재한다.

 

- 참조자료형 Reference Type

기본자료형이 아닌 모든 자료형이 참조자료형이다.
참조자료형은 인스턴스 자료형을 가리킬 수 있는 자료형이고, 최상위 클래스인 Object를 상속받고 있다.

- Wrapper class

래퍼 클래스는 기본자료형을 참조자료형처럼 사용할 수 있게 감싸주는 클래스들이다. 모든 기본자료형에 대한 래퍼클래스가 있다.
래퍼 클래스는 String처럼 불변성을 가지고 있다.
(래퍼 클래스 안에 있는 값을 변경할 수 없다. => 상식적으로도 전세계 모든 이들이 약속하고 공통으로 사용되는 문자를 사용하는 방식이라던가, 숫자를 사용하는 방식이 개인적으로 커스텀이 가능하다면 그것은 정말 이상할 것이다.)

Primitive TypeWrapper class

byte Byte
short Short
int Integer
long Long
double Double
char Character
float Float
boolean Boolean

래퍼 클래스는 왜 존재하는 것일까 ?

먼저, 기본자료형과 참조자료형의 차이를 알고 나면 래퍼 클래스를 사용하는 이유 또한 자연스럽게 알 수 있을 것이다.

- 기본자료형과 참조자료형의 차이.

  1. 참조자료형은 Object class 를 상속받는 "객체"이다.
  2. 기본자료형은 메모리값이 정해져 있고 참조자료형은 사용하는 것에 따라 할당해야하는 메모리의 크기가 달라진다.
  3. 기본자료형은 null을 허용하지 않지만, 참조자료형의 기본 값은 null로, null을 허용한다.
  4. 수로 되어 있는 기본자료형(정수형 또는 실수형)같은 경우, 산술연산이(+-/* .. ) 가능하지만, 참조자료형은(=> 정수형 또는 실수형의 래퍼클래스 ) 불가능하다.
  5. 기본자료형은 보통 클래스의 변수로 선언되어 인스턴스 안에 포함되거나 , 모두 스택영역에 저장되지만 참조자료형은 객체이므로 힙(Heap)메모리에 저장된다.

 

- 래퍼 클래스가 필요한 순간.

  1. 객체 타입으로 저장해야할 때.
  2. 매개변수로 객체를 받아야할 때,
  3. 객체를 비교해야할 때.
  4. null 값을 허용해주어야할 때.
  5. 제너릭에 사용하고 싶을 때. (=> 제너릭<> 에는 객체(class)을 담을 수 있기때문에 객체가 아닌 기본자료형은 사용할 수 없다.)
  6. 정수 <-> 문자 .. 등 변환이 필요할 때.

 

- 박싱과 언박싱 Boxing , Unboxing

말 그대로 기본자료형을 래퍼 클래스로 감싸줄때에는 boxing이라고 표현하고 , 반대의 경우 unboxing 이라고 표현한다.
주로 위에서 언급한 상황들에서 기본자료형들을 boxing 하여 래퍼클래스를 만들어준다.

int primitiveInt = 10;
Integer wrapperInt1 = new Integer(10); //int -> Integer boxing 방법 1. 
Integer wrapperInt2 = Integer.valueOf(10); //int -> Integer boxing 방법 2.
primitiveInt = wrapperInt1.IntValue;  // Integer -> int unboxing. 
primitiveInt = wrapperInt1; //JDK 1.5 이후부터 자바에서 자동으로 언박싱을 해준다.


+) 변수의 자료형은 기본자료형으로 선언하고 값을 사용하거나 내려줄 때만 boxing 해서 사용해도 된다.

위에서 언급했듯 자바에서 모든 객체는 힙(Heap)영역에 저장 되고 기본 자료형은 스택(STACK)영역에 저장된다.

저장되는 영역이 다른데, 일반적으로 힙에서 데이터를 불러올 때보다 스택에서 불러오는 것이 속도가 빠르기 때문에 꼭 객체여야 할 필요가 없으면 기본자료형을 사용해서 속도를 향상시키는

 

'자바멘토링 > 자바의 신 1~7강 질문리스트 정리' 카테고리의 다른 글

object는 무엇인가?  (0) 2022.11.11
jvm 실행 동작 과정  (0) 2022.11.08