자바 메모리 구조 : static, heap, stack

nyoung·2023년 6월 14일
3

개발이야기

목록 보기
8/9
post-thumbnail

자바는 메모리를 효율적으로 관리하기 위해 다양한 메모리 영역을 사용하는데, 이 중에서 Static, Heap, Stack에 대해 다뤄보려고 한다.


Static Memory (정적 메모리)

Static Memory는 프로그램 실행 시에 할당되고 프로그램의 라이프사이클과 함께 유지되는 데이터를 저장하는 영역이다. 즉 프로그램이 종료될 때까지 유지된다.

  • Static 요소
    - 클래스 변수 (Static 변수): 클래스에서 선언되며, 해당 클래스의 모든 객체들이 공유하는 변수
    - 상수 (Constants): final 키워드로 선언된 상수
    - 정적 메서드 (Static 메서드): 인스턴스가 아닌 클래스에서 호출되는 메서드

  • 반지름으로 원의 넓이를 계산해보자.
public class Circle {
    public static final double PI = 3.14; // 클래스 변수, 상수
    public static int counter = 0; // 클래스 변수
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
        counter++; // counter 공유
    }

    public double getArea() {
        return PI * radius * radius; // PI 공유
    }

    public static int getCounter() {
        return counter; // counter 공유
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle1 = new Circle(5.0);
        System.out.println(circle1.getArea()); // 출력: 78.5
        System.out.println(Circle.getCounter()); // 출력: 1

        Circle circle2 = new Circle(3.0);
        System.out.println(circle2.getArea()); // 출력: 28.26
        System.out.println(Circle.getCounter()); // 출력: 2
    }
}

Heap Memory (힙 메모리)

Heap Memory는 동적으로 할당되는 데이터와 객체를 저장하는 영역이다. 자바에서는 new 연산자를 사용하여 객체를 생성할 때 Heap Memory에서 메모리를 할당한다.

  • Heap Memory 특징
    • Garbage Collector에 의해 관리되며, 더 이상 사용되지 않는 객체는 자동으로 제거된다.
    • 객체의 생성 및 소멸은 사용자에 의해 제어된다.
    • 여러 스레드에서 공유할 수 있다.
    • 객체와 데이터의 동적 할당을 지원하여 자유로운 메모리 관리가 가능하다.
  • 객체를 생성해보자.
    • 생성된 객체는 고유한 메모리 주소를 가지며, 인스턴스 변수인 name과 age는 객체마다 별도의 공간에 저장된다.
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person("John", 25); // 객체 생성
        System.out.println(person1.getName()); // 출력: John
        System.out.println(person1.getAge()); // 출력: 25

        Person person2 = new Person("Jane", 30); // 객체 생성
        System.out.println(person2.getName()); // 출력: Jane
        System.out.println(person2.getAge()); // 출력: 30
    }
}

Stack Memory (스택 메모리)

Stack Memory는 메서드 호출 시 생성되는 지역 변수와 메서드 실행에 필요한 정보를 저장하는 영역이다. 각 스레드마다 별도의 Stack Memory가 생성되며, 메서드가 호출될 때마다 해당 메서드의 지역 변수와 매개변수, 복귀 주소 등이 저장된다.

  • Stack Memory 특징
    • 지역 변수와 매개변수는 스택 프레임에 저장되며, 해당 메서드의 실행이 끝나면 스택 프레임이 제거된다.
    • 메서드의 호출 순서에 따라 차례대로 스택 프레임이 생성되고 제거된다.(Last-In-First-Out)
    • 스레드마다 별도의 스택이 생성되며, 스택 메모리는 스레드 간에 공유되지 않는다.
  • 메서드를 호출해보자.
public class Calculator {
    public static int add(int a, int b) {
        int sum = a + b; // 스택 프레임에 저장
        return sum;
    }

    public static void main(String[] args) {
        int num1 = 5; // 스택 프레임에 저장
        int num2 = 10; // 스택 프레임에 저장

        int result = add(num1, num2); // add()의 실행이 끝나면 스택 프레임 소멸
        System.out.println(result); // 출력: 15
    }
}
profile
새싹 개발자

0개의 댓글