Java | 자바 메모리 구조와 static

Lumpen·2025년 4월 7일
0

Java

목록 보기
10/38

자바의 메모리 구조

  • 스택 영역: 지역 변수, 메소드 호출정보 (실제 프로그램이 실행되는 영역)
  • 힙 영역: 객체, 인스턴스 변수, 배열
  • 메서드 영역: 클래스 변수, 상수, 메소드 코드(Metaspace)

메서드 영역

프로그램을 실행하는데 필요한 공통 데이터 관리 - 모든 영역에서 공유

  • 클래스 정보: 클래스의 실행 코드(바이트 코드), 필드, 메서드, 생성자 등 모든 실행 코드가 존재한다
  • static 영역: static 변수들을 보관한다
  • 런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다 (프로그램에 "hello" 라는 문자 리터럴이 있을 때 이런 문자들을 공통으로 관리, 프로그램 상수들 관리)

스택 영역

자바 실핼 시 하나의 실행 스택이 생성된다
각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다

  • 스택 프레임: 스택 영역에 쌓이는 하나의 네모가 스택 프레임으로 메서드 호출 시 하나의 스택 프레임이 쌓이고 메서드 종료 시 해당 스택 프레임이 제거된다 (실행 컨텍스트와 스택 프레임이 같은 맥락인듯..)

힙 영역

인스턴스와 배열이 생성되는 영역으로 가비지 컬렉션이 주로 이루어지는 영역

스택 영역은 각 쓰레드별로 하나의 실행 스택이 생성된다.

인스턴스를 여러개 생성하더라도
인스턴스 메모리는 개별로 올라가지만
클래스의 메서드 코드는 메서드 영역에 한 번만 생성되어 참조하여 사용

스택과 큐

자료의 저장과 사용 순서를 보장하기 위한 자료구조

스택

후입선출의 자료구조

선입선출의 자료구조

static 변수

주로 멤버 변수와 메서드에 사용된다
인스턴스의 값은 각 객체끼리 공유하지 않는다
static 을 사용하면 해당 필드와 메서드가 메모리(메서드 영역)에 올라가 클래스 레벨에서 동작하게 된다
따라서 여러 객체에서 하나의 값 또는 메서드를 공유할 수 있게 된다
때문에 static 으로 선언된 멤버 변수는 static 변수 또는 정적 변수, 클래스 변수라고 부른다

인스턴스 변수: 일반 멤버변수
클래스 변수: static 이 선언된 정적 변수 (static 변수)

인스턴스 변수

  • 인스턴스 변수는 인스턴스 생성 시마다 새로 생성된다
  • 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다

클래스 변수

  • 인스턴스와 무관하게 클래스에 바로 접근하여 사용할 수 있고 클래스 자체에 소속되어 있다
  • 클래스 변수는 자바 프로그램 실행 시 단 1개만 생성된다 (여러 곳에 공유하는 목적으로 사용된다)

변수와 생명주기

  • 지역 변수: 스택 프레임에 보관되며 메서드 종료 시 스택 프레임도 함께 제거된다
  • 인스턴스 변수: 힙 영역을 사용한다. 힙 영역은 GC 가 발생하기 전까지 생존한다
  • 클래스 변수: 메서드 영역 내의 static 영역에 보관된다. 메서드 영역은 프로그램 전체에서 사용하는 공용 공간으로, 해당 클래스가 JVM 에 로딩되는 순간 생성, 프로그램 전체 종료 시까지 생명주기가 이어진다

정적 변수 접근법

static 변수는 클래스를 통해 바로 접근할 수 있고
인스턴스를 통해서도 접근할 수 있지만 추천하지 않는 방법
코드를 읽을 때 인스턴스 변수인지 스태틱 변수인지 바로 확인하기 어렵다

스태틱 메서드

정적 메서드 또한 정적 변수와 같이 클래스 레벨로 생성되기 떄문에
인스턴스를 생성하지 않고도 어디서든 클래스르르 통해 접근할 수 있다
불필요한 객체 생성 없이 편리하게 메서드를 사용할 수 있다

정적 메서드 내에서는 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다

  • 클래스 레벨로 올라가기 때문에 클래스 변수 또는 클래스 메서드만 사용 가능하다
  • static 이기 때문에 접근 제어자만 만족한다면 모든 곳에서 정적 메서드를 호출할 수 있다
    인스턴스 변수나 메서드를 사용하려면 매개변수로 직접 해당 객체나 값을 전달할 수 있다

주로 유틸리티성 메서드에 자주 사용된다

static import

정적 메서드를 자주 사용해야 한다면 import 를 하여 편하게 사용할 수 있다

import static Math.floor;
import static Math.*; // 와일드 카드로 전부 불러올 수도 있다

public class DataMain {
	public static void main(String[] args) {
    	Math.floor(123.1)
    }
}

main 메서드

인스턴스 생성 없이 실행하는 가장 대표적인 메서드
main() 메서드는 프로그램의 시작점이 된다
static 메서드이기 때문에 객체 생성 없이도 사용 가능하다
정적 메서드는 같은 클래스 내부에서 정적 메서드만 호출할 수 있다

profile
떠돌이 생활을 하는. 실업자, 부랑 생활을 하는

0개의 댓글