새발블로그

[JAVA] 변수 위치 및 메모리 구조 본문

Language/Java

[JAVA] 변수 위치 및 메모리 구조

EUG 2025. 5. 4. 18:29

1. Java 메모리 구조 개요

자바의 메모리 구조는 크게 Method Area, Heap, Stack, PC Register, Native Method Stack으로 나눌 수 있다. 각 영역은 특정한 데이터를 저장하고 관리하는 역할을 한다.

자바 메모리 영역

  • Method Area (메소드 영역): 클래스 정보, static 변수, 상수 등을 저장합니다. 모든 클래스는 이 영역에 로드된다.
  • Heap (힙 영역): 객체 인스턴스를 저장합니다. 객체가 생성될 때 힙 영역에 할당되고, 객체가 더 이상 참조되지 않으면 Garbage Collector(GC)가 이를 정리한다.
  • Stack (스택 영역): 메서드 호출 스택, 지역 변수, 매개변수 등을 저장한다. 메서드 호출 시 스택 프레임을 쌓고, 메서드가 종료되면 해당 프레임을 제거한다.
  • PC Register (PC 레지스터): 현재 실행 중인 명령어의 주소를 저장한다. 스레드마다 별도로 관리된다.
  • Native Method Stack: 자바 외부 메서드(C언어 등) 호출 정보를 저장한다.

2. 자바 변수 위치 요약

구분 위치 초기화여부 설명
인스턴스 변수 Heap 영역 O (자동 초기화) 객체 생성 시 저장되는 변수
클래스 변수 (static) Method Area (Static 영역) O (자동 초기화) 클래스 로딩 시 딱 1번 생성
매개변수 Stack 영역 X (초기화 안 함) 메소드 호출 시 전달받는 값
지역 변수 Stack 영역 X (초기화 안 함) 메소드 안에서 선언된 변수

인스턴스 변수 (non-static 변수)

  • 위치: Heap 영역
  • 초기화 여부: 자동 초기화
  • 설명: 인스턴스 변수는 객체가 생성될 때 힙 메모리에 할당된다. 이 변수는 객체마다 독립적으로 존재하며, 객체가 소멸되면 함께 소멸한다.
class Person {
    String name;  // 인스턴스 변수
}

Person p = new Person();
p.name = "홍길동";  // p 객체에 할당된 name 변수

클래스 변수 (static 변수)

  • 위치: Method Area (Static 영역)
  • 초기화 여부: 자동 초기화
  • 설명: 클래스 변수는 클래스가 로딩될 때 딱 한 번 메모리에 할당된다. 객체가 없어도 접근 가능하며, 클래스의 모든 객체가 동일한 값을 공유한다.
class Counter {
    static int count = 0;  // 클래스 변수

    public static void increment() {
        count++;
    }
}

Counter.increment();  // 클래스 변수 count에 접근

매개변수

  • 위치: Stack 영역
  • 초기화 여부: 초기화하지 않음
  • 설명: 메서드 호출 시 전달되는 값으로, 메서드의 매개변수는 메서드가 호출될 때 스택에 저장된다. 매개변수는 메서드가 종료되면 소멸한다.
class Example {
    void printName(String name) {  // name은 매개변수
        System.out.println(name);
    }
}

지역 변수

  • 위치: Stack 영역
  • 초기화 여부: 초기화하지 않음
  • 설명: 지역 변수는 메서드 내부에서 선언된 변수로, 메서드가 호출될 때 스택에 저장된다. 메서드가 종료되면 지역 변수는 사라진다.
class Example {
    void method() {
        int localVar = 10;  // 지역 변수
        System.out.println(localVar);
    }
}

3. 객체 생성 과정

Test t = new Test();와 같이 객체를 생성하는 과정을 살펴보면

  1. Stack에 t라는 참조 변수가 생성됩니다. t는 Test 객체의 주소를 저장할 공간이다.
  2. Heap에 Test 객체가 생성됩니다. 이 객체는 인스턴스 변수와 데이터를 저장한다.
  3. Heap에 할당된 인스턴스 변수는 기본값으로 자동 초기화된다.
  4. t 변수는 Test 객체가 저장된 Heap 영역의 주소를 가리킨다.
class Test {
    int value;  // 인스턴스 변수
}

Test t = new Test();  // t는 Stack, 객체는 Heap에 생성됨

 

객체 생성 시 메모리 구조

Stack            Heap             Method Area
-------          ---------        --------------
t  ------------> Test 인스턴스     Test 클래스 정보 (static 변수 등)
  • Stack: 참조 변수 t
  • Heap: Test 객체 (인스턴스 변수)
  • Method Area: 클래스 정보 (static 변수 등)

4. Static과 Instance의 차이

자바에서 static과 인스턴스 변수는 메모리 위치와 접근 방식에서 큰 차이를 보인다. static 변수와 메서드는 클래스에 소속되며, 객체 없이도 접근 가능하다. 반면, 인스턴스 변수와 메서드는 객체에 소속되어야만 접근할 수 있다.

Static 변수/메서드 접근 예시

class Example {
    static int staticVar = 10;  // 클래스 변수
    int instanceVar = 20;       // 인스턴스 변수

    static void staticMethod() {
        System.out.println(staticVar);  // static 변수에 접근
        // System.out.println(instanceVar);  // Error! (인스턴스 변수는 객체가 필요)
    }

    void instanceMethod() {
        System.out.println(staticVar);   // static 변수에 접근
        System.out.println(instanceVar); // 인스턴스 변수에 접근
    }
}

 

'Language > Java' 카테고리의 다른 글

[JAVA] SOLID 원칙  (0) 2025.05.04
[JAVA] 상속  (0) 2025.05.04
[JAVA] 클래스  (0) 2025.05.04
[JAVA] JVM  (0) 2025.05.04
점프 투 자바 메모  (0) 2023.08.09