인트로
자바기초 다시 한번 볼 심산으로 예전에 사두었던 인프런..강의를 다시 켜봤다..하하
듣고 대강 정리를 해봤습니다~
김영한짱.. 천재야 증말~
자바듣다가 다른강의도 사버렷다 하하 나 이제 강의를 .. 편의점에서 초코바 사듯이 사서 이제 완강할 일만 남았네요ㅠ
1. 자바 메모리 구조 개요
자바의 메모리는 크게 3개 영역으로 나뉜다.
메서드 영역 (Method Area)
├── 클래스 정보 (바이트코드, 메서드, 생성자)
├── static 변수들
└── 런타임 상수 풀
스택 영역 (Stack Area)
├── 지역 변수
├── 매개변수
└── 메서드 호출 정보 (스택 프레임)
힙 영역 (Heap Area)
├── 객체 (인스턴스)
├── 배열
└── 인스턴스 변수들
비유
- 메서드 영역: 학교의 교무실 (모든 학생이 공유하는 정보)
- 스택 영역: 개인 책상 (개인적인 작업 공간, 수업 끝나면 정리)
- 힙 영역: 사물함 (개인 소유물들, 졸업할 때까지 유지)
2. static 키워드
static은 정적이라는 뜻으로, 객체 생성 없이 사용할 수 있는 클래스 레벨의 멤버를 만들 때 사용한다.
2-1. 기본 개념
public class Student {
// 인스턴스 변수 (각 학생마다 다름)
String name;
int age;
// static 변수 (모든 학생이 공유)
static String schoolName = "자바고등학교";
static int totalStudents = 0;
// 인스턴스 메서드
public void study() {
System.out.println(name + "이 공부합니다.");
}
// static 메서드
public static void printSchoolInfo() {
System.out.println("학교명: " + schoolName);
}
}
2-2. 사용 방법
// static 멤버는 클래스명으로 직접 접근
Student.schoolName = "코딩고등학교";
Student.printSchoolInfo();
// 인스턴스 멤버는 객체 생성 후 접근
Student student1 = new Student();
student1.name = "김자바";
student1.study();
3. 메모리 영역별 상세 분석
3-1. 메서드 영역 (Method Area)
특징: 프로그램 전체에서 공유, 프로그램 시작부터 종료까지 유지
public class MethodAreaExample {
static int globalCounter = 0; // 메서드 영역에 저장
static String appName = "MyApp"; // 메서드 영역에 저장
static {
System.out.println("클래스 로딩 시 실행"); // static 블록도 메서드 영역
}
}
메서드 영역에 저장되는 것들:
- 클래스의 바이트코드
- static 변수들
- 메서드 정보
- 런타임 상수 풀
- static 블록
3-2. 스택 영역 (Stack Area)
특징: LIFO 구조, 메서드 호출 시 생성, 종료 시 제거
public class StackExample {
public void method1() {
int a = 10; // 스택에 저장
method2(a); // 스택 프레임 추가
} // method1 스택 프레임 제거
public void method2(int param) { // param도 스택에 저장
String local = "지역변수"; // 스택에 저장
} // method2 스택 프레임 제거
}
스택 영역의 특징:
- 메서드 호출 시마다 스택 프레임 생성
- 지역 변수, 매개변수 저장
- 메서드 종료 시 자동으로 정리
- 스레드별로 독립적인 스택 공간
3-3. 힙 영역 (Heap Area)
특징: 객체와 배열 저장, GC가 관리
public class HeapExample {
String instanceVar; // 인스턴스 변수 (힙 영역)
public static void main(String[] args) {
HeapExample obj = new HeapExample(); // 객체는 힙에 생성
obj.instanceVar = "힙 영역 데이터";
int[] array = new int[10]; // 배열도 힙에 생성
}
}
힙 영역의 특징:
- 모든 객체와 배열이 저장
- 인스턴스 변수들이 여기에 위치
- GC(가비지 컬렉션)가 자동으로 메모리 관리
- 모든 스레드가 공유
4. 메모리 영역 구분 실습
4-1. 코드로 이해하기
public class MemoryExample {
static String className = "MemoryExample"; // 메서드 영역
String instanceName = "인스턴스"; // 힙 영역 (인스턴스 변수)
public void testMethod(int param) { // param: 스택 영역
int localVar = 100; // 스택 영역
String[] array = new String[5]; // 배열: 힙 영역
// 새 객체 생성
MemoryExample newObj = new MemoryExample(); // 객체: 힙 영역
newObj.instanceName = "새 인스턴스"; // 힙 영역
}
}
4-2. 변수별 생명주기
public class LifeCycleExample {
static int staticVar = 1; // 프로그램 시작 ~ 종료 (가장 긴 생명주기)
int instanceVar = 2; // 객체 생성 ~ GC (중간 생명주기)
public void method() {
int localVar = 3; // 메서드 시작 ~ 종료 (가장 짧은 생명주기)
// localVar는 메서드 종료 시 스택에서 제거
// instanceVar는 객체가 GC될 때까지 힙에 유지
// staticVar는 프로그램 종료까지 메서드 영역에 유지
}
}
5. 메모리 구조 이해 ~퀴즈~
5-1. 메모리 영역 구분
다음 변수들이 저장되는 메모리 영역을 맞춰바
public class MemoryQuiz {
static String className = "MemoryQuiz"; // A) ?
String instanceName; // B) ?
public void method(int parameter) { // C) ?
int localVar = 100; // D) ?
String[] array = new String[5]; // E) 배열 객체는 ?
}
}
정답:
- A) 메서드 영역 (static 변수)
- B) 힙 영역 (인스턴스 변수)
- C) 스택 영역 (매개변수)
- D) 스택 영역 (지역변수)
- E) 힙 영역 (배열 객체)
5-2. 메모리 할당 흐름 이해하기
public class MemoryFlow {
static int count = 0; // 1. 프로그램 시작 시 메서드 영역에 할당
public static void main(String[] args) { // 2. main 스택 프레임 생성
String name = "자바"; // 3. 스택에 지역변수 생성
MemoryFlow obj = new MemoryFlow(); // 4. 힙에 객체 생성
obj.process(10); // 5. process 스택 프레임 생성
}
public void process(int value) { // 6. 매개변수 스택에 저장
int result = value * 2; // 7. 지역변수 스택에 저장
} // 8. process 스택 프레임 제거
} // 9. main 스택 프레임 제거
마무리
자바 메모리 구조의 3영역을 이해하면
- 메모리 효율적인 코드 작성 가능
- 메모리 누수 원인 파악 가능
- 성능 최적화 방향 결정 가능
- 디버깅 능력 향상
'공부일기.. > Java' 카테고리의 다른 글
| [java] static 제대로 활용하기 - 패턴과 함정 (0) | 2025.09.21 |
|---|---|
| [java] static 키워드 - 제약사항~ (0) | 2025.09.20 |
| [Java] JDK 그놈의 환경변수 설정하는 이유 정리~ (0) | 2025.09.07 |
| [JUnit5] @EnabledIfEnvironmentVariable 이해하기 (0) | 2025.09.05 |
| [동시성] 자바 동시성 문제 정리: synchronized, DB 락, Redis 분산락 비교 (5) | 2025.08.16 |