자바에서 상수영역과 힙영역이 뭐가 다른가요?

조회수 4106회

아래와 같이 선언하면 상수영역에 저장되고,

String str1 = "hello";
String str2 = "hello";

아래와 같이 선언하면 힙영역에 저장된다고 하는데요

String str3 = new String("hello");
String str4 = new String("hello");

상수영역과 힙영역이 같은건가요 다른건가요? 다르다면 뭐가 다른건가요?

2 답변

  • 좋아요

    4

    싫어요
    채택 취소하기

    new로 생성을 하면 매번 힙메모리에 객체로 생성이 됩니다. 하지만 String의 경우 new를 사용하지 않고 사용할 경우 리터럴로 취급이 됩니다. String str1 = "hello"; String str2 = "hello"; 위처럼 사용했다면 메모리에는 딱 하나만 올라가게 됩니다.
    하지만, String str3 = new String("hello"); String str4 = new String("hello");

    이렇게 사용할 경우 힙에 2개의 객체가 올라가게 됩니다.

    자바는 메모리를 직접관리하지않기때문에 메모리에 대한 아주 깊은 부분까지는 몰라도 상관없긴 하지만, 간단하게 정리하자면

    Runtime Data Area (프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간) 이 존재하고 그 공간에는 클래스, 스택, 힙, native 메스드, pc 레지스터 영역으로 나뉩니다. 그 중에 상수는 클래스 영역에 저장이 됩니다. 클래스 영역도 여러 부분으로 나뉘는데 상수는 상수pool 에 저장되고, 이런 상수pool 은 중복되는 값이 있었을때 기존의 상수를 이용하게 됩니다.

    이런 이유로 new를 사용하지 않으면 hello 는 하나만 메모리에 올라가게 됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 엄밀히 말하면 두가지 경우 다 문자열 자체는 상수영역에 저장됩니다. 차이는 직접 참조를 하느냐 String 객체를 이용해 간접 참조를 하느냐입니다. 예를 들자면...

    • str1 -> static("hello")
    • str3 -> heap(string 객체) -> static("hello")

    이런 식 입니다. 아래 링크의 그림을 보시면 이해에 도움이 될거 같습니다.

    링크

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 참고로 자바를 비롯한 대부분의 컴파일 언어들은 따음표로 묶은 문자열을 코드영역 즉 상수영역에 기록합니다. 알 수 없는 사용자 2016.3.22 16:45

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)