728x90
반응형
String의 객체 생성과 리터럴 할당 비교
코드
import java.util.*;
import java.lang.*;
import java.io.*;
// The main method must be in a class named "Main".
class Main {
public static void main(String[] args) {
String a = "민민";
String b = "민민";
String c = new String("민민");
System.out.println("a: " + a + " b: " + b + " c: " + c);
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
}
}
출력
a: 민민 b: 민민 c: 민민
true
false
true
true
자바에서 문자열을 다룰 때, new 키워드를 사용하여 새로운 객체를 생성하거나 문자열 리터럴을 사용하여 상수 풀에 있는 문자열을 참조할 수 있다. 이 두 가지 방식은 메모리 할당과 관련하여 차이가 있다. 이 글에서는 자바의 문자열 생성 방식을 살펴보고, 각각의 방식이 메모리에서 어떻게 처리되는지 알아보자.
설명
- 새로운 객체 생성: new 키워드를 사용하여 문자열 객체를 새로 생성할 때, 메모리 상에 새로운 객체가 할당된다. 이때 변수는 이 새로운 객체를 참조하게 된다.
- 문자열 리터럴 사용: 문자열 리터럴을 사용하여 문자열을 선언할 경우, 이 문자열은 상수 풀(constant pool)에 저장된다. 이미 동일한 문자열이 상수 풀에 존재한다면 새로운 객체를 생성하지 않고, 해당 문자열을 참조하게 된다.
무슨 말이냐면,
String은 참조타입이다. String a와 String b는 문자열로 선언되어서 메모리상 같은 주소를 참조한다.
여기서 String c = new String();을 선언한다면 새로운 객체를 선언한 것이므로, 메모리에 하나의 다른 주소가 올라간다.
아래 그림을 보면 이해가 조금 쉬울 것이다.
그림 설명
즉, ' == ' 는 참조하는 메모리 주소를 비교하는 것이고, ' equals() '는 객체의 내용을 비교하는 것이어서 결과값이 위와 같이 출력된다.
728x90
반응형
'CS(Computer Science) 지식' 카테고리의 다른 글
[HTTP] http 응답(상태)코드로 이해하는 오류 내용 | 민민의 하드디스크 - 티스토리 (0) | 2024.02.13 |
---|