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"이 출력된다.
'Java > 자바 이론' 카테고리의 다른 글
[Java] 자바 super 키워드 & super() 메서드 (0) | 2022.06.30 |
---|---|
[Java] 자바 클래스 상속의 장점과 특징 (2) | 2022.06.30 |
[Java] 클래스 관계 HAS-A (포함) / IS-A (상속) 정리 (2) | 2022.06.29 |
[Java] 클래스 내부 구성 요소 3가지 (필드, 생성자, 메서드 + This) (0) | 2022.06.27 |
[Java] 자바 메모리 영역 Static, Stack, Heap (4) | 2022.06.23 |