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


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

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

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

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

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

  • 2016년 03월 22일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

조회수 695


2 답변


좋아요
2
싫어요
채택취소하기

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 는 하나만 메모리에 올라가게 됩니다.

  • 2016년 03월 23일에 작성됨
    실무에선 UML을 이용한 분석/설계, 자바 프로그래밍을 하고 있고, 자바교육, 파이썬, node.js(javascript) 등을 관심을 가지고 공부하고 사용하려고 노력중입니다.


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

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

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

링크


  • 참고로 자바를 비롯한 대부분의 컴파일 언어들은 따음표로 묶은 문자열을 코드영역 즉 상수영역에 기록합니다.    SangMin Choi   2016.3.22 16:45     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close