본문 바로가기

JAVA

[JAVA] 기본형과 참조형에 대해 알아보자!

요약

여러분은 혹시 누군에게 자바에서 기본형과 참조형이 무엇인지와 그에 대한 차이를 설명해주세요라는 질문을 받으면 어떻게 답변하실 건가요?
혹시 이렇게 답변할 수 있으시다면 이글을 읽지 않으셔도 됩니다!

자바에서 제공하는 기본형 타입은 총 8가지가 (byte,short,int,long,float,double,char,boolean) 있습니다. 
기본형 변수는 메모리의 스택 영역에 할당되며, 값이 저장될때 해당 메모리 위치에 직접 저장됩니다.
참조형 타입에는 클래스,인터페이스,배열 등이 있습니다. 참조형 변수는 메모리의 스택 영역에 할당되며, 객체는 힙 영역에 할당됩니다. 
이때 참조형 변수는 힙 영역에 저장된 객체의 주소를 가리키고 있습니다.

변수란 무엇일까요??

변수란 데이터를 저장하기 위해 프로그램에 의해 할당받은 메모리 공간을 뜻합니다

그리고 자바에서 말하는 자료형이란, 변수에 적재할 데이터가 메모리에 어떻게 저장되고 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 키워드입니다.

이러한 자료형은 크게 기본형 타입참조형 타입으로 구분됩니다!

기본형(primitive type) : 계산을 위해 실제 값을 직접 저장. 자바에서는 8개의 기본형 데이터 타입이 존재

참조형(reference type) : 메모리에 저장된 객체의 주소를 저장. 참조형 데이터 타입의 예로는 클래스, 인터페이스, 배열 등이 있음


기본형 변수

int number = 1;
double price = 100.5
char alphabet = 'A';

기본형 타입에는 크게 논리형(boolean), 문자형(char), 정수형(byte, short,int, long), 실수형(float,double)로 나뉩니다.

기본형 타입은 다음과 같은 특징을 가집니다

  • 모두 소문자로 시작됨
  • 비객체 타입이여서 null을 가질 수 없고, 기본값이 정해져 있음
  • 변수 선언과 동시에 메모리 생성
  • 저장 공간에 실제 자료 값을 가짐
  • 기본형 변수는 메모리의 스택 영역에 할당되며, 값이 할당될 때 해당 메모리 위치에 직접 저장됨


참조형 변수

String name = "이순신"

RepositoryIF repository = new MySqlRepository();

Date date = new Date();

참조형 타입은 간단히 말하자면, 위의 primitive type을 제외한 나머지라고 보시면 됩니다.

기본적으로 제공하는 클래스, 개발자가 직접 구현한 클래스 및 인터페이스, 배열, 열거 타입 등을 참조형이라고 부릅니다!

참조형 변수는 다음과 같은 특징을 가집니다.

  • 기본형 과는 달리 실제 값이 저장되지 않고, 자료가 저장된 공간의 주소를 저장 합니다.
  • 즉 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져옴
  • 메모리의 에 실제 값을 저장하고, 그 참조값을 갖는 변수는 스택에 저장
  • null로 초기화 가능

객체의 주소를 저장하는 참조형에는 일반적으로 4byte가 할당됩니다!(64bit 시스템에서는 상황에 따라 다를 수 있다.)


기본형과 참조형의 주요 차이점

  1. 저장되는 값 : 기본형은 실제 값을 저장하고, 참조형은 객체의 메모리 주소를 저장합니다.
  2. 메모리 사용 방식 : 기본형은 스택 영역에 할당되고, 참조형은 스택 영역에 참조(Memory Address)가 할당되고 객체는 힙 영역에 할당됩니다.
  3. 할당 방식 : 기본형은 값을 직접 할당하고, 참조형은 new라는 키워드를 사용하여 객체를 생성한 후 그 주소를 할당합니다.
  4. 비교 방식 : 기본형 변수는 == 연산자를 사용하여 값 자체를 비교할 수 있지만, 참조형 변수는 == 연산자를 사용하면 객체의 주소를 비교하게 됩니다. 따라서 참조형 변수에서 값 자체를 비교할려면 equals()메서드를 사용해야 합니다.

근데 한가지 의문점이 있습니다

Integer number = 1;

기본형 값을 참조형 변수에 담는 것이 어떻게 가능할까요??
이는 후에 AutoBoxingAutoUnBoxing에 대해 다루면서 자세히 설명드리겠습니다!


참고

https://velog.io/@yh20studio/Java-%EA%B8%B0%EB%B3%B8%ED%98%95-%EB%B3%80%EC%88%98%EC%99%80-%EC%B0%B8%EC%A1%B0%ED%98%95-%EB%B3%80%EC%88%98
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EB%B3%80%EC%88%98%EC%9D%98-%EA%B8%B0%EB%B3%B8%ED%98%95-%EC%B0%B8%EC%A1%B0%ED%98%95-%ED%83%80%EC%9E%85