Java

문자열

iksadnorth 2023. 7. 17. 19:26

👣 개요

자바에서 문자열을 표현하는 객체들의 차이를 확인.

  String StringBuilder StringBuffer
저장 위치 Heap or String Pool Heap Heap
Modifable Immutable Mutable Mutable
Thread Safe O X O
여기서 Modifable이란?
예를 들어 "처갓집 (슈프림양념)치킨 먹고 싶다"라는 문자열이 있을 때,
해당 문자열을 "처갓집 (프라이드)치킨 먹고 싶다"라고 문자의 일부분만 변경 가능할 수 있냐는 것이다.

String의 경우 일부 문자만 변경하고 싶어도 새로운 객체를 만들어서 할당해야 하기에
불필요한 메모리 할당을 유발한다.
 하지만 동시에 Thread Safe하다는 특성을 가질 수 있다.

👣 String

String 객체는 'new 연산자로 할당했을 때'와 '쌍따옴표로 할당했을 때'는 차이가 있다.

new로 할당했을 때는 다른 객체와 같이 Heap영역에 적재된다.

하지만 쌍따옴표로 할당한 경우엔 Heap 영역의 String Pool이라는 공간에 적재가 되며,
할당하려는 문자열이 String Pool에 존재할 경우, 해당 문자열의 메모리 주소를 할당하게 된다.
이는 메모리 낭비를 막을 수 있다.


👣 String.intern()

// 주소값 : 1b3v2j3
String str1 = "Hello";

// 주소값 : d3j44hi
String str2 = new String("Hello");

// 주소값 : 1b3v2j3
String str3 = str2.intern();
intern 메서드는 해당 문자열을 String Pool에서 검색하고,
이미 String Pool에 존재하는 경우 해당 문자열의 참조를 반환한다.

 

👣 String 관련 유의 사항

👣 toUpperCase()

public void func() {
    // haribo1 주소값 : wd234r1
    String haribo1 = new String("Haribo");
    
    // haribo2 주소값 : 242d2t65
    String haribo2 = haribo1st.toUpperCase();
}
public void func() {
    // haribo1 주소값 : wd234r1
    String haribo1 = new String("HARIBO");
    
    // haribo2 주소값 : wd234r1
    String haribo2 = haribo1st.toUpperCase();
}
위 코드는 지극히 당연히 문자열이 Haribo -> HARIBO 가 되었으니 주소값이 달라진다.
하지만 아래 코드는 toUpperCase의 로직에 의해 모두가 대문자일 경우,
객체를 생성하지 않고 그대로 원본 주소값을 내놓기 때문에 주소값이 동일하다.

👣 String.toString()

public void func() {
    // haribo1 주소값 : wd234r1
    String haribo1 = new String("Haribo");
    
    // haribo2 주소값 : wd234r1
    String haribo2 = haribo1.toString();
}
String.toString()는 내부적으로 "return this;" 을 통해 주소값을 전달하기 때문에 당연히 동일하다.

👣 String.valueOf()

public void func() {
    // haribo1 주소값 : wd234r1
    String haribo1 = new String("Haribo");
    
    // haribo2 주소값 : dh2idwu
    String haribo2 = new String("Haribo");
    
    // haribo3 주소값 : wd234r1
    String haribo3 = String.valueOf("Haribo");
}
String.valueOf()는 내부적으로 null 체크를 한 후, 매개변수의 toString()을 호출한다.

'Java' 카테고리의 다른 글

Thread in Java  (0) 2023.07.17
Auto Boxing & Auto UnBoxing  (0) 2023.07.17
Call By Value & Call By Reference  (0) 2023.07.17
JDK, JRE, JVM  (0) 2023.07.17
Garbage Collector  (0) 2023.07.17