자바에는 String, StringBuffer, StringBuilder클래스가 존재한다 String 클래스는 자바에서 가장 많이 쓰이는 만큼
제대로 알아둘 필요가 있다.
String은 변경 불가능한(immutable)클래스이다
public final class String implements java.io.Serializable, Comparable {
private final byte[] value;
.......
}
- String 클래스에는 문자열을 저장하기 위해 참조변수 byte[] value를 인스턴스 변수로 정의해 놓고 있다.
- 인스턴스 생성 시 생성자 매개변수로 입력받는 문자열은 인스턴스 변수에 문자열 배열로 저장이된다.
- 한번 생성된 String 문자열은 읽어 올 수만 있고 변경할 수는 없다.
ex)
String a = "하이";
String b = "마트";
a = a+b;
위와 같은 경우 인스턴스 내 문자열이 바뀌는 것이 아닌 새로운 문자열 "하이마트" 가 담긴 인스턴스가 생성되고
a는 "하이마트"의 값을 가진 인스턴스를 참조하게 된다.
문자열의 비교
문자열을 만들 때는 두가지 방법이 존재하는데 리터럴을 지정하는 방법과 String 클래스 생성자를 이용해 만드는 방법이 있다.
String str1 = "안녕"; //리터럴 방식
String str2 = "안녕";
String str3 = new String("안녕"); // 새로운 인스턴스 생성
String str4 = new String("안녕");
리터럴 방식은 이미 존재하는 값을 재사용하고 생성자를 이용하는 경우에는 메모리 할당이 이루어지기 때문에 인스턴스가 생성된다.
//case 1
if(str1 == str2) {
System.out.println("결과 : 같아요")
} else {
System.out.println("결과 : 달라요")
}
//case 2
if(str3 == str4) {
System.out.println("결과 : 같아요")
} else {
System.out.println("결과 : 달라요")
}
결과
결과 : 같아요
결과 : 달라요
equals를 사용하는 경우는 두 문자열의 내용을 비교하기 때문에 모두 true를 결과로 얻지만 등가비교연산자로 비교할 때는 String 각 인스턴스의 주소를 비교하기 때문에 결과가 다르다.
리터럴 방식에서 값이 같은이유는??
클래스 파일에는 소스파일에 포함된 리터럴 목록이 있는데 클래스 로더에 의해 메모리에 올러갈 때 JVM 내의 constant pool에 저장되기 때문이다 동일한 문자열이 constant pool에 존재한다면 새로 인스턴스를 생성하지 않고 constant pool의 인스턴스를 참조한다.
StringBuilder와 StringBuilder
String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer와Builder는 변경이 가능하다.
1. StringBuffer
- 내부적으로 문자열 편집을 위한 버퍼(char형 배열)를 가지고 있어 문자열을 변경할 수 있다.
- 버퍼는 문자열의 길이보다 작을 때엔 내부적으로 버퍼 크기를 증가시키는 작업이 수행됨
- 동기화를 지원해 멀티스레드 환경에서 안전하다.(Thread safe)
2. StringBuilder
- StringBuffer에서 동기화만 제거한 것으로 StringBuffer보다 속도가 빠르다.
정리
StringBuilder와 StringBuffer의 차이점은 동기화(synchronization)의 유무이다. StringBuffer는 멀티스레드 환경에서 안전하기 위해 동기화를 지원하지만, StringBuilder는 동기화를 지원하지 않는다. 그래서 StringBuilder의 속도가 더 빠르다. 만약에 멀티스레드 환경에서 문자열을 다루는 작업을 한다면 StringBuffer를 사용하는 것이 좋다.
'JAVA' 카테고리의 다른 글
[JAVA] 래퍼 클래스(Wrapper Class)란? (0) | 2024.05.31 |
---|---|
[JAVA] ENUM 이란? (0) | 2024.05.28 |
[JAVA] JVM(Java Virtual Machine) (0) | 2023.07.11 |
[JAVA] String이 불변(immutable)인 이유? (0) | 2023.04.11 |
[JAVA] 인터페이스 (0) | 2022.11.23 |