카테고리 없음

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

연듀 2024. 1. 30. 15:46

자바 메모리 구조

 

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

 

 

  • 메서드 영역
    • 클래스 정보
    • static 변수들
    • 상수 관리
  • 스택 영역
    • 지역 변수, 중간 연산 결과, 메서드 호출 정보 등
  • 힙 영역
    • 객체와 배열
    • 가비지 컬렉션이 이뤄지는 영역

 

 

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

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

 

 

멤버 변수(필드)의 종류

  • 인스턴스 변수: static이 붙지 않은 멤버 변수
    • 인스턴스를 만들 때 마다 새로 만들어진다.
  • 클래스 변수: static이 붙은 멤버 변수
    • 클래스 변수 = static 변수 = 정적 변수
    • 메서드 영역의 static 영역에 존재한다.
    • 인스턴스와 무관하게 클래스에 바로 접근해 사용할 수 있다.
    • 자바 프로그램을 시작할 때 딱 1개 만들어지고 여러 곳에서 공유하는 목적으로 사용된다.

 

 

변수와 생명주기

  • 지역 변수(매개변수 포함): 스택 영역의 스택 프레임 안에 보관
    • 메서드가 종료되면 스택 프레임이 제거되면서 지역 변수도 함께 제거된다
    • 생존 주기가 짧다
  • 인스턴스 변수: 힙 영역 사용
    • 가비지 컬렉션이 발생하기 전까지 생존한다.
  • 클래스 변수: 메서드 영역의 static 영역에 보관
    • 해당 클래스가 JVM에 로딩되는 순간 생성해 JVM이 종료될 때 제거

 

 

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

 

 

멤버 메서드의 종류

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

 

  • 정적 메서드 안 → 정적 변수, 정적 메서드에 접근 가능
  • 정적 메서드 안 → 인스턴스 변수, 인스턴스 메서드에 접근하면 컴파일 오류
  • 인스턴스 메서드 안 → 정적 메서드, 정적 변수, 인스턴스 메서드, 인스턴스 변수 모두 접근 가능

 

 

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

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

 

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

     main() 이 호출하는 메서드에서도 정적 메서드로 선언해 사용한다.

 

 

 

 

참고) 김영한 - 실전 자바

https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard