꾸물꾸물 졔의 개발공부
[CS] 스택(Stack) vs 힙(Heap) 본문
🌟 요약
스택은 값 형식을 저장하고 지역변수와 매개변수를 저장합니다.
함수의 호출과 함께 자동으로 할당되며 함수의 호출이 완료되면 함께 소멸합니다. 스택은 정적할당영역으로 컴파일 타임에 크기가 결정됩니다.
힙은 전역 변수를 다루고 참조형식을 저장합니다.
자동으로 할당 및 해제가 되지않으며 사용자가 직접 관리해야 합니다. (자바의 경우 , 가비지 컬렉터)
힙은 동적할당영역으로 런타임에 크기가 결정됩니다.
스택(Stack)
- 함수의 호출과 관계되는 지역 변수 또는 매개변수가 저장되는 영역
- 함수의 호출과 함께 할당되며 , 함수의 호출이 완료되면 소멸한다.
- 원시타입(int, double, float, boolean 등등)의 데이터가 실제 값과 함께 할당
- Heap 영역에 생성된 Object 타입의 데이터의 '참조값' 이 할당 (실제 주소 저장)
- 각 Thread 당 하나의 stack이 생성
장점
- 매우 빠른 엑세스(할당, 해제가 빠르다)
- 변수를 명시적으로 할당, 해제 할 필요가 없다.
단점
- 메모리 크기가 제한되어 있다. (OS마다 다름)
- 지역 변수만 가능하다.
💡예시
public class Main{
public static void main(String[] args){
int num=4;
num = calc(num);
}
private static int calc(int n){
int tmp = n*3 ;
int res = tmp/2;
return res;
}
}
1. int num=4; 이라는 지역변수를 선언함으로써 스택에는 num이라는 변수명으로 공간이 할당되고 int는 원시타입이므로 이 공간에 실제로 4라는 값이 할당된다.
2. num = calc(num); 에 의해 calc() 함수가 호출된다. 호출시 인자로 num을 넘겨주며 scope가 calc() 함수로 이동한다. 때문에 기존의 num 변수는 scope에서 벗어나므로 사용할 수 없다. 이 때 인자로 넘겨받은 값은 calc의 파라미터인 n에 복사되고, 원시타입이므로 stack에 값과 함께 할당된다.
3. int tmp=n*3; int res=tmp/2; 에 의해 tmp,res 변수도 함께 스택에 할당된다.
4. calc()의 함수호출이 종료되면 호출함수 calc 에서 사용된 지역변수들은 모두 pop된다.
5. 처음에 num 변수는 4로 초기화 되었지만, 함수의 실행결과인 6인 기존 num 변수에 재할당된다. 물론 calc() 함수에서의 지역변수들이 모두 pop되기전에 재할당된다.
6. 마지막으로 main 함수도 종료되면서 stack에 있던 모든 데이터들은 pop되고 프로그램은 종료된다.
스택은 push 동작으로 데이터를 저장하고 pop으로 데이터를 인출한다. LIFO(후입선출) 방식으로 진행된다.
또한, 스택은 OS에 따라 사용가능한 메모리의 크기가 제한되어 있기 때문에 스택이 가득 차게되면 프로그램에서 스택 오버플로우(Stack Overflow)를 발생시켜 프로그램이 충돌할 수있다. 따라서 무한 재귀 호출과 같은 방법은 주의하는 것이 좋다.
힙(Heap)
- 클래스 변수(또는 인스턴스 변수) 또는 객체 등이 할당
- 프로그래머에 의해 메모리 공간이 동적으로 할당되고 해제
- 모든 Object 타입(Integer, String, List.. )은 Heap 영역에 "실제 값" 할당
- 주로 긴 생명주기를 가진 데이터들이 저장 (대부분 크기가 크거나, 서로 다른 코드 블럭에서 공유되는 경우가 많음)
- 몇개의 Thread가 존재하든 상관없이 단 하나의 Heap 영역만 존재
- JVM은 해제되지 않고 있는 무쓸모 메모리를 가비지 컬렉터를 통해 관리해줌
장점
- 변수를 전역적으로 엑세스 할 수 있다.
- 메모리 크기 제한 X
단점
- 상대적으로 느린 엑세스(할당 /해제가 느림)
- 메모리를 직접 관리해야 한다. (사용자에게 책임이 있음)
💡예시
public class Main{
public static void main(String args[]){
int port = 4000;
String host ="localhost";
}
}
1. int port = 4000; 에 의해서 스택에 4000이라는 값이 port 라는 변수명으로 할당
2. String은 Object를 상속받아 구현되었으므로 String과 실제 값인 "localhost"는 heap 영역에 할당된다.
스택에는 host라는 이름을 변수가 생성되어 heap 에 있는 "localhost"를 참조한다.
'CS' 카테고리의 다른 글
[CS] 프레임워크(Framework)와 라이브러리(Library) (0) | 2023.09.02 |
---|---|
[CS] 메모리 구조, 스택(Stack)과 힙(Heap) (0) | 2023.08.26 |
[CS/JAVA] JVM이란? (0) | 2023.08.23 |
[CS] Blocking/Non-blocking , Sync/Async (1) | 2023.05.11 |
[DB] 트랜잭션(Transaction)이란? ACID, COMMIT, ROLLBACK (0) | 2023.05.09 |