자바 메모리 구조와 static

상훈·2024년 5월 22일

자바 메모리 구조

자바의 메모리 구조 크게 다음과 같이 3가지로 나눌 수 있다

  • 메서드 영역: 클래스 정보를 보관
  • 스택 영역: 실제 프로그램이 실행되는 영역. 메서드를 실행할 때마다 하나씩 쌓임
  • 힙 영역: 객체(인스턴스)가 생성되는 영역. new 명령어를 사용하면 이 영역을 사용

메서드 영역

프로그램을 실행하는데 필요한 공토 데이터를 관리. 이 영역은 프로그램의 모든 영역에서 공유

  • 클래스 정보 : 클래스의 실행 코드, 필드, 메서드와 생성자 코드 등 모든 실행 코드가 존재
  • static 영역 : static 변수들을 보관
  • 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관

스택 영역

자바 실행 시, 하나의 실행 스택이 생성. 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함

  • 스택 프레임: 메서드를 호출할 때마다 하나의 스택 프레임으로 스택 영역에 쌓이며, 메서드가 종료되면 제거 됨

  • 스택 영역은 각 쓰레드 수만큼 스택 영역이 생성됨

힙 영역

  • 객체(인스턴스)와 배열이 생성되는 영역. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거됨

자바에서 특정 클래스로 인스턴스를 생성하면 힙 메모리에 생성한 수만큼의 인스턴스가 생기지만 내부의 메서드는 프로그램 동작 시점에서 이미 메서드 영역에서 메모리를 할당하고 있으므로 메서드에 대한 새로운 메모리 할당은 없음

스택 영역

  • 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매게변수 포함)를 관리
  • 메서드를 계속 호출하면 스택 프레임에 계속 쌓임
  • 지역 변수는 스택 영역에서 관리
  • 스택 프레임이 종료되면 지역 변수도 함께 제거
  • 스택 프레임이 모두 제거되면 프로그램도 종료

여러 메서드를 계속해서 호출하는 경우, 먼저 호출한 메서드부터 스택 영역에 쌓인다.(이때 메서드는 메서드 영역에서 가져옴) 이후 메서드 내부에서 다른 메서드를 호출한다면 새로 호출한 메서드가 스택 프레임으로 호출 시 넘겨 받은 매게 변수와 함께 스택 프레임으로 스택 영역에 추가된다. 이후 해당 메서드 내부에서 생성한 인스턴스는 힙 영역으로 넘어가서 관리되게 된다. 스택 프레임이 제거 될 때 매게 변수 또한 사라지며 이후 힙 영역에서 관리하던 인스턴스를 참조하는 곳이 없다면 GC의 대상이 되어 사라지게 된다.

Static

Static 변수

static 변수는 정적 변수, 또는 다른 말로 클래스 변수라고 한다.

즉 인스턴스 생성과 별개로 클래스 자체의 변수로, 클래스를 통해서 호출할 수 있는 변수이다. 이로인해 다양한 인스턴스에서 해당 변수를 공용으로 사용할 수 있다.

사용할 때는 인스턴스명.static 변수명, 클래스명.static 변수명 두 가지 방식으로 호출하여 사용할 수 있지만 인스턴스명.static 변수명로 호출할 경우 클래스 변수인지 한 번에 알아보기 어렵기 때문에 관례적은 클래스명.static 변수명 방식을 사용한다.

멤버 변수(필드)의 종류

  • 인스턴스 변수: static이 붙지 않은 멤버 변수

static 이 붙지 않은 멤버 변수는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라 서 인스턴스 변수라 한다.
인스턴스 변수는 인스턴스를 만들 때 마다 새로 만들어진다.

  • 클래스 변수: static이 붙은 멤버 변수

​ 클래스 변수, 정적 변수, static 변수등으로 부른다.

static 이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 변수라 한다.
클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다. 인스턴스와는 다르게 보통 여러곳에서 공 유하는 목적으로 사용

변수와 생명주기

  • 지역 변수(매개변수 포함): 지역 변수는 스택 영역에 있는 스택 프레임 안에 보관된다. 메서드가 종료되면 스택 프 레임도 제거 되는데 이때 해당 스택 프레임에 포함된 지역 변수도 함께 제거된다. 따라서 지역 변수는 생존 주기가 짧다.
  • 인스턴스 변수: 인스턴스에 있는 멤버 변수를 인스턴스 변수라 한다. 인스턴스 변수는 힙 영역을 사용한다. 힙 영 역은 GC(가비지 컬렉션)가 발생하기 전까지는 생존하기 때문에 보통 지역 변수보다 생존 주기가 길다.
  • 클래스 변수: 클래스 변수는 메서드 영역의 static 영역에 보관되는 변수이다. 메서드 영역은 프로그램 전체에서 사용하는 공용 공간이다. 클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성된다. 그리고 JVM이 종료될 때 까지 생명주기가 이어진다. 따라서 가장 긴 생명주기를 가진다.

Static 메서드

정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.

  • 정적 메서드 사용법
    • static 메서드는 static 만 사용할 수 있다.
      • 클래스 내부의 기능을 사용할 때, 정적 메서드는 static 이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.
      • 클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
    • 반대로 모든 곳에서 static 을 호출할 수 있다.
      • 정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static 을 호 출할 수 있다.

멤버 메서드의 종류

  • 인스턴스 메서드: static 이 붙지 않은 멤버 메서드
  • 클래스 메서드: static 이 붙은 멤버 메서드
  • 클래스 메서드, 정적 메서드, static 메서드등으로 부른다.

클래스를 통한 접근 DecoData.staticCall()

  • 정적 메서드는 클래스에서 공용으로 관리하기 때문에 클래스를 통해서 접근하는 것이 더 명확하다. 따라서 정적 메서드 에 접근할 때는 클래스를 통해서 접근하자.
profile
문송 개발자

0개의 댓글