안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
String의 특징 중 하나인 불변성(immutable)!
public void test1() {
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
String s4 = new String("java");
System.out.println(s1 == s2); //true
System.out.println(s2 == s3); //false
System.out.println(s3 == s4); //false
System.out.println(s1.equals(s2)); //true
System.out.println(s2.equals(s3)); //true
System.out.println(s3.equals(s4)); //true
System.out.println(s1.hashCode()); //3254818
System.out.println(s2.hashCode()); //3254818
System.out.println(s3.hashCode()); //3254818
System.out.println(s4.hashCode()); //3254818
System.out.println();
s1 += "oracle";
s3 += "oracle";
System.out.println(s1.hashCode()); //87819808
System.out.println(s2.hashCode()); //3254818
System.out.println(s3.hashCode()); //87819808
System.out.println(s4.hashCode()); //3254818
}
@콘솔출력값
true
false
false
true
true
true
3254818
3254818
3254818
3254818
87819808
3254818
87819808
3254818
문자열을 비교해주는 equals가 true라면 동일한 hashCode를 갖고 있으므로, s1/s2/s3/s3 모두 "java"를 갖고 있었으므로 true, 동일한 해쉬코드(3254818)이 출력되는 것을 알 수 있습니다.
여기서 s1과 s3에만 "oracle"을 추가하였습니다. 그렇다면 불변성 특징으로 인해 새로운 객체를 생성하여 참조값을 변경했을 것입니다.
따라서 s1과 s3의 hashCode가 변경된 것을 확인할 수 있었죠.
하지만 만일 자주 문자열을 바꾸고 더하고 빼고 한다면.. 그만큼 계속 객체를 재생성하기 때문에 메모리 낭비가 되겠죠.
이를 해결하고자 API에서는 문자열을 수정해줄 수 있는 StringBuilder와 StringBuffer를 제공해줍니다.
제공해주는 기능은 같지만 멀티쓰레드 동기화를 지원/미지원의 차이가 있습니다.
(아직 쓰레드를 안 배웠으므로 StringBuilder로 예를 들겠습니다.)
☞ StringBuilder
- mutable 멀티쓰레드 동기화 미지원
- 속도가 빠름
public void test2() {
StringBuilder sb = new StringBuilder("java");
System.out.println(sb.hashCode());
System.out.println(sb);
sb.append("oracle");
System.out.println(sb.hashCode());
System.out.println(sb);
}
@콘솔출력값
1130478920
java
1130478920
javaoracle
append() 메소드를 이용하여 "oracle"을 추가해주었습니다.
"java"의 값을 갖고 있는 객체의 주소값을 sb 참조변수에 대입해주었고, 해시코드를 출력해보았습니다.
그 후 "oracle"을 추가해 준 후 해시코드를 출력하니 동일한 해시코드가 출력되는 것을 확인할 수 있습니다.
새로운 객체를 생성한 것이 아닌 기존 객체에 "oracle"을 추가해준 것을 알 수 있습니다.
(해시코드 변동이 없으므로!!)
☞ StringBuffer
- mutable 멀티쓰레드 동기화 지원
- 속도가 다소 느림
'Java > Java' 카테고리의 다른 글
API) String에서 기본형으로 변경, 기본형에서 String으로 변경 (0) | 2022.03.25 |
---|---|
API) 기본형을 객체화 해주는 클래스 Wrapper (0) | 2022.03.25 |
API) 문자열을 구분해주는 split, StringTokenizer (0) | 2022.03.25 |
인터페이스) 인터페이스 클래스 (0) | 2022.03.25 |
abstract 제어자) 추상 메소드, 추상 클래스, 익명 이너 클래스 (0) | 2022.03.24 |