Stack 의 세 가지 의미
4557 단어 자바 관련
이 개념 을 이해 하 는 것 은 프로그램의 운행 을 이해 하 는 데 매우 중요 하 다.헷 갈 리 기 쉬 운 것 은 이 단 어 는 사실 세 가지 의미 가 있 는데 서로 다른 장소 에 적용 되 므 로 반드시 구분 해 야 한 다 는 것 이다.
데이터 구조
stack 의 첫 번 째 의 미 는 데이터 저장 방식 으로 LIFO, 즉 후진 선 출 (Last in, first out) 이 특징 이다.
이런 데이터 구조 에서 데 이 터 는 블록 처럼 층 층 이 쌓 여 있 고 뒤에 추 가 된 데 이 터 는 맨 위 에 놓 여 있다.사용 할 때 맨 윗 층 의 데이터 가 제일 먼저 사용 되 는데 이것 을 '후진 선 출' 이 라 고 한다.
이런 구조 와 세트 로 된 것 은 특정한 방법 으로 주로 아래 와 같다.
push: 맨 위 에 데 이 터 를 추가 합 니 다
pop: 맨 위 에 있 는 데 이 터 를 되 돌려 주 고 제거 합 니 다
top: 최상 위 데이터 의 값 을 되 돌려 주지 만 제거 하지 않 습 니 다
isempty: 현재 stack 이 빈 창고 인지 여 부 를 표시 하 는 불 값 을 되 돌려 줍 니 다
코드 실행 방식
stack 의 두 번 째 의 미 는 '호출 스 택' (call stack) 으로 함수 나 하위 루틴 이 쌓 인 나무 처럼 저장 되 어 층 층 이 호출 되 는 것 을 나타 낸다.
다음은 자바 코드 를 예 로 들 겠 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class
Student{
int
age;
String name;
public
Student(
int
Age, String Name)
{
this
.age = Age;
setName(Name);
}
public
void
setName(String Name)
{
this
.name = Name;
}
}
public
class
Main{
public
static
void
main(String[] args) {
Student s;
s =
new
Student(23,
"Jonh"
);
}
}
위의 코드 가 실 행 될 때 먼저 main 방법 을 호출 합 니 다. 그 안에 Student 의 인 스 턴 스 를 생 성 해 야 하기 때문에 Student 구조 함 수 를 호출 합 니 다.구조 함수 에서 setName 방법 으로 호출 합 니 다.
이 세 번 의 호출 은 블록 처럼 쌓 여 있 는 것 을 '호출 스 택' 이 라 고 한다.프로그램 이 실 행 될 때 항상 최상 위 호출 을 완성 한 다음 에 그 값 을 다음 호출 로 되 돌려 전체 호출 스 택 이 완 료 될 때 까지 마지막 결 과 를 되 돌려 줍 니 다.
메모리 영역
stack 의 세 번 째 의 미 는 데 이 터 를 저장 하 는 메모리 영역 입 니 다.프로그램 이 실 행 될 때 메모리 공간 에 데 이 터 를 저장 해 야 합 니 다.일반적으로 시스템 은 두 가지 서로 다른 메모리 공간 을 나 눌 수 있다. 하 나 는 stack (스 택) 이 고 다른 하 나 는 hep (더미) 라 고 한다.
그들의 주요 차이 점 은 stack 은 구조 가 있 고 모든 블록 은 일정한 순서에 따라 저장 하면 모든 블록 의 크기 를 명확 하 게 알 수 있다 는 것 이다.힙 은 구조 가 없어 서 데 이 터 를 임의로 저장 할 수 있 습 니 다.따라서 stack 의 주소 지정 속 도 는 힙 보다 빠르다.
다른 차이 점 은 일반적으로 모든 스 레 드 는 하나의 stack 을 분배 하고 모든 프로 세 스 는 하나의 힙 을 분배 한다. 즉, stack 은 스 레 드 가 독점 하고 힙 은 스 레 드 가 공용 하 는 것 이다.또한, stack 을 만 들 때 크기 가 확실 합 니 다. 데이터 가 이 크기 를 초과 하면 stack overflow 오류 가 발생 합 니 다. 힙 의 크기 는 확실 하지 않 습 니 다. 필요 하면 계속 증가 할 수 있 습 니 다.
위의 이러한 차이 에 따라 데이터 저장 규칙 은 부분 적 이 고 공간 을 차지 하 는 확 정 된 데이터 라면 보통 stack 에 저장 되 고 그렇지 않 으 면 힙 안에 넣 는 것 이다.아래 코드 를 보 세 요.
1
2
3
4
5
6
7
8
public
void
Method1()
{
int
i=4;
int
y=2;
class1 cls1 =
new
class1();
}
위 코드 의 Method 1 방법 은 모두 세 개의 변 수 를 포함 합 니 다: i, y, cls 1.그 중에서 i 와 y 의 값 은 정수 이 고 메모리 의 점용 공간 은 확정 적 이 며 국부 변수 이 며 Method 1 블록 안에 만 사용 되 며 블록 밖 에 사용 되 지 않 습 니 다.cls 1 도 부분 변수 이지 만 형식 은 포인터 변수 로 대상 을 가리 키 는 인 스 턴 스 입 니 다.포인터 변수 가 사용 하 는 크기 는 확실 하지만 대상 인 스 턴 스 는 현재 정보 로 사용 하 는 메모리 공간 크기 를 알 수 없습니다.
이 세 개의 변수 와 하나의 대상 인 스 턴 스 가 메모리 에 저장 되 는 방식 은 다음 과 같다.
위의 그림 에서 볼 수 있 듯 이 i, y, cls 1 은 모두 stack 에 저장 되 어 있 습 니 다. 메모리 공간 을 차지 하 는 것 이 확실 하고 그 자체 도 부분 변수 에 속 하기 때 문 입 니 다.그러나 cls 1 이 가리 키 는 대상 인 스 턴 스 는 힙 에 저 장 됩 니 다. 크기 가 불확실 하기 때 문 입 니 다.하나의 규칙 으로 모든 대상 이 힙 에 저장 되 어 있다 는 것 을 기억 할 수 있다.
다음 문 제 는 Method 1 방법 운행 이 끝나 면 무슨 일이 일어 날 까?
대답 은 전체 stack 이 비 워 졌 습 니 다. i, y, cls 1 이라는 세 변 수 는 사 라 졌 습 니 다. 국부 변수 이기 때문에 블록 이 실행 이 끝나 면 더 이상 존재 할 필요 가 없습니다.힙 에 있 는 그 대상 의 실례 는 시스템 의 쓰레기 청소 메커니즘 (garbage collector) 이 이 메모 리 를 회수 할 때 까지 계속 존재 한다.따라서 일반적으로 메모리 누 출 은 힙 에서 발생 한다. 즉, 일부 메모리 공간 은 더 이상 사용 되 지 않 지만 여러 가지 이유 로 시스템 에서 회수 되 지 않 는 다.
(끝)