Everything has an expiration date
Java - Runtime Data area(메모리)의 Method 영역, Heap 영역, Stack 영역 본문
Java - Runtime Data area(메모리)의 Method 영역, Heap 영역, Stack 영역
Jelly-fish 2023. 9. 10. 23:39Method 영역 : JVM이 실행될 때 생성된다. 코드에서 작성된 클래스를 클래스 로더로 읽어
static Field(정적 필드, static으로 선언된 변수와 메소드들)와, 클래스 코드, 생성자 코드, 상수를 분류하여 저장한다.
→ 메소드 영역 : static 필드, 클래스, 생성자, 상수 저장.
Heap 영역 : 객체와 배열을 생성한다. 여기에 생성된 객체와 배열은 Stack 영역의 변수나, 다른 객체의 Field에서 참조한다. 만약, Heap 영역에 존재하는 객체와 배열 중에서 더 이상 다른 곳에서 참조하지 않는 데이터가 있을 경우 의미 없는 객체가 되어 Garvage Collector가 자동으로 제거한다.
→ Heap 영역 : 객체, 배열 저장.
Stack 영역 : 메소드를 호출할 때마다 프레임(Frame)을 생성한다. 메소드가 종료되면 그 프레임을 제거한다. 프레임 내부에는 Local 변수 Stack이 존재하며 이 내부에서 기본타입 변수와, 참조타입 변수가 추가 되거나 제거된다. (생성 : push, 제거 : pop) 기본 타입 변수의 경우 Stack 영역에서 직접 값을 갖고 있으며, 참조 타입 변수의 경우 Heap 영역의 객체와 배열을 참조하기 위해 그 객체의 Heap영역 번지수(address)를 갖고 있다.
→ Stack 영역 : 기본 타입 변수, 참조 타입 변수 저장. 기본 타입 변수는 실제 값을 저장. 참조 타입 변수는 Heap 영역의 참조 주소를 저장.
null - Heap 영역의 객체를 참조하지 않는다는 뜻으로, 참조 변수만 사용할 수 있는 값. 참조 변수를 선언만 했을 경우 초기값으로 사용된다.
String 클래스의 특징 - String 또한 참조 변수의 일종이다. String 변수는 String 문자열을 그대로 저장하고 있는 것이 아니라, Heap 영역에 저장된 String 문자열의 번지 수(address)를 갖고 Heap 영역의 객체를 참조한다.
String 문자열이 동일할 때 - Java에서는 동일한 문자열을 갖는 변수를 두 개 이상으로 선언했을 때, 그 문자열을 공유하도록 설계되어 있다. 따라서, 같은 문자열이라도 서로 다른 객체로 저장하고 싶다면 객체 생성 연산자 new 연산자를 통해 같은 문자 리터럴이라도 다른 객체를 가질 수 있도록 할 수 있다.
// [① 같은 문자 리터럴을 갖는 변수를 new 연산자 없이 선언]
String a = "apple";
String b = "apple";
// 참조 변수이므로, == 연산을 통해 주소 값이 같은지를 확인한다.
// 내부 문자열을 비교하고 싶을 경우("apple")
// a.equals(b)와 같은 형태로 작성한다.
System.out.println(a == b); //--> 주소 값 동일한지 확인!
// [② 같은 문자 리터럴을 갖는 변수를 객체 생성 연산자 new를 통해 선언]
String c = new String("grape");
String d = new String("grape");
System.out.println(c == b); //--> 주소 값 동일한지 확인!
// [실행 결과]
true // → 문자열 리터럴의 Heap 영역 주소 값이 동일하다! (서로 같은 객체 참조)
false // → 문자열 리터럴의 Heap 영역 주소 값이 서로 다르다. (서로 다른 객체 참조)
'Self Study Java' 카테고리의 다른 글
[Java - 상속에서의 메소드 오버라이딩(Method Overriding)] (0) | 2023.09.13 |
---|---|
Java - 향상된 for문 예제 : AdvancedForExample (0) | 2023.09.10 |