1. 스택(Stack)
스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간이다.
메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 된다. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop하게 된다.
2. 힙(Heap)
힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다.
*만약 메소드 내에서 객체를 생성하면 이는 스택에 들어갈까? 아니면 힙에 들어갈까?
객체가 생성되면 무조건 힙에 생성된다. 그리고 primitive 타입의 변수(int, float, boolean ...)가 아닌 변수에는 객체 자체의 값이 들어가는 것이 아니라 객체에 대한 reference가 들어가게 된다.
즉, 아래 그림과 같은 경우 현재 walk()메소드가 수행되고 있고, walk()메소드에서는 car라는 객체를 사용하게 되는데 이때 car객체는 힙에 생성되어 있고, walk()에서 사용하는 car변수는 힙에 있는 객체의 레퍼런스를 이용하는 것이다.
스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간이다.
메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 된다. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop하게 된다.
2. 힙(Heap)
힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다.
*만약 메소드 내에서 객체를 생성하면 이는 스택에 들어갈까? 아니면 힙에 들어갈까?
객체가 생성되면 무조건 힙에 생성된다. 그리고 primitive 타입의 변수(int, float, boolean ...)가 아닌 변수에는 객체 자체의 값이 들어가는 것이 아니라 객체에 대한 reference가 들어가게 된다.
즉, 아래 그림과 같은 경우 현재 walk()메소드가 수행되고 있고, walk()메소드에서는 car라는 객체를 사용하게 되는데 이때 car객체는 힙에 생성되어 있고, walk()에서 사용하는 car변수는 힙에 있는 객체의 레퍼런스를 이용하는 것이다.
'프로그래밍 > JAVA' 카테고리의 다른 글
Subclipse(SVN)에서 충돌(conflict)이 일어나는 경우 해결법 (0) | 2010.03.04 |
---|---|
함수의 원자성(atomicity) 보장 (0) | 2010.01.11 |
자바에서 쓰레드를 사용하는 방법 (1) | 2010.01.11 |
직렬화를 할 때 유의해야 할 사항 (0) | 2010.01.08 |
자바 - 직렬화 (Serializable) (5) | 2010.01.07 |