개발/자바

자바의 데이터 타입과 메모리 영역

대왕판다 2023. 1. 3. 11:30

자바 원시타입, 참조타입(Primitive type, Reference type)

데이터 타입이란, 해당 데이터가 어떻게 메모리에 저장되고 프로그램에서 어떻게 처리되어야 하는지 명시적으로 알려주는 것이다.

자바에서는 크게 기본형타입과 참조형 타입이 있다.

원시 타입(Primitive Type)

  • 논리형 boolean, 정수형 byte, int, short, long, 실수형 float, double, 문자형 char 이 있다.
  • 8가지 기본형 타입을 미리 정의하여 제공한다.
  • 기본값이 있기 때문에 Null이 존재하지 않는다. 기본형 타입에 Null을 넣고싶다면 래퍼 클래스를 활용한다.
  • 실제 값을 저장하는 공간으로 스택 메모리에 저장된다.
  • 담을수있는 크기를 벗어나면 컴파일 에러가 발생한다.

 

참조 타입(Reference Type)

  • 배열 Array, 열거 Enumeration, 클래스 Class, 인터페이스 Interface가 이에 해당한다
  • 기본형 타입을 제외한 타입들은 모두 참조형 타입이다.
  • 값이 저장되어있는 곳의 주소값을 저장하는 공간으로 힙 메모리에 저장된다.
  • 컴파일 시점에 에러가 없지만, 객체나 배열을 Null 값으로 받았을 경우 NullPointException이 발생한다.

 

 

스택(Stack)/힙(Heap) 영역

정적 메모리 스택(Stack) 영역

  • 힙 영역에 생성된 객체(Object) 타입의 데이터 참조값이 할당된다.
  • 원시타입의 데이터가 값과 함께 할당된다.- 참조값이 아닌 실제 값을 스택에 저장한다.
  • 각 쓰레드는 자신만의 스택을 가진다.
  • 객체 안 메서드 작업이 종료되면 할당된 메모리 공간은 반환되어 비어진다.
    • 함수가 종료된 경우 내부에 선언된 지역변수들은 Stack에서 pop 되어 사라진다.

 

동적 메모리 힙(Heap) 영역

  • 주로 긴 생명주기를 가지는 데이터들이 저장된다.
  • 스택에 있는 데이터를 제외한 부분이라 보면 된다.
  • 모든 Object 타입(Integer, Sring, ArrayList...) 등이 힙에 생성된다.
  • 쓰레드 개수와 상관없이 힙 영역은 단 하남나 존재한다.
  • 힙 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 스택에 올라간다.
// 힙 메모리 예시를 위한 코드
public class Main {
   public static void main(String[] args) {
       int port = 4000;
       String host = "localhost";
  }
}

1. 위 클래스에서 port 는 원시타입(int)에 해당하기에 port = 4000 이 스택 영역에 등록된다.

2. host는 참조타입(String)으로 String 'localhost'는 힙 영역에 등록되고

  1. String 은 Objec를 상속받아 구현된다. Object 타입은 최상위 부모클래스고, 다형성에 의해 Object 타입으로 레퍼런스가 가능하다.

3. 스택에서 host라는 이름으로 생성된 변수가 힙 영역의 String 'localhost'를 레퍼런스한다.