BACK/JAVA

[JAVA] 자바 메모리 구조와 static

연듀 2024. 5. 16. 21:58

자바 메모리 구조

 

  • 메서드 영역: 클래스 정보 보관
  • 스택 영역: 실제 프로그램이 실행되는 영역
  • 힙 영역: 객체(인스턴스가 생성되는 영역) (new 키워드)

 

메서드 영역

클래스 정보를 보관하는 영역

 

클래스 정보 - 클래스, 메서드 등의 실행 코드 

static 영역 - static 변수 보관

상수 풀 - 상수 관리

 

스택 영역

실제 프로그램이 실행되는 영역

 

지역 변수, 중간 연산 결과, 메서드 호출 정보 등

 

힙 영역

인스턴스가 생성되는 영역

 

객체 

배열

가비지 컬렉션이 이뤄지는 영역

 

 

같은 클래스에서 생성된 객체여도 인스턴스 내부 변수 값은 다를 수 있지만 메서드는 공통된 영역을 공유한다.

따라서 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.

 

멤버 변수(필드)의 종류

 

인스턴스 변수

static이 붙지 않은 멤버 변수

인스턴스를 만들 때마다 새로 만들어진다. 

 

클래스 변수 

static이 붙은 멤버 변수

클래스 변수 = static 변수 = 정적 변수

메서드 영역의 static 영역에 존재한다.

인스턴스와 무관하게 클래스에 바로 접근해 사용할 수 있다.

자바 프로그램을 시작할 때 딱 1개 만들어지고 여러 곳에서 공유하는 목적으로 사용된다. 

 

변수와 생명주기

 

지역 변수

스택 영역의 스택 프레임 안에 보관된다.

메서드가 종료되면 스택 프레임이 제거되면서 지역 변수도 함께 제거된다.

생존 주기가 짧다.

 

인스턴스 변수

힙 영역을 사용한다. 

가비지 컬렉션이 발생하기 전까지 생존한다. 

 

클래스 변수

메서드 영역의 static 영역에 보관된다.

해당 클래스가 JVM에 로딩되는 순간 생성해 종료될 때 제거된다.

 

 

지역 변수 < 인스턴스 변수 < 클래스 변수

 

 

 

멤버 메서드의 종류

 

인스턴스 메서드: static이 안붙은 멤버 메서드

 

클래스 메서드: static이 붙은 멤버 메서드, 인스턴스를 생성하지 않고 바로 호출 가능

 

정적 메서드: 정적 변수, 정적 메서드에 접근 가능. 정적 메서드에서 인스턴스 변수, 인스턴스 메서드에 접근하면 컴파일 오류

 

인스턴스 메서드: 정적 메서드, 정적 변수, 인스턴스 메서드, 인스턴스 변수 모두 접근이 가능

 

 

정적 메서드는 클래스가 로딩되는 시점에 생성되는데, 인스턴스 멤버는 인스턴스를 생성한 후에 접근 가능하므로

정적 메서드에서는 인스턴스 멤버로 접근할 수 없는 것이다.

 

main() 메서드도 정적 메서드라 객체를 생성하지 않아도 작동 될 수 있었다.

 

 

 

 

 

참고: 인프런 김영한 실전 자바 강의