본문 바로가기
JAVA

얕은복사/깊은복사, 스택/힙, 가비지컬렉션

by Wanado 2025. 2. 20.
728x90

https://zzang9ha.tistory.com/372

 

스택/힙

스택은 정적 메모리 할당에 사용되며, 컴파일 시간에 크기가 결정됩니다. 함수 호출과 함께 로컬 변수가 저장되는 곳으로,함수가 종료되면 할당된 메모리가 자동으로 해제됩니다.

 

반면, 힙은 동적 메모리 할당에 사용되며, 프로그램 실행 중에 메모리 크기가 결정됩니다. 힙에 할당된 메모리는 개발자가 직접 관리해야 하며, 사용이 끝난 메모리는 명시적으로 해제해야 합니다

 

또한, 스택은 속도가 빠르고 메모리 관리가 간단하지만, 크기에 제한이 있습니다. 힙은 메모리 크기가 유동적이지만, 메모리 누수와 같은 문제를 주의해야 합니다.

더보기

1. 스택(Stack) 사용 예제

스택은 함수 호출 시 로컬 변수를 저장하는 공간입니다. 자동으로 할당 및 해제되며, LIFO (Last-In-First-Out) 원칙을 따릅니다.

예제: 재귀 함수에서 스택 사용

java
복사편집
public class StackExample { static void recursiveFunction(int n) { if (n < 1) { System.out.println("Base condition reached, returning..."); return; } System.out.println("Calling function with n = " + n); recursiveFunction(n - 1); System.out.println("Returning from function with n = " + n); } public static void main(String[] args) { recursiveFunction(3); } }

실행 결과:

sql
복사편집
Calling function with n = 3 Calling function with n = 2 Calling function with n = 1 Base condition reached, returning... Returning from function with n = 1 Returning from function with n = 2 Returning from function with n = 3

설명

  • recursiveFunction(3)을 호출하면 n=3이 스택에 저장됩니다.
  • 함수가 n=1까지 호출될 때마다 스택에 로컬 변수 n이 저장됩니다.
  • n=1일 때 return하면, 스택에서 n=1을 제거하고 이전 함수로 돌아갑니다.
  • 하나씩 스택에서 함수가 제거되면서 n=2 → n=3 순서로 반환됩니다.

2. 힙(Heap) 사용 예제

힙은 동적 메모리 할당을 처리하는 영역입니다. 개발자가 직접 객체를 생성하고 해제해야 합니다.

예제: 객체를 힙에 생성

java
복사편집
class Person { String name; Person(String name) { this.name = name; } void printName() { System.out.println("Name: " + name); } } public class HeapExample { public static void main(String[] args) { Person p1 = new Person("Alice"); // 힙 메모리에 객체 생성 Person p2 = new Person("Bob"); // 또 다른 객체 생성 p1.printName(); p2.printName(); } }

실행 결과:

makefile
복사편집
Name: Alice Name: Bob

설명

  • new Person("Alice")를 호출하면, 힙 메모리에 Person 객체가 생성됩니다.
  • p1, p2 변수는 스택에 저장된 참조 변수이며, 실제 객체는 힙에 존재합니다.
  • JVM이 **가비지 컬렉션(GC)**을 실행하면, 더 이상 사용되지 않는 객체가 자동으로 제거됩니다.

3. 스택과 힙의 차이점 코드 비교

스택 사용 (로컬 변수)

java
복사편집
public class StackVsHeap { public static void main(String[] args) { int x = 10; // 스택에 저장됨 int y = 20; // 스택에 저장됨 System.out.println("Sum: " + (x + y)); } }

설명:

  • x, y는 스택에 저장되며, main() 함수가 종료되면 자동으로 해제됩니다.

힙 사용 (객체 생성)

java
복사편집
public class StackVsHeap { static class Data { int value; Data(int value) { this.value = value; } } public static void main(String[] args) { Data d1 = new Data(100); // 힙에 동적 할당 Data d2 = new Data(200); // 또 다른 객체 생성 System.out.println("d1 value: " + d1.value); System.out.println("d2 value: " + d2.value); } }

설명:

  • new Data(100)을 호출하면, 힙 메모리에 객체가 생성됩니다.
  • d1, d2는 스택에 있는 참조 변수이고, 힙에 있는 객체를 가리킵니다.
  • 개발자가 명시적으로 해제할 필요 없음, JVM이 **GC(Garbage Collection)**을 통해 자동 정리.

 

 

Java Garbage Collection

https://bit-b-bit.tistory.com/405

728x90

'JAVA' 카테고리의 다른 글

Socket 통신  (0) 2025.05.08
Garbage Collection  (0) 2025.01.31
@Override의 의미  (0) 2025.01.10
stream에 대한 궁금증  (0) 2025.01.10
java 튜토리얼  (0) 2024.11.14