자바 메모리 구조
- 메서드 영역: 클래스 정보 보관
- 스택 영역: 실제 프로그램이 실행되는 영역
- 힙 영역: 객체(인스턴스)가 생성되는 영역 (new 키워드)
- 메서드 영역
- 클래스 정보
- static 변수들
- 상수 관리
- 스택 영역
- 지역 변수, 중간 연산 결과, 메서드 호출 정보 등
- 힙 영역
- 객체와 배열
- 가비지 컬렉션이 이뤄지는 영역
같은 클래스에서 생성된 객체여도 인스턴스 내부의 변수 값은 다를 수 있지만 메서드는 공통된 영역을 공유한다.
따라서 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.
멤버 변수(필드)의 종류
- 인스턴스 변수: static이 붙지 않은 멤버 변수
- 인스턴스를 만들 때 마다 새로 만들어진다.
- 클래스 변수: static이 붙은 멤버 변수
- 클래스 변수 = static 변수 = 정적 변수
- 메서드 영역의 static 영역에 존재한다.
- 인스턴스와 무관하게 클래스에 바로 접근해 사용할 수 있다.
- 자바 프로그램을 시작할 때 딱 1개 만들어지고 여러 곳에서 공유하는 목적으로 사용된다.
변수와 생명주기
- 지역 변수(매개변수 포함): 스택 영역의 스택 프레임 안에 보관
- 메서드가 종료되면 스택 프레임이 제거되면서 지역 변수도 함께 제거된다
- 생존 주기가 짧다
- 인스턴스 변수: 힙 영역 사용
- 가비지 컬렉션이 발생하기 전까지 생존한다.
- 클래스 변수: 메서드 영역의 static 영역에 보관
- 해당 클래스가 JVM에 로딩되는 순간 생성해 JVM이 종료될 때 제거
💡 지역 변수 < 인스턴스 변수 < 클래스 변수
멤버 메서드의 종류
- 인스턴스 메서드: static이 안붙은 멤버 메서드
- 클래스 메서드: static이 붙은 멤버 메서드
- 클래스 메서드는 인스턴스를 생성하지 않고 바로 호출 가능
- 정적 메서드 안 → 정적 변수, 정적 메서드에 접근 가능
- 정적 메서드 안 → 인스턴스 변수, 인스턴스 메서드에 접근하면 컴파일 오류
- 인스턴스 메서드 안 → 정적 메서드, 정적 변수, 인스턴스 메서드, 인스턴스 변수 모두 접근 가능
💡 정적 메서드는 클래스가 로딩되는 시점에 생성되는데, 인스턴스 멤버는 인스턴스를 생성한 후에 접근 가능하므로
정적 메서드에서는 인스턴스 멤버로 접근할 수 없는 것이다.
💡 main() 메서드도 정적 메서드라 객체를 생성하지 않아도 작동 될 수 있었다.
main() 이 호출하는 메서드에서도 정적 메서드로 선언해 사용한다.
참고) 김영한 - 실전 자바