Spring & Java
JVM 메모리 영역 본문
● 레퍼클래스 (기본형 참조형)
● static - 클래스가 공유
● final - 변하지 않는 값
● 인터페이스 - 표준화의 시작
● 객체지향 PART 1 - 캡술 (접근제어자)
● 객체지향 PART 2 - 상속
● 객체지향 PART 3 - 추상화
● 객체지향 PART 4 - 다형성
JVM 메모리 영역
학습 키워드 점검
● Method Area - 클래스 정보 저장공간
● Stack Area - 메서드 실행 시 사용되는 공간
( 지역변수, 호출정보 등)
● Heap Area - 객체가 생성되어 저장되는 공간



Method Area - 도서관 비유
● 프로그램 시작 시 정보가 저장 됩니다.
● 클래스 정보 (.class 파일)가 올라가는 곳.
● 클래스의 메서드 정보, static 변수 등이 저장 됩니다.
● 모든 객체가 공유하는 공용 공
Stack Area - 접시 쌓기 비유
● 가장 위에 있는 접시를 먼저 꺼내듯 비슷한 구조로 생각하면 됩니다.
● 선입후출(LIFO) 구조 입니다. 먼저 들어온 것이 가장 늦게 나간다는 뜻입니다.
● 메서드가 호출될 때마다 새로운 접시한장 (스택프레임)이 쌓입니다.
● 가장 위의 접시 (최근 호출된 메서드)가 먼저 실행 됩니다.
● 메서드 실행이 끝나면 스택에서 제거 됩니다.
Heap Area - 풍선 비유
● new 키워드로 생성된 객체가 저장되는 곳입니다.
● 객체의 실제 데이터가 저장되고 데이터의 주소는 stack 영역에 저장됩니다.
코드 흐름 살펴보기
! 편의상 하나의 코드파일로 제공되지만 파일 2개가 있다고 가정해 봅시다.
● Main.java 파일 그리고 Person.java 파
Java Visualizer (( java 코드 실행 시각화 도구 ))
Java Visualizer
Write your Java code here: args: +command-line argument stdin (also visualizes consumption of StdIn) x <!-- Execute code using Python 2.7 Python 3.3 , --> <!-- these two make sense, but are not implemented yet hide frames of exited functions show frames of
cscircles.cemc.uwaterloo.ca
public class Main {
static class Person {
// 1. 속성
String name;
int age;
String address;
// 2. 생성자
Person(String name, int age) {
this.name = name;
this.age = age;
}
// 3-1. 소개 기능(이름 나이 출력 기능)
void introduce() {
System.out.println("나의 이름은");
System.out.println(this.name + "입니다.");
System.out.println("나의 나이는");
System.out.println(this.age + "입니다.");
}
// 3-2. 더하기 기능(소개를 하고 더하기 연산 수행)
int sum(int value1, int value2) {
introduce();
int result = value1 + value2;
return result;
}
}
public static void main(String[] args) {
String name = "Steve";
int age = 20;
Person personA = new Person(name, age);
personA.introduce();
int value1 = 1;
int value2 = 2;
int ret = personA.sum(value1, value2);
System.out.println(ret);
}
}
Method(static) 이해하기
● 프로그램이 실행되면 여러분들이 작성했던 모든 파일 (.java)의 데이터가 Method(static) 영역에 저장 됩니다.
● 프로그램 실행 시점에 한번만 저장됩니다.
● Method 영역에 저장된 데이터는 프로그램 전체에서 공용으로 활용 가능합니다.
● 아직 static 키워드를 배우진 않았지만 static 으로 선언된 변수와 메서드들이 이 공간에 위치하게 됩니다.
● 이 공간에 저장된 데이터는 공용으로 사용 가능합니다.

Heap 영역 이해하기
● new 키워드로 생성된 객체는 Heap 영역에 저장 됩니다.

! 프로그램 실행 흐름에서 Stack 영역의 변수가 Heap 영역의 객체를 참조 ( 화살표 ㅡ> 로 가리키고 있는 모습)을 꼭 확인해 봅시다. 지금은 객체를 담은 변수에는 실제 객체의 Heap 메모리 주소 값이 저장되는구나 라고 이해하고 넘어가셔도 충분합니다.
Stack 영역 이해하기
● 메서드가 호출될 때마다 Stack 영역에 메모리가 할당 됩니다.
● 하나의 접시(스택프레임)에 각 메서드의 지역변수가 저장됩니다.
● 이 영역은 접시를 쌓듯이 LIFO - 후입선출 구조 입니다.
● 메서드가 시작되면 추가되고 메서드가 종료되면 사라지는 구조입니다.
● 특정 메서드가 실행되면 해당 메서드의 정보와 변수가 Stack에 저장되고 메서드 실행이 끝나면 그 메모리는 자동으로 제거 됩니다.
● 메서드 내에 선언된 지역변수들이 저장되는 공간 입니다.
ㅡ> 변수에 객체가 담기면 객체의 주소값이 저장 됩니다.

public class Main {
public static void main(String[] args) {
String name = "Steve"; // 1
int age = 20;
Person personA = new Person(name, age); // personA = @100호
personA.introduce(); // 2
}
}


가비지 컬렉터 ( Garbage Collector )
Java의 사용하지 않는 객체를 자동으로 제거하는 기능입니다.
● new 키워드로 생성한 객체는 Heap 영역에 저장 됩니다.
● 사용이 끝난 객체는 메모리에 남아 있으면 낭비입니다.
● 가비지 컬랙터가 이러한 불필요한 객체를 자동으로 정리해서 메모리를 확보합니다.
'JAVA 객체지향 이해하기' 카테고리의 다른 글
| 인터페이스 - 표준화의 시작 (0) | 2025.12.10 |
|---|---|
| final - 변하지 않는 값 (0) | 2025.12.10 |
| Static - 클래스가 공유하는 공간 (1) | 2025.12.09 |
| JAVA 계산기 과제 (1차) (0) | 2025.12.09 |
| 래퍼클래스 (기본형 참조형) (0) | 2025.12.08 |