Stack 영역과 Heap 영역

김성수·2023년 5월 22일
1

Java

목록 보기
2/18

들어가면서..

Stack 영역과 Heap 영역의 특징을 살펴보고 서로 무엇이 다른지 알아본다.



Stack 영역

Stack 영역은 정적으로 할당된 메모리 영역이다.

정적? 그게 무슨 말인데?

정적이란 크기가 정해져있는 데이터를 의미한다.

예를 들어 아래와 같이 기본형인 정수형은 정적이다.

byte = 1byte

short = 2byte

int = 4byte

long = 8byte

데이터의 크기가 byte 단위로 정해져 있기 때문이다.


따라서, Stack에는 char, int, boolean 같은 기본형들이 할당되는 메모리 영역이다.


그렇다면, 참조형 변수는 할당될 수 없는걸까?

그렇지않다. 참조형 변수의 크기가 정해져있다면 참조형 변수의 주소값을 가져와서 할당한다.

아래는 예시 코드이다.

public class Main {
    public static void main(String[] args) {
        String str = new String("Hello, world!"); // String 객체 생성
        System.out.println(str); // "Hello, world!" 출력
    }
}

String 타입은 참조형 타입으로써 Heap 영역에 할당된다.

(자세한 이유는 Heap 영역을 설명할 때 소개하겠다.)

위 코드는 참조형 데이터의 주소를 str 변수에 참조했다.

결과적으로 Stack 영역에 String 객체의 주소가 할당되게 된다.

System.out.println(str);

위 명령어를 통해 Stack에 저장되어 있던 주소에다가

toString() 메소드가 호출되어 주소의 실제 값이 콘솔에 출력된다.

(추가적으로 toString() 메서드가 호출되는 이유는 Java의 모든 클래스가 Object 클래스를 상속받으며, Object 클래스에 toString() 메서드가 정의되어 있기 때문이다.
System.out.println(str);은 str.toString()을 호출하여 String 객체의 문자열 표현을 얻어온다.)



Heap 영역

Heap 영역은 동적으로 할당된 메모리 영역이다.

String은 참조형인데, 그 이유는 크기가 동적이기 때문이다.

예를 들어보자.

String str = new String("가나다라마바사");

위와 같이 str 값을 초기화할 때 ""안에 들어갈 수 있는 문자열은 무궁무진하다.

위처럼 "가나다라마바사" 라고 선언할 수도 있고,

"아자차카타파하이야이야호" 라고 선언할 수도 있다.

즉, 데이터 크기가 정해져있지 않고 동적으로 변한다는 특징이 있다.


참조형인 데이터는 Heap 영역에 할당된다.

만약 참조형 데이터를 사용하려면 Stack에서 소개한 것 처럼

str 값의 주소를 참조하여 사용해야한다.



Stack과 Heap 영역 예시 이미지

profile
깊이 있는 소프트웨어 개발자가 되고 싶습니다.

0개의 댓글