stack영역에는 지역변수(local variable)와 매개변수(parameter)가 저장된다.
지역변수와 매개변수는 변수가 선언된 블록 안에서만 유효하다.
즉, 스택 영역에는 실행 과정에서 임시로 할당되고, 이후 바로 소멸되는 것들이 저장된다.
흔히 코드에서 'new'명령을 통해 생성된 인스턴스 변수가 저장된다.
Garbage collector에 의해 삭제 될 때까지 또는 JVM이 종료 될때까지 메모리가 유지된다.
각 스택에서 object3에 대한 서로 다른 참조를 함.
참조는 로컬 변수이다.
따라서 각 thread의 스택에 저장된다.(Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack 에 올라가게 된다.)
그러나 두 개의 서로 다른 참조는 힙의 동일한 개체를 가리킨다.
->이렇기 때문에 Object 3이 Object 2와 4에 각각 접근할 수 있다.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> listArgument = new ArrayList<>();
listArgument.add("chaeekim");
listArgument.add("github");
print(listArgument);
}
private static void print(List<String> listParam) {
String value = listParam.get(0);
listParam.add("io");
System.out.println(value);
}
}
new
키워드는 생성할 오브젝트를 위한 충분한 공간이 있는지 heap에서 찾는다.listArgument.add(new String("chaeekim"));
과 같은 역할. heap에 충분한 공간 확인 후, 문자열을 할당한다.public class Main {
public static void main(String[] args) {
String s = "hello";
changeString(s);
System.out.println(s);
}
public static void changeString(String param) {
param += " world";
}
}
param += " world";
를 실행하는 것은 heap 에 “hello world” 라는 스트링 오브젝트가 새롭게 할당되는 작업이다.param 혼자 북치고 장구치고 다 한거지...바뀐건 없는데..
-> changeString() 메소드를 수행하고 돌아가도 기존에 “hello” 를 레퍼런스하고 있던 s 변수의 값은 불변이다.
자바에서 Wrapper class 에 해당하는 Integer, Character, Byte, Boolean, Long, Double, Float, Short 클래스는 모두 Immutable 이다.
[참조]