블로그

[JAVA] 변수 선언과 할당, 그리고 스택(Stack)과 힙(Heap) 본문

개발자 준비과정/JAVA

[JAVA] 변수 선언과 할당, 그리고 스택(Stack)과 힙(Heap)

하늘바람a 2024. 2. 29. 23:58

 

 

변수를 사용하기 위한 변수 선언은 변수 타입과 변수 이름을 결정합니다

 

 

변수선언저장되는 값의 타입과 이름만 결정한 것이지, 아직 메모리에 할당된 것은 아닙니다.

 

변수 할당 :
변수에 최초로 값이 대입될 때 메모리에 할당되고, 해당 메모리에 값이 저장됩니다.
변수에 최초로 값을 대입하는 행위변수 초기화라고 하고, 이때의 값을 초기값이라고 합니다.

 

초기화되지 않은 변수를 쓰면 컴파일 에러가 나는 이유 : 
메모리에 할당되지 않았기 때문에, 변수를 통해 메모리 값을 읽을 수 없습니다.

 

변수 선언은 한번만 가능합니다.


스택(Stack)과 힙(Heap)은 자바에서 메모리를 관리하는 두 가지 주요 영역입니다.

스택은 지역 변수와 메소드 호출에 사용되는 데이터를 저장하는 공간입니다. 스택은 후입선출(LIFO, Last-In-First-Out) 방식으로 데이터를 저장하고 접근합니다. 메소드가 호출될 때마다 해당 메소드의 지역 변수와 메소드 호출에 필요한 데이터가 스택에 순차적으로 쌓이게 됩니다. 메소드의 실행이 끝나면 해당 메소드의 데이터는 스택에서 제거됩니다. 이러한 스택의 동작 방식은 메모리를 효율적으로 사용하기 위해 변수 선언을 한 번만 할 수 있도록 합니다. 힙은 동적으로 할당되는 객체들이 저장되는 영역입니다. 힙은 가변적인 크기를 가지며, 객체의 생성과 소멸은 개발자가 직접 관리하지 않고, 자바 가상 머신(JVM)이 자동으로 처리합니다. 힙에는 객체의 인스턴스 변수들이 저장되며, 이들은 객체의 생명 주기 동안 유지됩니다. 변수 선언을 한 번만 할 수 있는 이유는 변수가 스택에 생성되기 때문에, 변수를 사용하는 동안에만 메모리가 할당되고, 사용이 끝나면 자동으로 해제되기 때문입니다.

public class MemoryExample {
    public static void main(String[] args) {
        int a = 10;  // 스택에 변수 a가 생성됨
        String str = "Hello";  // 스택에 변수 str이 생성됨

        // 객체 생성 시, 힙에 메모리가 할당됨
        MyClass obj = new MyClass();
    }
}

class MyClass {
    // 인스턴스 변수는 객체가 생성될 때 힙에 생성됨
    int b;
    String name;
}

 

 

위의 코드에서 `int a`와 `String str`은 변수 선언 시에 스택에 할당되고, `MyClass obj`는 객체가 생성될 때 힙에 할당됩니다. 이후 변수들의 사용이 끝나면 스택의 변수는 자동으로 해제되고, 객체가 더 이상 참조되지 않을 때 힙의 메모리는 자동으로 회수됩니다. 자바의 이러한 메모리 관리 방식은 개발자가 메모리 할당과 해제에 직접 신경 쓰지 않아도 되므로 프로그래밍의 편의성과 안정성을 높여줍니다.


 

데이터를 저장하고 관리하는데 사용되는 스택(Stack)과 힙(Heap)의 동작 원리


### 1. 스택(Stack)

- **스택**은 지역 변수 및 메서드 호출 등의 작업을 처리하는 데 사용됩니다.
- 메서드가 호출될 때마다 해당 메서드에 대한 지역 변수와 메서드 호출 정보가 스택 프레임(stack frame)에 저장됩니다.
- 스택은 후입선출(LIFO, Last-In-First-Out) 구조를 가지고 있어, 가장 최근에 추가된 데이터가 가장 먼저 제거됩니다.
- 스택은 고정된 크기를 가지고 있으며, 스택 오버플로우(Stack Overflow)가 발생할 수 있습니다. 스택 오버플로우는 스택이 할당된 메모리를 초과하여 발생하는 오류입니다.

### 2. 힙(Heap)

- **힙**은 동적으로 할당된 객체와 배열 등을 저장하는 데 사용됩니다.
- 힙은 메모리의 동적 할당 영역이며, 필요에 따라 크기가 동적으로 조절됩니다.
- 객체나 배열은 힙에 저장되고, 해당 객체나 배열에 대한 참조(주소)가 스택에 저장됩니다.
- 힙은 가비지 컬렉터에 의해 관리되어 사용하지 않는 객체를 자동으로 해제하여 메모리 누수를 방지합니다.

### 변수 선언과 메모리 측면

- 변수 선언을 한 번만 허용하는 이유는 스택에서의 동작과 관련이 있습니다. 지역 변수는 스택에 저장되며, 해당 변수의 스코프 내에서만 유효합니다. 따라서 같은 이름의 변수를 중복 선언하면 해당 변수가 할당되는 메모리 공간이 중복되는 문제가 발생할 수 있습니다.
- 스택에서 변수를 할당할 때마다 해당 변수의 메모리 공간을 스택에 할당하고, 해당 변수의 사용 범위가 끝나면 해당 메모리 공간을 해제합니다. 이러한 스택의 특성 때문에 변수를 재선언할 수 없습니다.

따라서 자바에서는 변수 선언을 한 번만 허용하여 메모리 관리를 보다 효율적으로 처리하고 스택의 안정성을 유지합니다.

 

참조 : 이것이 자바다 / 신용권,임경균 저

뤼튼, chatGPT