Java/자바 이론

[Java] String 객체 특징 ( ==와 equals의 차이점 )

현기 2022. 6. 23. 18:13

Stirng도 당연히 클래스이므로 클래스의 특징을 모두 지니고 있다. 하지만 워낙 자주 사용되다보니, 특별한 2가지의 특징이 있다.

 

1. 한 번 정의된 문자열은 변경할 수 없다.

= 문자열의 내용을 변경하면 JVM은 수정하는 것이 아니라, 새로운 객체를 생성하고 기존의 객체를 버린다.

2. 문자열 리터럴을 바로 입력해 객체를 생성할 때 같은 문자열끼리 객체를 공유한다. ( => 메모리의 효율성 )

 

s1, s2처럼 String 객체를 생성하면,먼저 String pool에 같은 값이 있는지 확인한다.

만약 있다면 그 주소값을 리턴하고 없다면 새로운 객체를 만들어 String pool에 할당한 뒤 그 주소값을 리턴한다.

 

s3처럼 new로 객체를 생성하면, 다른 객체들처럼 강제로 Heap 영역에 생성하고 그 주소값을 리턴한다.

하지만 다른 점은 만약 String pool에 "Superman"이 없었다면,

pool 영역에 1개, Heap 영역에 1개 총 2개의 객체를 생성한다.

 

 ==와 equals의 차이점

== : 객체의 주소를 비교한다.

equals : 객체 안의 데이터를 비교한다.

String str = "Superman";
String str2 = "Superman";
String str3 = new String("Superman");

if(str == str2) {
    System.out.println("Same");
} else {
    System.out.println("Diff");
}

if(str == str3) {
    System.out.println("Same");
} else {
    System.out.println("Diff");
}

str == str2 은 같은 객체를 가르키고 있기 때문에 "Same"이 출력된다.

str == str3 은 다른 객체를 가르키고 있기 때문에이기 때문에 "Diff"가 출력된다.

equals 의 경우 데이터를 비교하기 때문에 전부 "Same"이 출력된다.