본문 바로가기
프로그래밍/java

[Java] 데이터 타입과 메모리 영역

by 혀끄니 2023. 12. 11.
728x90

데이터 타입의 분류

  • 프로그램은 자료구조(데이터)와 알고리즘의 결함으로 이루어져 있다.
  • 즉 프로그램이란 자료구조를 통해 데이터를 구성하고, 표현하며 알고리즘을 통해 문제를 해결

 

  • 데이터 타입에는 크게 기본타입(primitive type)과 참조타입(reference type)으로 분류
  • 기본타입은 정수, 실수, 문자, 논리 리터럴을 지정
  • 참조타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스 인터페이스 타입

기본타입(Primitive type)

  • java에서 기본 데이터 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입
  • 정수 타입에는 byte, char, short, int, long / 실수 타입에는 float, double / 논리 타입에는 boolean

 

오버플로우(overflow)현상

  • 변수가 사용할 수 있는 값의 범위를 초과하게 되면 오버플로우(overflow)현상이 발생
  • 아래 그림을 보면 byte변수에 127의 값이 넣어져있다. 거기서 1을 더 하면 128이 되어야 하지만 오버플로우가 발생하면서 -128이 된다. 값의 범위가 -128 ~ 127인데 128은 범위에 초과 되기 때문에 -128이 된 것이다.

 

참조타입(Reference type)

  • java에서 참조타입(reference type)이란 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말한다.
  • 기본타입과 참조타입의 차이는 저장되는 값이 무엇인가?

- 기본타입실제 값을 변수에 저장

- 참조타입은 선언된 변수를 메모리에 번지 값으로 갖게 된다.

  • 기본 데이터 타입스택영역에 생성 / 참조 데이터 타입힙영역에 생성

메모리 사용 영역

  • 프로그램(java.exe)을 실행하면 JVM(Java Virtual Machine)이 실행이 된다.
  • JVM은 운영체제에서 할당받은 메모리영역(Runtime Data Area)을 메소드영역(Method Area), 스레드영역(Thread Area), 힙영역(Heap Area)과 같이 세부 영역으로 구분을 해서 사용

 

메소드 영역(Method Area)

  • 메소드영역은 코드에서 사용되는 클래스들을 class load로 읽어 클래스 별로 런타임 상수 풀, 필드 / 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장
  • 메소드 영역은 JVM이 시작될 때 생성되고 모든 스레드가 공유하는 영역

힙영역(Heap Area)

  • 힙영역은 객체와 배열이 생성되는 영역
  • 힙영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
  • 참조하는 변수나 필드가없다면 의미없는 개체가 되기 때문에 이것을 쓰레기 취급하고 JVM은 Garbage Collector를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거

JVM 스택영역(Stack Area)

  • JVM 스택영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당
  • 자바 프로그램에서 추가적으로 스레드를 생성하지 않는다면 main 스레드만 존재하므로 JVM 스택도 하나
  • JVM 스택은 메소드를 호출할때 마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행
  • 프레임 내부에는 로컬 변수 스택이 있는데 기본 타입변수와 참조 타입변수가 추가되거나 제거
  • 변수는 선언된 블록안에서만 스택으로 존재하고, 블록을 벗어나면 스택을 제거
  • 이는 메소드 if문,for문등에서 내부에서 생성된 변수는 해당 로컬 변수 스택에만 존재하여 구문을 빠져 나오게 되면 제거가 되어 외부에서는 사용이 불가능 하다는것을 말한다.
  • 다만 배열 같은 경우에는 배열의 변수는 스택영역에 생성되지만 배열의 데이터 자체는 Heap영역에 생성되어 제거되지 않는다. 즉 Java에서는 배열은 객체로 취급을 한다.
728x90

'프로그래밍 > java' 카테고리의 다른 글

[Java] 의존성(Dependency)  (0) 2023.12.13
[Java] Reflection  (0) 2023.12.12
[Java] ==, equals() 차이점  (0) 2023.12.08
[Java] 얕은복사 VS 깊은복사  (0) 2023.12.07
[Java] 파일 ZIP압축  (0) 2023.12.06