본문 바로가기
쿤즈 Dev/Java

[Java] 자바에서 사용하는 스택(Stack), 힙(Heap)에 대한 간단한 지식

by Koonz:) 2023. 8. 28.
728x90

개발 공부를 하다 보면 언젠가는 반드시 듣게 되는 두 가지 용어가 있다. 바로 스택(Stack)과 힙(Heap)이다. 이는 메모리 관리를 위해서 사용하는 두 영역을 의미한다.

이번 포스팅에서는 자료구조나 알고리즘을 설명하는 글이 아니지만 간단하게 알아두면 좋은 개발 상식 중 스택과 힙에 대해서 알아보자.


스택 Stack

스택은 메서드 호출과 지역 변수들을 저장하는 데 사용되는 메모리 영역이다. 메서드가 호출될 때마다 해당 메서드의 매개변수와 지역변수가 스택에 저장되며, 메서드의 실행이 끝나면 해당 변수들은 스택에서 제거된다. 이렇게 스택은 호출된 메서드의 실행 흐름을 관리하며, 메서드 간의 호출 순서를 따라가는 데 사용된다.

 

스택의 특징은 아래와 같다.


후입 선출 (LIFO, Last-In-First-Out)

스택은 후입 선출 자료구조를 따른다. 이 의미는 가장 마지막에 저장된 데이터가 가장 먼저 제가된다는 것을 의미한다. 예를 들어서 고리에 링을 순서대로 끼워보자. 가장 처음에 끼운 고리는 가장 마지막에 빼고, 가장 마지막에 끼운 고리는 가장 처음에 뺄 수 있다. 데이터도 이렇게 구조화해서 저장된다는 의미다. 이렇게 저장하기 때문에 실행 흐름을 관리할 수 있게 된다.

 

제한된 크키

스택은 크기가 제한적이다. 그래서 스택 오버플로우(Stack Overflow)가 발생할 수 있다. 이는 스택에 저장되는 데이터의 양이 스택의 크기를 초과할 때 발생한다. 그래서 한 번에 많은 양의 데이터를 스택에 사용하면 문제가 발생할 가능성이 크다.


스택 사용 예제

아래는 스택의 사용 예제이다.

 

메서드 호출 및 지역변수

public int calSum(int num1, int num2) {
	int sum = num1 + num2; // 지역 변수 sum은 스택에 저장됨
	return sum;
}

메서드가 호출될 때 해당 메서드의 매개변수와 지역 변수들은 스택에 저장된다. 메서드 실행이 끝나면 스택에서 제거된다.

 

재귀 함수 호출

public int factorial(int n) {
	if (n <= 1) {
		return 1;
	} esle {
		return n * factorial(n - 1);
	}
}

재귀 함수가 호출될 때마다 새로운 호출 스택 프레임이 생성되며, 함수의 호출 순서가 관리된다.


힙 Heap

힙은 동적으로 할당된 객체들이 저장되는 영역으로, 객체 지향 프로그래밍에서 생성된 모든 객체가 여기에 저장된다. 힙에 저장된 객체들은 가바지 컬렉터(Garbage Collector)에 의해 관리되며, 더 이상 사용되지 않는 객체들은 메모리에서 해제된다.

 

Tip!
가비지 컬랙터는 프로그래밍 언어에서 동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 객체들을 감지하고 해제하는 기능을 수행하는 컴퓨터 프로그램 또 서브 시스템을 말한다. 주로 메모리 누수와 같은 문제를 방지하고, 프로그래머가 메모리 관리를 직접 수행하지 않아도 자동으로 메모리 관리를 할 수 있도록 한다.

 

힙의 특징은 아래와 같다.


동적 생성

자바에서는 클래스를 객체 또는 인스턴스로 만들어야 비로소 데이터를 저장하고 사용할 수 있다. 이때 객체들은 런타임 중에 동적으로 생성되고 해제되며 이는 힙에 생성되고 해제된다.

 

주소 또는 포인터

힙에 저장된 객체들은 객체들 간의 참조를 통해서 접근된다. 힙 내부에서 각 객체는 자신의 주소나 포인터를 통해 서로를 참조한다. 이때 주소나 포인터는 차지하고 있는 공간의 위치를 알려주는 대표 이름이다.

 

메모리 공간

힙의 메모리 공간은 스택보다 크며, JVM (Java Virtual Machine)이 실행 중인 시스템의 가용한 메모리를 최대한 활용하여 객체를 저장한다.


힙 사용 예제

아래는 힙의 사용 예제이다.

 

객체 생성

class Person {
	int age;
	String name;
}

public class Main {
	public static void main(String[] args) {
		Person person = new Person(); // Person 객체가 힙에 저장됨
		person.age = 30;
		person.name = "koonsland";
	}
}

클래스로부터 객체를 생성할 때 해당 객체는 힙에 저장된다. 객체는 동적으로 할당되며, 프로그램에서 해당 객체를 사용하는 동안 메모리에 남아 있다.

 

동적 데이터 구조

public class Main {
	public static void main(String[] args) {
	 	ArrayList<Integer> numbers = new ArrayList<>();
		numbers.add(5);
        numbers.remove(0);
	}
}

동적 배열, 링크드 리스트, 트리, 그래프등과 같은 동적 데이터 구조가 힙에 저장된다. 이들은 크기가 런타임에 결정되며, 필요에 따라 객체가 추가 및 제거된다.


요약하자면, 자바에서 스택은 메서드 호출과 지역 변수 관리에 사용되는 영역이며, 힙은 동적으로 할당되는 객체들의 저장소다. 이 두 영역은 프로그램의 실행 구조와 메모리 사용 패턴을 결정하는 중요한 역할을 한다.

댓글