Back-Language/Java

[Java] String, 리터럴 객체의 메모리 할당(1)

200scs 2024. 4. 21. 07:46

우선, String. 즉, 리터럴 객체에 대해 알아보자

리터럴 객체?

리터럴 객체라는 것은 여러분이 자주 사용했을 String이라는 타입의 변수를 생성하는 것이다.

String name = "홍길동";

메모리 할당 방식

String도 다른 타입과 동일하게 '클래스'이다.
그런데 String 클래스는 특이하게도 객체를 생성하는 방법이 두 가지이다.

String Class의 두 가지의 객체 생성 방식

1. new String
첫 번째는 객체 생성 연산자인 new를 사용한 방법이다.

(예시)

String name1 = new String("홍길동");
String name2 = new String("홍길동");

if(name1 == name2)
    System.out.println("두 주소가 같다");
else 
    System.out.println("두 주소가 다르다");

// result: "두 주소가 다르다"

위와 같은 형태로 출력된다.
이유는 1번(객체 생성 연산자 사용) 방식으로 진행하면 값이 같든 다르든 새로운 메모리 공간에 String 객체가 생성된다

하지만 2번(리터럴 형태)의 형태로 생성한다면,

2. String
두 번째는 큰 따옴표("")로 감싸는 형식은 리터럴 형태의 생성 방법이다.

(예시)

String name3 = "홍길동";
String name4 = "홍길동";

if(name1 == name2)
    System.out.println("두 주소가 같다");
else 
    System.out.println("두 주소가 다르다");

// result: "두 주소가 다르다"

우선 리터럴 메모리라는 곳에 생성된다.

여기서 중요한 점은 리터럴 메모리에 생성될 때는 먼저 생성하는 것이 아니라, 같은 값을 가지고 있는 객체가 있는지 탐색하고

  • 같은 값을 가지고 있는 객체가 존재한다면 -> 기존 객체의 주소를 복사하여 생성한다.
  • 같은 값을 가지고 있는 객체가 없다면 -> 새로운 주소를 생성한다.