Backend/Java

4. String 자료형

Study 2021. 7. 11. 03:23

안녕하세요 String 자료형에 대해서 한번 알아보겠습니다.

String 자료형은 원시타입(Primitive type)처럼 사용할 수 있지만 참조형 타입(Reference type)에 속합니다.
또한 한번 만들어지면 변경할 수 없는(immutable class) 문자열 상수라 합니다.

너무나 많이 사용하므로 마치 기본자료형(Primitive type) 처럼 메모리에 올리는 방법을 제공합니다.
ex) String s="apple";
이와같은 선언방법을 묵시적(암시적) 생성법이라고 합니다.
상기 리터럴을 이용한 묵시적생성 시 상수풀에 저장되게 되어 동일한내용의 String이 중복으로 사용되는것을 막을 수 있습니다. (메모리 관리적 측면에서 이점)

명시적 생성법과 묵시적 생성법의 차이점을 알아보겠습니다.

String str1 = new String("하잇"); // 인스턴스로 생성되어 힙 메모리에 저장됩니다.
String str2 = "하잇"; // 상수풀에 생성 및 저장됩니다.
String str3 = "하잇"; // 상수풀에 생성 및 저장됩니다.

new를 이용하여 메모리를 할당하면 힙 영역에 메모리가 할당되며 new 를 이용하여 생성할때 마다 새로운 인스턴스가 생성되며 ""리터럴을 이용하여 바로 생성하게 되면 상수풀에 이미 생성된 동일한 내용의 스트링이 있는지 여부를 확인하여 없으면 생성 있을 시 이미 생성되어있는 스트링객체를 가리킵니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
public class StringTest {
 
    public static void main(String[] args) {
        String str1 = new String("하잇"); // 인스턴스로 생성되어 힙 메모리에 저장됩니다.
        String str2 = "하잇"// 상수풀에 생성 및 저장됩니다.
        String str3 = "하잇"// 상수풀에 생성 및 저장됩니다.
 
        System.out.println(str1==str2);
        System.out.println(str2==str3);
 
        System.out.println(str1.equals(str2));
    }
}
cs


문자열 str1, str2 ,str3은 모두 "하잇"으로 같은 값을 가지고 있습니다. equals 메서드를 사용하여 비교할때는 true를 반환하고 == 연산자를 사용하여 비교할때는 false를 반환합니다. str1과 str2의 값은 같지만 서로 다른 개체이므로 ==연산자로 비교할 때는 str1과 str2가 동일한 개체인지를 판단하기 때문에 false를 반환한 것이고, equals는 개체가 가지고 있는 값으로 비교하기 때문에 true를 반환하게 된것입니다.



문자열 "수정"이 실제로는 새 문자열 생성이므로 문자열에 대한 참조를 만들 때 주의해야 합니다. 문자열에 대한 참조를 만든 다음 원래 문자열을 "수정"할 경우 해당 참조는 문자열을 수정할 때 만든 새 개체 대신 원래 개체를 계속해서 가리킵니다.

1
2
3
4
5
6
7
8
9
public class StringTest2{
    public static void main(String[] args) {
        String str1 = "Hello ";
        String str2 = str1;
        str1 += "World";
        System.out.println(str1);
        System.out.println(str2);
    }
}
cs

 

이렇게 문자열의 경우에는 문자열이 연결될 때마다 새로운 객체를 생성하고 연결된 문자열을 다시 할당하게 됩니다.
따라서, 참조가 살아 있고 계속해서 문자열이 연결되는 로직에서는 Java의 StringBuilder를 사용해야 합니다.
한 문장에서 +연산자를 여러번 사용해도 한번만 복사가 됩니다.
그러나 반목문인 경우에는 심각한 성능 저하가 올 수 있으므로 StringBuilder의 사용도 고려해봐야 합니다.